我使用原始套接字在Python中编写TCP RST
数据包。为此,我在RST
标志中写入1,在其余标志上写入0,将windows字段设置为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,但我不明白为什么。
答案 0 :(得分:1)
问题出在TCP标头中。 data offset
字段(它在RFC中调用的内容,但它通常也称为header length
),您已设置为10(0xa0的第一个半字节)在数据包转储中的偏移量0x20处)。这是TCP标头中32位字的数量 - 或TCP有效负载的偏移量。在这种情况下,它应该是5(20字节)。
40太长,因为IP头已经指定了数据包的总长度,因此IP头之后只剩下20个字节。