计算tcp包校验和

计算tcp包校验和,tcp,packet,Tcp,Packet,我在跟随一位导游 50 C7 BF 65 B5 CA 70 F3 95 00 A0 AF 08 00 45 00 28 3F 1C 40 00 80 06 00 C0 A8 01 A3 D2 F2 F3 65 C2 00 1A 4C 9F 5E 98 B7 70 8A A9 B8 50 40 18 88 BE 00 00 这是我的包 源Ip 192.168.1.163 1100 0000 1010 1000 C0 A8 0000 0001 1010 0011 01 A3 目的地IP 210.2

我在跟随一位导游

50 C7 BF 65 B5 CA 70 F3 95 00 A0 AF 08 00 45 00 28 3F 1C 40 00 80 06 00 C0 A8 01 A3 D2 F2 F3 65 C2 00 1A 4C 9F 5E 98 B7 70 8A A9 B8 50 40 18 88 BE 00 00

这是我的包

源Ip 192.168.1.163 1100 0000 1010 1000 C0 A8 0000 0001 1010 0011 01 A3
目的地IP 210.242.243.101 1101 0010 1111 0010 D2 F2 1111001010101 F3 65

TCP pro 0/6 0000 0110 00 06

填充物 长度0000 0000 0001 1110 00 14?(不确定)

S端口49664 1100 0010 0000 C2 00

D端口6732 0001 1010 0100 1100 1A 4C

序号2673776823 1001 1111 0101 1110 9F 5E 1001 1000 1011 0111 98 B7

Ack#1888135608 0111 0000 1000 1010 70 8A 1010 1001 1011 1000 A9 B8

旗帜#0101 0000 0001 0000 50 10

窗口#16408 0100 0000 0001 1000 40 18 总数:58649 添加第一个字节:86 4E 二进制:1000 0110 0100 1110 翻转钻头:01111001010001 我的校验和是79 B1 但是数据包校验和是88

我唯一不确定的信息是填充长度。。没有很好的解释。。我的理解是。。要么是

通过添加标头长度(在本例中为20字节+任何有效负载字节)。。在我的情况下没有。。所以十六进制中的14是12月20日。。或者可能会在上面加上旗号。。哪个20+10等于30。。我也试过了,但校验和还是不匹配

我的数学错了吗?或者逻辑错误

谢谢你的帮助


Chelvan.

IPv4使用校验和检测网络层的数据包头损坏。TCP在传输层应用一个额外的校验和来保护数据包负载,作为IP报头校验和的一个附加。12字节TCP伪头在TCP校验和计算之前创建。TCP伪头长度包括源地址(4字节)、目标地址(4字节)、保留地址(1字节)、协议(1字节)、TCP段长度(2字节)

伪头作为12字节/96位放在TCP段之前,然后对整个数据集(伪头加TCP段)计算校验和。校验和的值被放入TCP头的校验和字段中,伪头被丢弃

TCP和IPv4校验和的计算算法相同。一次处理16位或2个字节的数据,并使用“1”补码算法将16位作为字相加。在加法结束时,通过取二进制not,结果在1的补码中被求反,结果由源端点存储在TCP头中。在目标端点,通过将checkum设置为零,重复相同的计算

您可以尝试使用此实用程序中的以下方法计算它

public static short checksum( byte[] source ,byte[] destination ,byte protocol,
                              short  length ,
                              byte[] message ,
                              int offset )