tcp/ip的checksum计算步骤及方法请见如下链接:
以太网Checksum-TCP/IP手算拆解教学-CSDN博客
1、UDP数据结构如图
在计算UDP首部校验和时,计算范围包括了伪首部、UDP首部、UDP数据报,其中各个部分数据容量如下:
伪首部—---------12字节=48字符
其中
源IP地址---------4字节=16字符
目的IP地址----—4字节=16字符
协议-----------—1+1字节=4+4字符=8字符
UDP长度---------2字节=8字符
UDP首部---------8字节=32字符
UDP数据报的长度取决于底层协议的限制长度=底层限制长度总字节-IP首部字节-UDP首部字节
以上三部分均是checksum的计算范围,均需参与计算;
2、UDP的首部校验和Checksum不仅对IP首部的部分数据进行计算,还对UDP首部以及UDP数据报进行计算;
3、发送端的UDP首部校验和在计算时,将首部校验和看作为0x0000来计算;
4、在计算首部校验和时按照每16位字符为1个单位进行累加;
5、发送端用wireshark截取1帧UDP报文,并将IP首部数据和UDP首部数据以及UDP数据报详细展开来:
6、如上1帧UDP报文的首部校验和Checksum计算步骤如下:
6.1、先对伪首部进行相加:
(源IP地址前16位) |
| ac1f | |
(源IP地址后16位) |
| 812e | |
(目的IP地址前16位) |
| ffff | |
(目的IP地址后16位) |
| ffff | |
(协议号) |
|
| 0011 |
(UDP长度) |
|
| 0031 |
伪首部sum=ac1f+812e+ffff+ffff+0011+0031
6.2、再将UDP首部相加,其中首部校验和默认是0000:
(源端口) |
|
| 3458 |
(目的端口) |
|
| 3458 |
(UDP长度) |
|
| 0031 |
(检验和) |
|
| 0000 |
UDP首部sum=3458+3458+0031+0000
6.3、再将UDP数据报进行相加,注意了,如果数据报出现奇数字节,则需要后面补0:
(UDP数据报总长) | 02fd000400000021ffffffffffffffffffffffffffffffffff00013ca9f4b46177540671a0a20a0000 |
|
(UDP数据报第1个) | 02fd | 02fd |
(UDP数据报第2个) | 0004 | 0004 |
(UDP数据报第3个) | 0000 | 0000 |
(UDP数据报第4个) | 0021 | 0021 |
(UDP数据报第5个) | ffff | ffff |
(UDP数据报第6个) | ffff | ffff |
(UDP数据报第7个) | ffff | ffff |
(UDP数据报第8个) | ffff | ffff |
(UDP数据报第9个) | ffff | ffff |
(UDP数据报第10个) | ffff | ffff |
(UDP数据报第11个) | ffff | ffff |
(UDP数据报第12个) | ffff | ffff |
(UDP数据报第13个) | ff00 | ff00 |
(UDP数据报第14个) | 013c | 013c |
(UDP数据报第15个) | a9f4 | a9f4 |
(UDP数据报第16个) | b461 | b461 |
(UDP数据报第17个) | 7754 | 7754 |
(UDP数据报第18个) | 0671 | 0671 |
(UDP数据报第19个) | a0a2 | a0a2 |
(UDP数据报第20个) | 0a00 | 0a00 |
(UDP数据报第21个) | 00 | 0000 |
UDP数据报sum=02fd+0004+0000+0021+ffff+ffff+ffff+ffff+ffff+ffff+ffff+ffff+ff00+013c+a9f4+b461+7754+0671+a0a2+0a00+0000
6.4、将三部分累加起来:
UDPsum=伪首部sum+UDP首部sum+UDP数据报sum=f2080
6.3、IP首部数据的sum结果是f 2080,属于溢出状态,则需进行回滚计算:
将溢出的结果拆成000f和2080,两者进行回滚相加:
carry=000f+2080=208f
6.4、最终对carry后的数据取反得到checksum结果:
checksum=ffff-208f=df70
7、excel版本自动计算公式如下:
手算excel.xls在下面链接下载即可