我正在用Python编程一个使用原始套接字的TCP RST
数据包。为此,我在RST
标记中写1,在其余标记上写0,将窗口字段设置为0,将紧急字段设置为0。然后我交换源端口和目的端口。之后,我重新计算数据包大小并创建IP
标头,现在具有正确的总长度IP字段。
数据包看起来很好,但这是我在tcpdump中看到的:
IP host-11-0-0-10.http > host-11-0-0-9.37516: Flags [R] [bad hdr length 40 - too long, > 20]
0x0000: 4500 0028 9ffc 4000 4006 84ad 0b00 000a
0x0010: 0b00 0009 0050 928c 554c 31d8 0000 0000
0x0020: a004 0000 f9b3 0000
据我所见,IP长度是正确的(0028 ==> 40字节==> 20字节IP和20字节TCP)。这就好像它相信整个报头是IP或TCP,但我不明白为什么。
TCP报头有问题。data offset
字段(这就是RFC中所称的,但它也经常被称为header length
),您已设置为10(在数据包转储中偏移量0x20处的第一个0xa0)。这是TCP报头中32位字的数量——或者TCP有效负载的偏移量。在本例中,它应该是5(20字节)。
40太长,因为IP报头已经指定了数据包的总长度,因此IP报头之后只剩下20个字节。