跳转至主要内容

从OpenVOS 17.1开始,STCP支持时间戳、选择性确认和窗口缩放TCP选项。这将允许在TCP段掉线或在高带宽延迟连接(最小带宽*总延迟>65536的链路上的连接)上发送数据时更有效的数据流。这些变化的效果对应用程序来说是透明的,但在使用packet_monitor时,你应该注意一些事情。

首先,当STCP发送连接请求时,TCP(SYN)段现在将包含一个额外的16个字节。

17:41:26.533 Xmit Ether Dst 00:23:54:52:18:6e  Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID a789, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  f2f6, Src a4984dd9, Dst a4984d32
TCP from 164.152.77.217.55423 to 164.152.77.50.7777
    seq  3825990103, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum b717,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 32 2d bc 85  0  <<<4<<<< <<<2-<>
     10     0  0  0  0
2 4 5 b4 选项2(最小段大小),选项4字节的总长度,值05 b4(1460十进制)(这些字节不是新的)。
3 3 6 选项3(窗口比例),选项3的总长度为字节,值为6。
4 2 选项4(支持选择性确认),总长度为2个字节。
8 A 32 2D BC 85 0 0 0 0 0 选项8(时间戳),总长度10字节,发送时间32 2d bc 85,返回时间0 0 0 0。
0 选项0

其次,连接回复(SYN/ACK)段中发送的选项将取决于远程主机的SYN段包含的内容。STCP只有在连接请求包含选择性确认支持的选项时,才会在其回复中包含该选项。只有当连接请求也包含窗口比例和时间戳选项时,回复才会包含这两个选项。

14:31:32.145 Rcvd Ether Dst 00:00:a8:42:34:56  Src 00:00:a8:42:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID  44c, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  95e6, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.65007 to 164.152.77.217.7777
    seq  3289184624, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum 91e8,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 30 b8 95 1a  0  <<<4<<<< <<<08><
     10     0  0  0  0                                       <<<<

14:31:32.146 Xmit Ether Dst 00:00:a8:42:52:22  Src 00:00:a8:42:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    0, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  9a32, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.65007
    seq  3172667591, ack 3289184625, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum 6b81,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a  1 35 72 23 30  <<<4<<<< <<<<5r#0
     10    b8 95 1a  0                                       8><<

默认情况下,Windows主机只包括最大段大小。 窗口比例择优录取选项。如果连接请求中没有时间戳选项,STCP的回复将不包括时间戳或窗口比例选项。请注意,在窗口选项中包含的1为 NO-OP选项,并用于使选项字节数为4的整数倍。 多重的 期限STCP答复中选项末尾的(0)也是出于同样的原因。

14:54:02.635 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:23:54:52:18:6e Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   34, ID  a4f, Flg/Frg 4000, TTL 80,  Prtl  6
          Cksum  0c39, Src a4984d32, Dst a4984dd9
TCP from 164.152.77.50.13478 to 164.152.77.217.7777
    seq  3499417963, ack     n.a., window  8192, 12 data bytes, flags Syn.
    X/Off 08, Flags 02, Cksum 65c8,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b8  1  3  3  8   1  1  4  2              <<<8<<<< <<<<

14:54:02.636 Xmit Ether Dst 00:23:54:52:18:6e  Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   30, ID b3d5, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  e6b6, Src a4984dd9, Dst a4984d32
TCP from 164.152.77.217.7777 to 164.152.77.50.13478
    seq  3986949958, ack 3499417964, window  8192, 8 data bytes, flags Syn Ack.
    X/Off 07, Flags 12, Cksum 85e0,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  4  2  0  0                           <<<4<<

令人困惑的部分是在建立连接之后。下面的数据包只包含了1个字节的数据,即使是在 数据字节字段说13。前12个字节是两个NO-OP选项,后面是一个时间戳选项。前12个字节是两个NO-OP选项,后面是时间戳选项。 数据字节是末尾的0x。

15:02:36.545 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:00:a8:42:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   35, ID  447, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  95f2, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.60312 to 164.152.77.217.7777
    seq  2814493687, ack 4102208833, window   128, 13 data bytes, flags Push Ack
+.
    X/Off 08, Flags 18, Cksum c9d0,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a 2a 28 5d 8f  38 9f e0  a  0           <<<<*(]> 8>`<

如何区分期权和数据的区别?在 X/OFF值是TCP头中32位字的数量。如果没有选项,这个值是5,所以值为8表示增加3个32位字或多12个字节。

接下来这个数据包只是一个确认,它不包含任何数据。注意,偏移量又是8,所以有12个字节的选项,数据长度只有12。

15:02:39.758 Xmit Ether Dst 00:00:a8:42:52:22  Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   34, ID  48a, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  95b0, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.60312
    seq  4102208833, ack 2814493688, window   128, 12 data bytes, flags Ack.
    X/Off 08, Flags 10, Cksum a751,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a 38 a0  2 91  2a 28 5d 8f              <<<<8 <> *(]>

下面的数据包是一个包含以下内容的数据段的例子 择优录取选项,有3组确认号。注意 X/OFF值为0f,表示在TCP头中增加了40个字节((15 - 5) * 4),packet_monitor报告为 数据字节.

9:52:39.491 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP   Ver/HL 45, ToS 60, Len   50, ID   59, Flg/Frg    0, TTL 35,  Prtl  6
          Cksum  4355, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
    seq  1652086450, ack 3779437719, window  4096, 40 data bytes, flags Ack.
    X/Off 0f, Flags 10, Cksum c834,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a  2 9e 86 bd  3c 4b dd 57  1  1  5 1a  <<<<<<<< >K<W<<<<
     10    e1 45 f6 77 e1 45 f8 83  e1 45 f2 5f e1 45 f4 6b  <E<w<E<< <E<_<E<k
     20    e1 45 c9 6f e1 45 cb 7b                           <E<o<E<{

TCP头中的确认号码是连续收到的字节的最右边边缘 。选择性确认选项中的数据块表示已经收到的数据块。数据块之间的空隙代表尚未收到的字节。

如果packet_monitor能正确地报告选项,而不是把它们作为数据报告,这一切就简单多了。我们添加了一个错误stcp-2963,使packet_monitor能够做到这一点。这个错误计划在未来的版本中修复,在那之前,你需要注意X/Off的值。

窗口比例选项有可能是最令人困惑的。下面的数据包显示了一个 窗口的只有4096个字节。

9:52:38.975 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP   Ver/HL 45, ToS 60, Len   34, ID    8, Flg/Frg    0, TTL 35,  Prtl  6
          Cksum  43c2, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
    seq  1652086450, ack 3779392131, window  4096, 12 data bytes, flags Ack.
    X/Off 08, Flags 10, Cksum a3cf,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     1  1  8  a  2 9e 86 39  3c 4b dc e3              <<<<<>><K<<<

这是一个极小的窗口,但由于窗口缩放生效,所以大小有误导性。如何判断呢?唯一的方法是观察过初始连接的设置。在下面的案例中,你可以看到SYN和SYN-ACK段都包含了以下内容 窗口缩放选项,在这两种情况下,scale值都是6,所以上述片段中的4096(2^12)窗口大小被移位6位,从而得到实际的262144(2^18或256K)字节的窗口。

9:52:38.818 Rcvd Ether Dst 00:00:a8:41:34:56  Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP   Ver/HL 45, ToS 60, Len   3c, ID    5, Flg/Frg    0, TTL 35,  Prtl  6
          Cksum  43bd, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
    seq  1652086449, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum 29fd,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  2 18  3  3  6  4   2  8  a  2 9e 86 11  0  <<<<<<<< <<<<>><
     10     0  0  0  0

9:52:38.819 Xmit Ether Dst 00:13:d4:59:7a:da  Src 00:00:a8:41:34:56 Type 0800
+ (IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    a, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  3d18, Src a4984dd9, Dst 866fc8b9
TCP from 164.152.77.217.53828 to 134.111.200.185.ftp-data
    seq  3779391082, ack 1652086450, window  8192, 20 data bytes, flags Syn Ack
+.
    X/Off 0a, Flags 12, Cksum 3b87,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 3c 4b dc cf  2  <<<<<<<< <<<<<K<
     10    9e 86 11  0                                       >><

这些选项由STCP参数控制。

作为:list_stcp_params。    

STCP参数:

.. . .
最低 IP 最大段大小 [500-1480] (min_mss) 576
.. . .
最大发送窗口大小 [4096-1073725440] (max_send_ws) 1073725440
最大巨大窗口 [>=0] (max_huge_windows) 0
当前巨大的窗口0
最大256k窗口 [>=0] (max_256k_windows) 25。
目前256k的窗口0
.. . . .
TCP RFC-1323策略[禁用/允许/请求](tcp_rfc_1323_policy)请求。
TCP请求的窗口规模[0-14](tcp_window_scale)6。
TCP SACK策略 [禁用/允许/请求] (tcp_SACK_policy) 请求

作为:

tcp_rfc_1323_政策选项表示是否要使用时间戳,参数值为disable/allow/request。参数值为disable/allow/request。默认值为request表示该选项是连接请求段的一部分,如果在收到的连接请求中被请求,则该选项将成为回复段的一部分。允许的值表示该选项不会成为连接请求段的一部分,但如果收到的连接请求中包含该选项,则可能成为回复段的一部分。禁用表示该选项不会成为这两种类型的段的一部分。将该值设置为disable也表示窗口比例选项不会成为段的一部分。

tcp_window_scale选项控制缩放参数。零值告诉远程主机支持窗口缩放,但不缩放STCP的窗口。

15:48:43.409 Rcvd IP   Ver/HL 45, ToS  0, Len   3c, ID  450, Flg/Frg    0, TTL 3
+c,  Prtl  6
          Cksum  95e2, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.65410 to 164.152.77.217.7777
    seq  1987362195, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum b8b3,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 30 ca ac 69  0  <<<4<<<< <<<0J,i
     10     0  0  0  0                                                       

15:48:48.575 Xmit IP   Ver/HL 45, ToS  0, Len   3c, ID    2, Flg/Frg    0, TTL 3
+c,  Prtl  6
          Cksum  9a30, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.65410
    seq  3853608469, ack 1987362196, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum c550,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  0  4   2  8  a  1 47 89 66 30  <<<4<< < <<<<G>f0
     10    ca ac 69  0                                       J,i

tcp_sack_policy控制选择性确认选项。这些值可以是disable、allow和request,其含义与tcp_rfc_1323_policy选项完全相同。

最后,由于支持窗口缩放,因此可以拥有比以前最大64K更大的窗口,因此创建了两个新的窗口大小池。这反映在max_256k_windows和max_huge_windows池中。您可以通过设置max_256k_windows或max_huge_windows的值来调整可以发布256K窗口或更大窗口广告的最大套接字数量。

max_send_ws参数反映了现在远程主机的最大可能接收窗口是2^30(1073725440实际上是2^30-2^14)。对于一个给定的套接字,实际的最大发送窗口大小是max_send_ws参数和远程主机公布的接收窗口大小的最小值。

© 2024Stratus Technologies.