计算机网络冷门知识

237 阅读2分钟

1. TCP和UDP头部有何不同?

  • TCP报文段:TCP头部包含较多的控制字段,提供丰富的控制信息以保障可靠传输。TCP头部主要包括源端口号、目的端口号、序列号、确认号、数据偏移(头部长度)、保留位、控制标志(如SYN、ACK、FIN等)、窗口大小、校验和、紧急指针等字段。这些字段共同提供了连接管理、流量控制、拥塞控制、错误检测等功能。 image.png
  • UDP报文段:UDP头部相对简单,只包含源端口号、目的端口号、长度、校验和四个字段。UDP头部不包含序列号、确认号等用于可靠传输的复杂控制信息,因此其开销小,处理简单。 image.png

2. TCP是如何计算校验和的?

计算范围: TCP 校验和覆盖整个 TCP 报文段,包括 TCP 头部和 TCP 数据部分。这意味着校验和不仅针对数据内容进行计算,也包括了 TCP 头部中的所有字段。

计算方法: TCP 校验和的具体计算步骤如下:

  1. 初始化

    • 首先,将 TCP 头部中的校验和字段(Checksum)置为 0。这是因为在计算过程中,校验和字段本身也需要被纳入计算范围,但此时它的值应该是待计算的。
  2. 生成“伪首部”

    • 除了 TCP 头部和数据,TCP 校验和还需要包括一个“伪首部”(Pseudo Header)。伪首部包含源 IP 地址、目的 IP 地址、协议类型(对于 TCP 通常是 6)、以及 TCP 报文段的总长度(包括 TCP 头部和数据部分)。伪首部模拟了 IP 头部的部分信息,用于提供必要的路由和分片信息,确保校验和对整个 IP 数据报的完整性进行校验。
  3. 计算

    • 将伪首部、TCP 头部(校验和字段仍然为 0)和 TCP 数据部分按网络字节序(大端字节序)拼接在一起,形成一个连续的二进制数据块。
    • 对这个数据块中的每一个 16 位(双字节)进行二进制反码求和(即异或和)。如果在求和过程中产生进位,需要进行回卷(carry-around),即将进位加到下一轮求和的低位上。
    • 继续上述过程,直到所有 16 位都参与了求和。此时得到一个 32 位的结果。如果这个结果的高 16 位不为 0,则继续将高 16 位与低 16 位相加,再次进行回卷,直到得到一个 16 位的和。
    • 最后,对该 16 位和进行取反(即每一位取反),得到的值就是最终的 TCP 校验和。
  4. 填充

    • 将计算得到的校验和填充到之前清零的 TCP 头部校验和字段中。