因为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算法

  • 关闭接收方延迟确认

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐