参考
正文
流量控制
在接收方跟不上发送方的时候,会强迫发送方慢下来,这称为流量控制。流量控制通常有两种形式:
1 基于速率流量控制:给发送方指定某个速率,同时确保速率永远不会超过这个速率发送
2 基于窗口流量控制:使用滑动窗口(sliding window)
滑动窗口
TCP是全双工的协议,每一方都可以收发数据。连接的收发数据量是根据一组窗口结构维护的。
windows是一个16bit字段,代表滑动窗口的大小,默认最大是65535,可以根据option-kind,option-lenth,option-data进行扩厂。
每个TCP报文段(除了连接建立之初的包交换)都包含一个有效的序列号字段,一个ACK号或确认字段,以及一个窗口大小:
clint->server:
31:31:31:0d:0a //frame number 56
32:32:32:0d:0a //frame number 67
发送方发了2次数据,每次5个字节,服务方回复6,11表示期待的下一个节点,通过此方法保证可靠传输
从图中也可以看出发送方窗口和接收方窗口的大小
接收方窗口
发送方窗口
发送方滑动窗口大小SND.WND = SND.UNA + SND.WND
如图所示,当4,5字节报文发送给接收方并收到接收方的ack=6,则发送方的滑动窗口右移:
[4-9] -> [6-11]
这是在SND.WND不变的情况下,实际上SND.WND可能是根据实际情况变化的。这个右移的过程是即将发送(可用窗口)变大的过程。如果发送者一直发,但收不到ack,或者ack的序号不对,则可用窗口变小,已发送未经确认窗口变大,直到接收方窗口已满
,接收方会发给发送方调整窗口大小为0来阻止发送方继续发送。
注意
当发送方窗口 > 接收方窗口:接收方的能力限制发送方的窗口大小
当发送方窗口 < 接收方窗口:是网络拥塞限制发送方的窗口大小
零窗口演示
整个程序的逻辑:服务端accept后不recv,客户端一直发数据,最后客户端(发送方)窗口满,服务端(接收方)返回零窗口,客户端不再发送数据给服务端。
报文如下:
链接:https://pan.baidu.com/s/1Drh4_I42s0WIyebAvFvU5A
提取码:lti3
复制这段内容后打开百度网盘手机App,操作更方便哦
滑动窗口的作用
- 提供TCP的可靠性(依赖确认ack重传)
- 提供TCP的流控特性(第二种流量控制)