任何人都可以建议我如何验证TCP / IP数据包校验和?

时间:2018-01-22 05:05:38

标签: tcp ip checksum

我有一个我为SYN/ACK手动创建的数据包,但我没有得到服务器的回复。 这是所有无线/ GSM的东西,所以我不能使用嗅探器。

我已经手动计算了TCPIP header校验和几次,看起来它们是正确的,但我确实需要第三方方法才能确定。 我有几个endian问题,但我想我现在已经有了。但谁知道......

我只找到了一个在线解析器,但它没有测试/验证校验和。

有人对我有一个简单的想法吗?

以防万一有人适合访问测试方法,感觉就像为我粘贴一样,这是数据包:

45 10 00 3C 00 02 00 00 64 06 E8 1F 0A AA 61 43 51 8A B1 13 
01 BB 01 BB 00 00 00 0A 00 00 00 00 50 02 00 00 3D D8 00 00

此致 berntd

2 个答案:

答案 0 :(得分:0)

我使用Net :: PcapWriter:

从你的十六进制数据创建一个pcap
use strict;
use warnings;
use Net::PcapWriter;

my $w = Net::PcapWriter->new('test.pcap');
my $ip = pack('H*','4510003C000200006406E81F0AAA6143518AB11301BB01BB0000000A00000000500200003DD80000');
$w->packet($w->layer2prefix('1.1.1.1').$ip);

将其加载到Wireshark中会将IP校验和和TCP校验和显示为正确,因此这可能不是校验和计算的问题。

但是tcpdump说长度错了:

IP truncated-ip - 20 bytes missing! 10.170.97.67.443 > 81.138.177.19.443: Flags [S], seq 10:30, win 0, length 20

这是因为您已将IP标头中的总长度设置为60字节(00 3C),但IP标头+ TCP标头总共只有40个字节,而您的数据包没有任何有效负载,即总长度应为40而不是60字节。

答案 1 :(得分:0)

以下是我想出的手动方式:

将数据包放入文本文件中,如下所示:

45 10 00 3C 00 02 00 00 64 06 E8 1F 0A AA 61 43 51 8A B1 13 
01 BB 01 BB 00 00 00 0A 00 00 00 00 50 02 00 00 3D D8 00 00

将十六进制转储中的寻址偏移和组添加到16字节行中:

000000 45 10 00 3C 00 02 00 00 64 06 E8 1F 0A AA 61 43 
000010 51 8A B1 13 01 BB 01 BB 00 00 00 0A 00 00 00 00 
000020 50 02 00 00 3D D8 00 00

保存(来源)。

现在运行ext2pcap.exe -e 0x800 source dest 现在可以将dest文件作为PCAP文件导入wireshark进行解码。

可以通过在源文件中再次为000000开始每个新数据包的地址偏移来转换多个数据包。

text2pcap.exe似乎附带了wireshark。

乏味但有效。 干杯