从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参数和远程主机公布的接收窗口大小的最小值。