TCP 校验和的计算
传输控制协议 (TCP) 校验和是一种用于检测 TCP 数据包错误的方法。校验和的计算方法是:取 TCP 报头和数据中所有字段的二进制值,将其视为一个大整数,然后对该整数进行按位取反运算。
要计算 TCP 校验和,请执行以下步骤:
TCP 报头中的校验和字段设置为零。
将源 IP 地址和目标 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 地址和目标 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 校验和计算示例"。
源 IP 地址 (10101100 00010000 00000001 00000001)、目标 IP 地址 (10101100 00010000 00000001) 的二进制值00000010)、保留字段 (0000000000000000)、协议字段 (00000110)、TCP 长度 (01100100) 和 TCP 数据 (01010100 01100011 01110000 01100011 01100011 01100011 01100101 01110011 01110100 01101001 01101110 01101011 01101001 01101110 01101011 01101001 01101110 01101111 01101110 01101001 01101110 01101001 01101110 01101011 01101001 01101110 01101011 01101001 01101110 01101011 01101001) 连接起来。
得到的二进制值将被视为一个大整数,并按位取反。
假设步骤 2 的结果为 11110011 11110011(示例数字)
然后将结果值转换为 16 位二进制数,并放入 TCP 报头的校验和字段中 (11110011 11110011)。
值得一提的是,以上示例仅供说明之用,可能无法反映真实结果,因为它取决于数据包中的实际数据。这些也是校验和计算方式的示例,而不是实际的数据包。

