快捷搜索: 王者荣耀 脱发

TCP、UDP 检验和与IP检验和的概念及计算

关于校验,感觉大家和我一样一直对这个概念很模糊,对一些细节还不是很了解!所以就写了一篇博客,总结一下检验和的知识,也加深一下印象!

1.1、IP首部

1.2、TCP/UDP报文格式

2.1、IP检验和的计算

    Ip校验是针对ip头部的,即仅校验ip头部,而对于ip数据部分的校验,则交由相应的四次协议来保证, ip 头部中校验和字段为16bit。 计算原理如下:
  1. 把校验和字段设置为0
  2. 计算ip头部中所有16bit的字之和
  3. 将2中得到的和按位取反,得到校验和。

2.2、TCP检验和的计算原理对于ip层协议来说,其检验和只要计算ip头即可,那相对的,对于四层协议来说,其检验和则需要计算四层头部与四层数据。

    TCP校验需要将IP伪首部、TCP报头、TCP数据分为16位的字,然后进行累加(如果总长度为奇数个字节,则在最后增添一个位都为0的字节 ),最后对累加的和进行按位取反即可。 IP伪首部包括源ip地址(4字节)、目的ip地址(4字节)、协议号(两字节)、tcp包长(2字节),共14字节。

2.3、UDP检验和的计算原理

    UDP校验与TCP校验基本上是一致的。 UDP校验需要将IP伪首部、UDP报头、UDP数据分为16位的字,然后进行累加(如果总长度为奇数个字节,则在最后增添一个位都为0的字节 ),最后对累加的和进行按位取反即可。 IP伪首部包括源IP地址(4字节)、目的IP地址(4字节)、协议号(2字节)、TCP包长(2字节) ,共12字节。

以上就是IP、TCP、UDP的校验和的计算原理,如果是我们自己写相应的校验和函数,问题也不是太大,只要根据其计算原理即可。

3、计算检验和(checksum)的过程很关键,主要分为以下几个步骤:

  1. 把伪首部添加到UDP上;
  2. 计算初始时是需要将检验和字段添零的;
  3. 把所有位划分为16位(2字节〉的字
  4. 把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
  5. 将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum
检验和的计算规则很简单,就是将上表中所有的16进制数加起来,之后取反码。有一点需要注意的是,如果遇到最高位进位,那么需要对结果进行回卷,意思是

简单来说,就是将要进的那一位加到尾部,上面是以二进制演示的,对于16进制同样适用。

4、C++代码实现

unsigned short check_sum(unsigned short *a, int len)
{
          
   
    unsigned int sum = 0;
 
    while (len > 1) {
          
   
        sum += *a++;
        len -= 2;
    }
 
    if (len) {
          
   
        sum += *(unsigned char *)a;
    }
 
    while (sum >> 16) {
          
   
        sum = (sum >> 16) + (sum & 0xffff);
    }
 
    return (unsigned short)(~sum);
}

转载:

  1. 如何计算UDPTCP校验和checksum: .
  2. Tcp、Udp 校验和与ip校验和的概念: .
  3. UDP校验和计算方法
经验分享 程序员 微信小程序 职场和发展