TCP中的Nagle算法

 一,Nagel算法

                        TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接受到数据,也需要发送ack表示确认。为了尽可能利用网络带宽,TCP总是希望尽可能发送足够大的数据。(在一个连接中会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥这许多小数据块。

                         Nagle算法的基本定义式任意时刻,最多只能有一个未被确认的小段。所谓"小段",指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

                         Nagle算法的规则:

                         (1)如果包长度达到MSS,则允许发送;

                         (2)如果该包含有FIN,则允许发送;

                         (3)设置了TCP_NODELAY选项,则允许发送

                         (4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;

                         (5)上述条件都未满足,但发生了超时(一般为200ms),则立刻发送。

                          Nagle算法只允许一个未被ACK的包存在于网络中,它不管包的大小,因此它事实上是一个扩展的停-等协议,只不过它是基于包停-等的,而不是基于字节停-等的。

Nagle算法完全由TCP协议的ACK机制决定,这会带来一些问题,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,网络总体利用率依然很低。

                         TCP确认延迟机制。当Server端收到数据之后,它并不会向client端发送ACK,而是将ACK的发送延迟一段时间,它希望在t时间内server端会向client端发送应答数据,这样ACK就能够和应答数据一起发送过去,就像应答数据捎带着ACK过去。

你可能感兴趣的:(网络编程)