📜  TCP校验和的计算

📅  最后修改于: 2021-09-28 09:26:15             🧑  作者: Mango

在本文中,我们将学习如何计算 TCP/UDP 校验和的好概念。

当我们从应用程序接收数据时,它被分解成更小的数据部分,因为应用程序的整个数据无法通过网络发送到接收器主机。

我们在 OSI 中使用的传输层协议是 TCP。所以,在将来自应用层的数据分解成更小的部分之后。这个破碎的部分形成了 TCP 的主体。

TCP 报头通常从 20 字节(不使用选项字段的位)到 60 字节(使用选项字段的所有位)不等。

它具有源和目标端口地址、紧急指针、校验和等字段。

在本文中,我们只关注TCP 的 CheckSum 字段

TCP 的 CheckSum 是通过考虑TCP Header、TCP body 和 Pseudo IP header 来计算的

现在,出现的主要歧义是,当 IP 进入传输层以下层的图片时,如何在 IP 报头上计算校验和。

简单来说,就是我们在传输层,IP数据包是在网络层创建的。

那么我们如何从传输中估计 IP 标头的大小,因为猜测/估计肯定是错误的,因此在开始时计算错误的字段上的校验和没有意义?

传输层中 TCP/UDP 的错误检查功能需要网络层的帮助以进行正确的错误检测。

但这里要注意的重要概念是我们实际上不使用 IP 标头,而是使用 IP 标头的一部分。

为了克服所有这些错误并提高错误检查能力,我们使用Psuedo IP header

伪IP头:
伪头不是 IP 头,而是 IP 头的一部分。我们直接不使用 IP 标头,因为在 IP 标头中有许多会在数据包沿网络移动时不断变化。因此,IP 报头的一部分被考虑在内,它不会随着 IP 数据包在网络中的移动而改变。

伪 IP 标头的字段是:-

  1. 源IP
  2. 目的地IP
  3. TCP/UDP 段长度
  4. 协议(说明使用的协议类型)
  5. 固定的 8 位

所以,伪头的总大小(12字节)=源IP(32位)+目标IP(32位)+TCP/UDP段长度(16位)+协议(8位)+固定8位

需要注意的一个重要概念是,这个伪头是在传输层中创建用于计算的,计算完成后,伪头将被丢弃。并且校验和是使用通常的校验和方法计算的。

因此,该伪报头不会通过网络传输,而是传输在网络层中形成的实际 IP 报头。

因此,TCP 校验和包括:-

1. Pseudo IP header 
2. TCP header
3. TCP body

使用上述3个字段计算校验和后,将校验和结果放在TCP报头的校验和字段中。

由于已经说明伪头被丢弃并且不会传输到目标主机,那么目标主机如何检查数据是否正确接收。因此,在目标主机的传输层中再次创建伪标头,然后在目标主机的传输层中再次计算校验和,最后通过通常的校验和方法计算校验和并确认是否接收到的数据是否正确。

为什么需要两次 IP 报头错误检查?

第一次在传输层检查 IP 报头两次,第二次在网络层检查。 IP 报头被检查两次,因为双重检查可确保 IP 报头中的任何错误都能以适当的准确度被检测到。