我只想提出一些建议,因为我真的不明白-为什么-是这种情况。
当服务器向其发出常规GET请求时,“ HTTP”响应的TCPDUMP输出(tcpdump -s0 -XXnni eth0 tcp端口80)进一步向下。我想做的是使用Linux u32 tc过滤器匹配TCP ack数据包的内容,查找字符串'HTTP / 1。[01] TCP ack数据包的数据有效负载中的200“(换句话说,寻找典型的“ HTTP / 1.0 200 OK”响应或“ HTTP / 1.1 200 OK”响应)。
这是tc filter命令的一个片段-这可能有助于将内容放在上下文中:
tc filter add dev eth0 parent ffff: protocol ip u32 \
match ip protocol 6 0xff \
match ip sport 80 0xffff \
match u8 0x10 0xff at 33 \
match u32 0x48545450 0xffffffff at 52 \
match u32 0x2f312e31 0xfffffffe at 56 \
match u32 0x20323030 0xffffffff at 60 \
<do something>
最后3个“ match u32”行将匹配“ HTTP / 1.0 200”或“ HTTP / 1.1 200”,而u8则匹配TCP ack标志,其他匹配源端口80协议TCP。
我的查询是-为什么在两个不同的Linux机器上,我必须将数字52、56和60更改为40、44和48?(从偏移量中减去12)。它在我家里的Slackware Linux机器上接缝,我必须使用52、56和60,而在RedHat / CentOS服务器上,我必须使用40、44和48。
这样做的原因是简单的; 比较每个服务器的这两个TCPDUMP:
Slackware: 0x0000: 0040 63c9 c3a0 0018 7d05 dd11 0800 4500 .@c.....}.....E.
0x0010: 05be d41c 0000 3606 9ea2 4266 0963 c0a8 ......6...Bf.c..
0x0020: 000a 0050 a278 e948 dcdb fa41 ac84 8010 ...P.x.H...A....
0x0030: 0059 3cb2 0000 0101 080a 9380 9172 0008 .Y<..........r..
0x0040: 3bea 4854 5450 2f31 2e31 2032 3030 204f ;.HTTP/1.1.200.O
RedHat or: 0x0000: 0016 3e32 3fcf 0010 dbff 2050 0800 4500 ..>2?......P..E.
CentOs: 0x0010: 0554 cf64 0000 3706 e08b 4266 0969 0a64 .T.d..7...Bf.i.d
0x0020: 7881 0050 b316 c917 2062 b4a8 cff4 5018 x..P.....b....P.
0x0030: 005a a17f 0000 4854 5450 2f31 2e31 2034 .Z....HTTP/1.1.4
0x0040: 3034 204e 6f74 2046 6f75 6e64 0d0a 436f 04.Not.Found..Co
如您所见,在两种情况下,“ HTTP”部分开始的偏移点(包数据有效负载)是不同的。为什么是这样?会导致什么呢?
在此先感谢任何可以向我解释这个奥秘的人。