【计算机网络】TCP的延迟确认和Nagle算法
因为TCP头部开销很大,当我们每次发送的数据很小的时候,都要带着这个巨大的头部,效率很低。造成浪费为了解决这个问题,TCP采用了两种策略:Nagel算法(发送角度)延迟确认(接收角度)Nagel算法没有已发送但未确认的报文时,马上发送数据存在未确认报文时,直到没有已发送未确认报文或数据长度达到MSS大小时再发送数据只要没有满足上面两条中的一条,发送方就会一直囤积数据,直到满足条件没用Nagel算法
因为TCP头部开销很大,当我们每次发送的数据很小的时候,都要带着这个巨大的头部,效率很低。造成浪费
为了解决这个问题,TCP采用了两种策略:
-
Nagel算法(发送角度)
-
延迟确认(接收角度)
Nagel算法
-
没有已发送但未确认的报文时,马上发送数据
-
存在未确认报文时,直到没有已发送未确认报文或数据长度达到MSS大小时再发送数据
-
只要没有满足上面两条中的一条,发送方就会一直囤积数据,直到满足条件

没用Nagel算法,发送方就会将字符一个一个发送,每次都要带上TCP头部,共发送了5次,形成浪费。
使用了Nagel算法
-
第一个字符时,因为没有已发送未确认的报文,所以发送方直接发送了字母H
-
发送完H后,发送方并没有直接发送下一个字符,而是在囤积字符数据,等到字符H的确认报文回来后,没有已发送未确认的报文了,再把囤积好的数据ELL发送出去
-
最后等ELL的确认报文回来后,再发送O
此过程一共发送了3次数据,相比不使用Nagel算法更节省资源
延迟确认
因为没有携带数据的ACK报文需要带上IP头和TCP头,效率也很低
所以有了TCP的延迟确认
-
当有响应数据要发送时,ACK随着响应数据一起发送给对方
-
当没有响应数据发送时,ACK将会延迟一段时间,以等待是否有响应数据一起发送
-
如果在等待期间,对方的第二个数报文到达了,就会马上发送ACK

如果发送方开启了Nagel算法,接收方开启了延迟确认,那就会导致传输数据的耗时增加
-
发送方使用Nagel算法,先发送了一个小报文
-
接收方收到后,不立刻发送ACK,导致发送方一直在囤积数据,等待已发送报文的确认消息或者囤积数据大小达到MSS
-
接收方每次都要等待最大时间才能发送ACK,发送方只能等待收到所有ACK后才能发送数据
解决方法只有:
-
关闭发送方Nagel算法
-
关闭接收方延迟确认
更多推荐
所有评论(0)