TCP 校验和计算


传输控制协议 (TCP) 校验和是一种用于检测 TCP 数据包中错误的方法。校验和的计算方法是将 TCP 标头和数据中的所有字段的二进制值视为一个大整数,然后对该整数执行按位取反操作。

要计算 TCP 校验和,需要执行以下步骤:

  • 将 TCP 标头中的校验和字段设置为零。

  • 连接源和目标 IP 地址、保留字段、协议字段(对于 TCP 设置为 6)、TCP 长度和 TCP 数据的二进制值。

  • 将得到的二进制值视为一个大整数,并对其进行按位取反操作。

  • 然后将得到的值转换为 16 位二进制,并将其放置在 TCP 标头的校验和字段中。

以下是一个 TCP 校验和可能如何计算的示例:

假设源 IP 地址为 192.168.0.1,目标 IP 地址为 192.168.0.2,保留字段为 0,协议字段为 TCP 的 6,TCP 长度为 40 字节,TCP 数据为“Hello, World!”。

  • 将 TCP 标头中的校验和字段设置为零。

  • 源和目标 IP 地址的二进制值(分别为 11000000 10101000 00000000 00000001 和 11000000 10101000 00000000 00000010)、保留字段 (0000000000000000)、协议字段 (00000110)、TCP 长度 (00011000) 和 TCP 数据 (01001000 01100101 01101100 01101100 01101111 00101100 00101111 01110111 01101111 01110010 01101100 01100100 00100001) 被连接起来。

  • 将得到的二进制值视为一个大整数,并对其进行按位取反操作(在本例中,假设结果为 01010101 01010101)。

  • 然后将得到的值转换为 16 位二进制,并将其放置在 TCP 标头的校验和字段中 (01010101 01010101)。

需要注意的是,校验和是在 TCP 段上计算的,校验和字段是在发送段之前计算的,并在接收段之后进行验证。接收方再次计算校验和,并将其与校验和字段进行比较。如果计算出的校验和值与接收到的校验和值匹配,则假定段在接收过程中没有错误;否则,段将被丢弃。

这是 TCP 校验和计算方式的基本概述。它是一种重要的技术,可以确保网络传输过程中数据的完整性,这对于维护安全可靠的通信至关重要。

TCP 标头

传输控制协议 (TCP) 标头是一组包含在 TCP 段开头的字段。标头包含用于控制 TCP 连接的建立、维护和终止的信息。TCP 标头通常为 20 字节长,但如果包含选项,则最多可达 60 字节。

TCP 标头中的字段包括:

  • 源端口 - 16 位字段,标识段源自的源主机上的端口。

  • 目标端口 - 16 位字段,标识段发送到的目标主机上的端口。

  • 序列号 - 32 位字段,标识当前段中第一个数据字节的字节号。

  • 确认号 - 32 位字段,确认接收了直到此字段中值的所有字节。

  • 数据偏移量 - 4 位字段,指示 TCP 标头中 32 位字的数量。

  • 保留 - 6 位字段,保留供将来使用。

  • 标志 - 6 位字段,包含各种控制标志,包括 URG、ACK、PSH、RST、SYN 和 FIN 标志。

  • 窗口 - 16 位字段,指示接收窗口的大小。

  • 校验和 - 16 位字段,用于检测 TCP 段中的错误。

  • 紧急指针 - 16 位字段,如果设置了 URG 标志,则指示当前段中紧急数据的最后一个字节的字节号。

还有一些可选字段,例如:

  • TCP 选项 - 可变长度字段,可用于在标头中包含其他信息。

源 IP 地址、源端口、目标 IP 地址和目标端口的组合形成每个 TCP 连接的唯一标识符,称为套接字。序列号和确认号以及窗口和标志字段用于控制 TCP 连接期间的数据流。

TCP 使用标头中的字段提供可靠的面向连接的通信服务。它保证发送的数据被接收,并且按正确的顺序接收。这就是 TCP 通常用于需要可靠数据传输的应用程序(如文件传输和电子邮件)的原因。

示例

TCP 校验和的计算方法是将 TCP 标头和数据中的所有字段的二进制值视为一个大整数,然后对该整数执行按位取反操作。以下是如何计算 TCP 校验和的几个示例:

示例 1

假设源 IP 地址为 192.168.1.1,目标 IP 地址为 192.168.1.2,保留字段为 0,协议字段为 TCP 的 6,TCP 长度为 40 字节,TCP 数据为“Hello, World!”。

  • 源 IP 地址 (11000000 10101000 00000001 00000001)、目标 IP 地址 (11000000 10101000 00000001 00000010)、保留字段 (0000000000000000)、协议字段 (00000110)、TCP 长度 (00011000) 和 TCP 数据 (01001000 01100101 01101100 01101100 01101111 00101100 00101111 01110111 01101111 01110010 01101100 01100100 00100001) 的二进制值被连接起来。

  • 将得到的二进制值视为一个大整数,并对其进行按位取反操作。

  • 假设步骤 2 的结果为 10101010 10101010(示例编号)

  • 然后将得到的值转换为 16 位二进制,并将其放置在 TCP 标头的校验和字段中 (10101010 10101010)。

示例 2

假设源 IP 地址为 172.16.1.1,目标 IP 地址为 172.16.1.2,保留字段为 0,协议字段为 TCP 的 6,TCP 长度为 100 字节,TCP 数据为“TCP checksum calculation example.”。

  • 源 IP 地址 (10101100 00010000 00000001 00000001)、目标 IP 地址 (10101100 00010000 00000001 00000010)、保留字段 (0000000000000000)、协议字段 (00000110)、TCP 长度 (01100100) 和 TCP 数据 (01010100 01100011 01110000 01100011 01100011 01100101 01110011 01110100 01101001 01101110 01101011 01101001 01101110 01101111 01101110 01101001 01101110 01101011 01101001 01101110 01101011 01101001 01101110 01101011 01101001) 的二进制值被连接起来。

  • 将得到的二进制值视为一个大整数,并对其进行按位取反操作。

  • 假设步骤 2 的结果为 11110011 11110011(示例编号)

  • 然后将得到的值转换为 16 位二进制,并将其放置在 TCP 标头的校验和字段中 (11110011 11110011)。

值得一提的是,以上示例仅用于说明目的,可能不反映实际结果,因为这取决于数据包中的实际数据。此外,这些是校验和计算方式的示例,而不是实际的数据包。

更新于: 2023 年 2 月 8 日

15K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告