TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

滑动窗口

参考

TCP协议的滑动窗口具体是怎样控制流量的?

TCP/IP详解


正文

流量控制

在接收方跟不上发送方的时候,会强迫发送方慢下来,这称为流量控制。流量控制通常有两种形式:

1 基于速率流量控制:给发送方指定某个速率,同时确保速率永远不会超过这个速率发送

2 基于窗口流量控制:使用滑动窗口(sliding window)

滑动窗口

TCP是全双工的协议,每一方都可以收发数据。连接的收发数据量是根据一组窗口结构维护的。

报文头.jpg

windows是一个16bit字段,代表滑动窗口的大小,默认最大是65535,可以根据option-kind,option-lenth,option-data进行扩厂。

每个TCP报文段(除了连接建立之初的包交换)都包含一个有效的序列号字段,一个ACK号或确认字段,以及一个窗口大小:

滑动窗口win.png

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来阻止发送方继续发送。

注意

当发送方窗口 > 接收方窗口:接收方的能力限制发送方的窗口大小

当发送方窗口 < 接收方窗口:是网络拥塞限制发送方的窗口大小

零窗口演示

tcp-零窗口.png

整个程序的逻辑:服务端accept后不recv,客户端一直发数据,最后客户端(发送方)窗口满,服务端(接收方)返回零窗口,客户端不再发送数据给服务端。

报文如下:

链接:https://pan.baidu.com/s/1Drh4_I42s0WIyebAvFvU5A 
提取码:lti3 
复制这段内容后打开百度网盘手机App,操作更方便哦

滑动窗口的作用

  • 提供TCP的可靠性(依赖确认ack重传)
  • 提供TCP的流控特性(第二种流量控制)

ending

79810064_p0_master1200.jpg

----------- ending -----------