TCP/UDP 校验和、伪首部

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyh930929/article/details/83099568

tcp和udp两个协议相对应的首部,都有一项是校验和。

校验和是干什么的?
在接收端收到数据时,判断协议首部和数据是否被破坏。是在数据包中真实存在的一段数据。
伪首部是干什么的?
伪首部用来生成校验和,伪首部只是一种根据真实的首部的部分数据抽象出来的一种数据结构。并没有在数据包中真实的存在。
伪首部的构成
TCP的校验和与UDP包的校验和相似,将下图中UDP包长度改为TCP包长度就是TCP伪首部的构成。

在这里插入图片描述

  • 源IP地址:32位
  • 目标IP地址:32位
  • 包长度:16位
  • 协议号:8位

由于伪首部的全长是16的倍数(后面解释为什么是16),目前是32+32+16+8=88,最近的一个16的倍数是96,所以需要补8位,伪首部中的填充就是将需要补的8位用0填充。

为什么伪首部必须是16的倍数?
是因为利用伪首部生成校验和的流程。流程如下
  • 拿到伪首部以后,以16位为单位,将96位的伪首部划分成4个16位的数。
  • 将这4个16位的二进制数相加。
  • 取反。
  • 得到16位校验和(16个二进制的数,可化为一个16进制的数)。
接收端校验过程

接收端收到数据后根据TCP首部数据构造出伪首部。重复生成校验和一直到取反的前一步。将得到的结果值与tcp首部中的校验和相加,如果是16个1。那么校验成功。

猜你喜欢

转载自blog.csdn.net/xyh930929/article/details/83099568