2. TCP窗口缩放选项
2. TCP窗口缩放选项 (TCP Window Scale Option)
2.1 简介 (Introduction)
窗口缩放扩展将TCP窗口的定义扩展到32位,然后使用缩放因子在TCP头的16位窗口字段(RFC-793中的SEG.WND)中携带这个32位值。缩放因子在新的TCP选项窗口缩放 (Window Scale) 中携带。此选项仅在SYN段(具有SYN位的段)上发送,因此在打开连接时每个方向的窗口缩放都是固定的。(另一个设计选择是在每个TCP段中指定窗口缩放。仅在缩放因子更改时发送窗口缩放选项是不正确的,因为确认段中的TCP选项不会可靠传递(除非ACK恰好在另一个方向的数据上捎带)。在打开连接时固定缩放具有较低开销的优点,但缺点是在连接期间无法更改缩放因子。)
最大接收窗口,因此缩放因子,由最大接收缓冲区空间确定。在典型的现代实现中,此最大缓冲区空间默认设置,但可以在打开TCP连接之前由用户程序覆盖。这决定了缩放因子,因此窗口缩放不需要新的用户接口。
2.2 窗口缩放选项 (Window Scale Option)
三字节的窗口缩放选项可以由TCP在SYN段中发送。它有两个目的:(1) 表示TCP准备好进行发送和接收窗口缩放,以及 (2) 传达要应用于其接收窗口的缩放因子。因此,准备缩放窗口的TCP应该发送该选项,即使其自己的缩放因子为1。缩放因子限制为2的幂并以对数方式编码,因此可以通过二进制移位操作实现。
TCP窗口缩放选项 (WSopt):
Kind: 3 Length: 3字节
+---------+---------+---------+
| Kind=3 |Length=3 |shift.cnt|
+---------+---------+---------+
此选项是一个提议,而不是承诺;双方都必须在其SYN段中发送窗口缩放选项,以在任一方向启用窗口缩放。如果启用了窗口缩放,则发送此选项的TCP将其真实的接收窗口值右移'shift.cnt'位以在SEG.WND中传输。'shift.cnt'的值可以为零(提议缩放,同时对接收窗口应用缩放因子1)。
此选项可以在初始<SYN>段(即具有SYN位且没有ACK位的段)中发送。它也可以在<SYN,ACK>段中发送,但仅当在初始<SYN>段中接收到窗口缩放选项时。在没有SYN位的段中的窗口缩放选项应被忽略。
SYN段(即<SYN>或<SYN,ACK>)中的窗口字段本身永远不会被缩放。
2.3 使用窗口缩放选项 (Using the Window Scale Option)
窗口缩放的模型实现如下,使用RFC-793的符号:
-
所有窗口在连接控制块中存储和本地计算时都被视为32位量。这包括发送窗口 (SND.WND) 和接收窗口 (RCV.WND) 值,以及拥塞窗口。
-
连接状态由两个窗口移位计数增强,Snd.Wind.Scale和Rcv.Wind.Scale,分别应用于传入和传出的窗口字段。
-
如果TCP接收到包含窗口缩放选项的
<SYN>段,它会在<SYN,ACK>段中发送自己的窗口缩放选项。 -
窗口缩放选项与shift.cnt = R一起发送,其中R是TCP希望用于其接收窗口的值。
-
在接收到包含shift.cnt = S的窗口缩放选项的SYN段时,TCP将Snd.Wind.Scale设置为S并将Rcv.Wind.Scale设置为R;否则,它将Snd.Wind.Scale和Rcv.Wind.Scale都设置为零。
-
除SYN段外,每个传入段的头中的窗口字段 (SEG.WND) 在更新SND.WND之前左移Snd.Wind.Scale位:
SND.WND = SEG.WND << Snd.Wind.Scale(假设满足RFC793的其他条件,并使用"C"符号"<<"表示左移)。
-
除SYN段外,每个传出段的窗口字段 (SEG.WND) 右移Rcv.Wind.Scale位:
SEG.WND = RCV.WND >> Rcv.Wind.Scale.
TCP通过测试段的序列号是否在窗口左边缘的231字节内来确定数据段是"旧"还是"新",如果不是,则将数据作为"旧"丢弃。为了确保新数据永远不会被错误地视为旧数据,反之亦然,发送方窗口的左边缘距离接收方窗口的右边缘最多必须是231。同样,发送方的右边缘和接收方的左边缘也是如此。由于发送方或接收方窗口的右边缘和左边缘相差窗口大小,并且由于发送方和接收方窗口最多可以相差窗口大小,因此上述约束意味着2倍的最大窗口大小必须小于2**31,即
max window < 2**30
由于最大窗口是2S(其中S是缩放移位计数)乘以最多216 - 1(最大未缩放窗口),因此如果S <= 14,则保证最大窗口< 230。因此,移位计数必须限制为14(允许230 = 1 GB的窗口)。如果接收到shift.cnt值超过14的窗口缩放选项,TCP应记录错误但使用14而不是指定的值。
缩放因子仅适用于TCP头中传输的窗口字段;使用扩展窗口的每个TCP将在本地将窗口值维护为32位数字。例如,由慢启动和拥塞避免计算的"拥塞窗口"不受缩放因子的影响,因此窗口缩放不会在拥塞窗口中引入量化。