我正在遵循一个指南 https://www.securitynik.com/2015/08/calculating-udp-checksum-with-taste-of_3.html
50 C7 BF 65 B5 CA 70 F3 95 00 A0 AF 08 00 45 00 00 28 3F 1C 40 00 80 06 00 00 C0 A8 01 A3 D2 F2 F3 65 C2 00 1A 4C 9F 5E 98 B7 70 8A A9 B8 50 10 40 18 88 BE 00 00
这是我的包裹。
源IP 192.168.1.163 1100 0000 1010 1000 C0 A8
0000 0001 1010 0011 01 A3
dest IP 210.242.243.101 1101 0010 1111 0010 D2 F2
1111 0011 0110 0101 F3 65
TCP pro 0/6 0000 0000 0000 0110 00 06
填充 长度0000 0000 0001 1110 00 14? (不确定)
S端口49664 1100 0010 0000 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 总和:5 86 49 添加第一个字节:86 4E 二进制:1000 0110 0100 1110 翻转位:0111 1001 1011 0001 我的校验和是79 B1 但数据包校验和为88 BE
我不确定的唯一信息是填充长度..解释得不好..我的理解是..要么是
通过添加标头长度(在这种情况下为20字节+任何有效载荷字节..在我的情况下没有..所以十六进制的14是20 dec ..或可能在其上添加标志号.. 20) + 10是30 ..我也尝试了两种,校验和仍然不匹配?
我的数学错了吗?或逻辑错误。
感谢您的帮助。
切尔文。
答案 0 :(得分:0)
IPv4使用校验和来检测网络层上数据包头的损坏。 TCP在传输层应用了一个额外的校验和,以保护数据包有效载荷,作为IP报头校验和的补充。在TCP校验和计算之前创建12字节的TCP伪头。 TCP伪报头长度包括源地址(4个字节),目的地址(4个字节),保留(1个字节),协议(1个字节),TCP段长度(2个字节)。
将12字节/ 96位的伪标头放置在TCP段之前,然后,对整个数据集(伪标头加上TCP段)计算校验和。校验和的值放置在TCP标头的Checksum字段中,而伪标头则被丢弃。
TCP和IPv4校验和的计算算法相同。一次处理数据16位或2字节,并使用1补码算法将这16位作为字相加。在添加的最后,通过不使用二进制而不以二进制补码求反,结果由源端点存储在TCP头中。在目标端点,通过将校验和设置为零来重复相同的计算。
您可以尝试使用以下实用工具class
中的方法来计算它public static short checksum( byte[] source ,byte[] destination ,byte protocol,
short length ,
byte[] message ,
int offset )