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号就是窗口最左 。
文章插图
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的数据 。
- 在收到对端数据后,接收窗口会减少;在应用层读走数据后,接收窗口会增加 。但是并不是每次增减都会通告到对端,因为这样会出现糊涂窗口综合症 。
文章插图
12.7.5 糊涂窗口综合症12.7.5.1 概念TCP协议栈基于滑动窗口动态调整机制进行流量控制会导致一种被称为“糊涂窗口综合症SWS (Silly WindowSyndrome)"的状况 。
糊涂窗口综合症SWS:当TCP接收方通告了一个小窗口,并且TCP发送方立即发送数据填充该小窗口时,就会产生糊涂窗口,有效载荷比例降低 。
当TCP的双方都是以小窗口通告和小报文段发送来实现通信,会使TCP数据流包含很多非常小的报文段,而不是满长度的报文段;而小单元报文段中IP首部和TCP首部这些字段占了大部分空间,会导致真正有效的TCP数据却很少,因此小报文的传输浪费了网络的大量带宽,从而网络性能严重下降 。
12.7.5.2 原因糊涂窗口综合症可以由TCP连接双方中的任何一方引起:
- 接收方:接收方通告一个小的窗口(而不是一直等到有大的窗口时才通告) 。
- 发送方:发送方发送少量的数据(而不是等待更多的数据以便发送一个大的报文段) 。
- 接收方不通告小窗口 。通常的算法是在窗口增大一个MSS或者增大到缓冲区一半之前,接收方不通告一个比当前窗口大的窗口(宁可为0) 。
- 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:
- 需要发送的数据是一个满长度(MSS)的报文段,可发送 。
- 需要发送的数据长度大于等于接收通告窗口值的一半时,可发送 。
- 没有飞行数据时(即是没有已发送但是未收到ACK的数据时),可发送 。
经验总结扩展阅读
- 哪个星座是是天蝎座的情劫
- 水表最后一位红色是1吨还是0.1吨
- 龙舌兰酒为什么不能直接喝
- 长虫是什么动物
- 烈火军校董小姐扮演者是谁?
- 牛仔裤38码是多少尺?
- 小丑女的电影是哪一个?
- 唐艺昕演的穿越剧叫什么名字?
- 霉茶叶有什么用途
- bollycon是哪个国家的美瞳品牌?