【lwip】12-一文解决TCP原理( 五 )


TCP的选项字段中还包含了一个TCP窗口扩大因子,option-kind为3,option-length为3个字节,option-data取值范围0-14 。
窗口扩大因子用来扩大TCP窗口,可把原来16bit的窗口,扩大为31bit 。具体在TCP选项字段分析 。
12.7.2 拥塞窗口拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制 。
拥塞窗口和发送窗口去MIN值,就是实际能发送的窗口大小 。
12.7.3 发送窗口参考LWIP:TCP 控制块中关于发送窗口的成员变量有 lastack、snd_nxt、snd_lbb、snd_wnd:

  • lastack 记录了已经确认的最大序号;
  • snd_nxt 表示下次要发送的序号;
  • snd_lbb 是表示下一个将被应用线程缓冲的序号;
  • snd_wnd 表示发送窗口的大小 。
通过上面的几个参数就知道发送窗口的信息,如下图:
  • 发送窗口是TCP层当前可以发送的SEQ号段 。
  • 窗口snd_wnd如果填满了数据,则不能在发送了,等发送窗口往右移动时,才能发送新数据 。
  • 而窗口内的数据可以有已经被ACK的,只是最小未被ACK的SEQ号就是窗口最左 。

【lwip】12-一文解决TCP原理

文章插图
12.7.4 接收窗口参考LWIP:TCP 控制块中关于接收窗口的成员变量有 rcv_nxt、rcv_wnd、rcv_ann_wnd、rcv_ann_right_edge:
  • rcv_nxt:下次期望接收到的数据SEQ;
  • rcv_wnd:接收窗口的大小;
  • rcv_ann_wnd:窗口大小通告值,即是告诉发送方窗口的大小;
  • rcv_ann_right_edge:记录了窗口的右边界 。
通过上面的几个参数就知道发送窗口的信息,如下图:
  • 接收窗口是TCP层当前能够接收的数据段,用于流量控制 。一般用接收窗口右边界表示当前能接收到的最大SEQ号-1的数据 。
  • 在收到对端数据后,接收窗口会减少;在应用层读走数据后,接收窗口会增加 。但是并不是每次增减都会通告到对端,因为这样会出现糊涂窗口综合症 。

【lwip】12-一文解决TCP原理

文章插图
12.7.5 糊涂窗口综合症12.7.5.1 概念TCP协议栈基于滑动窗口动态调整机制进行流量控制会导致一种被称为“糊涂窗口综合症SWS (Silly WindowSyndrome)"的状况 。
糊涂窗口综合症SWS:当TCP接收方通告了一个小窗口,并且TCP发送方立即发送数据填充该小窗口时,就会产生糊涂窗口,有效载荷比例降低 。
当TCP的双方都是以小窗口通告和小报文段发送来实现通信,会使TCP数据流包含很多非常小的报文段,而不是满长度的报文段;而小单元报文段中IP首部和TCP首部这些字段占了大部分空间,会导致真正有效的TCP数据却很少,因此小报文的传输浪费了网络的大量带宽,从而网络性能严重下降 。
12.7.5.2 原因糊涂窗口综合症可以由TCP连接双方中的任何一方引起:
  • 接收方:接收方通告一个小的窗口(而不是一直等到有大的窗口时才通告) 。
  • 发送方:发送方发送少量的数据(而不是等待更多的数据以便发送一个大的报文段) 。
12.7.5.3 解决解决措施: