TCP详解(三):TCP流量控制——Flow Control

系列文章

TCP详解(一):什么是TCP

TCP详解(二) : TCP三次握手、四次挥手

TCP详解(三):TCP流量控制——Flow Control

TCP详解(四):TCP拥堵控制——Congestion Control

TCP详解(五):TCP与UDP的区别

本篇目录

什么是TCP流量控制

TCP流量控制的实现机制

Receiver window的含义及计算公式

窗口探测

总结


什么是TCP流量控制

两个应用程序通过TCP协议在网络中传输数据时,双方在硬件性能和软件性能上均可能存在差异,导致双方处理数据的速度不一致。当发送方的发送速度低于接收方接的处理速度时,不会出现问题。而当发送方的发送速度高于接收方的处理速度时,接收方会抛弃暂时无法“安置”的数据包。由于这些丢弃的数据包得不到确认,发送方会重新发送它们,直到他们被成功接收,造成资源浪费。TCP流量控制就是确保发送方的发送速度不要超出接收方的处理能力。

TCP流量控制的实现机制

发送发和接收方都维护一个数据池来处理数据,称之为Buffer。发送方不断地将要发送的数据送入sender buffer,接收方不断地从receiver buffer里获取数据。

当接收方的receiver buffer已满时,发送方则暂时停止发送数据。那么发送方如何获知这一信息呢?答案是通过ack数据包的window size字段。在TCP详解(一):什么是TCP中,我们说过,接收方每成功接收一个TCP数据包(即segment),都会回发一个确认的数据包,其中确认包的window size会通知发送方,目前接收方的receiver buffer还能容纳多少数据,一旦window size == 0,发送方立即停止发送数据。

Receiver window的含义及计算公式

receiver window指的是当前接收方能够连续不断接收数据量的最大值,也就是receiver buffer空闲区的大小。接收方应用程序不断地从receiver buffer里取走数据,receiver buffer也不断地从TCP发送方接收数据,所以receiver window的大小是不断动态变化的。当receiver window == 0,则表示receiver buffer已满,此时如果仍有数据包到来会直接抛弃。

receiver window的计算公式如下:

last byte received表示receiver buffer目前为止收到的最后一个字节的编号,last byte read表示receiver buffer被接收方应用程序已经取走的最后一个字节的编号,(LastByteReceived – LastByteReadByApplication)则表示receiver buffer中未被取走的数据量大小。那么 ReceiveBuffer - (LastByteReceived – LastByteReadByApplication)就是receiver buffer空闲区域的大小,也就是receiver window的大小。

窗口探测

当receiver buffer 收到一个数据包后,发现buffer已满,然后回发一个ack确认包表示成功收到该数据,并把确认包的window size设置为0。TCP发送方收到该确认包后,停止发送数据并等待恢复发送的通知(window size !=0 的ack包)。TCP接收方这边,由于已经对所有成功接收的数据都回发了确认包,所以在没有收到新的数据包前,并不会回发确认包给TCP发送方。虽然随着接收方应用程序不断取走TCP接收方receiver buffer中的数据,receiver buffer出现空闲区,TCP发送方却一直无从得知。这样双方互相等待,形成死锁。

窗口探测,即WindowProbe,指的是,当TCP发送方收到window size == 0的通知而停止发送数据后,会启动一个持久化的定时器,定期发送一个数据量很小的数据包(因为主要作用是侦测,没有实际需要传输的业务数据),侦测window size的大小。当某个侦测包的确认包中window size != 0时,TCP发送方恢复发送实际数据。

总结

  1. TCP流量控制机制就是确保发送方发送数据的速度不要超出接收方的处理能力
  2. TCP接收方回发的每一个ack确认包,window size字段都会注明当前receiver window的大小
  3. receiver window的计算公式为:rwnd = ReceiveBuffer - (LastByteReceived – LastByteReadByApplication)
  4. TCP接收方收到window size == 0的通知后,会停止发送数据,并开启定时器定期发送侦测包侦测window size的大小,当window size != 0时,恢复发送实际数据。

下一篇:TCP详解(四):TCP拥堵控制——Congestion Control

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vincent(朱志强)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值