传输控制协议(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)、保留字段(00000000000000)、协议字段(00000110)、TCP长度(00011000)和TCP数据(01001000 01100101 01101100 01101111 00101100 00101111 01110111 01101111 01110010 01101100 01100100 00100001)的二进制值被连接起来。
- 得到的二进制值被视为一个大的整数,并取一个位数的一补(在这个例子中,我们说结果是0101010101)。
- 然后将结果值转换为16位二进制,放在TCP头的校验字段中(01010101 010101)。
需要注意的是,校验和是在TCP段上计算的,校验和字段是在发送段之前计算的,并在收到段之后进行验证。接收方再次计算校验和,并将其与校验和字段进行比较。如果计算的校验和值与接收的校验和值相匹配,则认为该网段被无误接收;否则,该网段被丢弃。
这是关于TCP校验和计算方法的基本概述。它是一种重要的技术,可以确保在网络上发送时的数据完整性,这对于维护安全和可靠的通信至关重要。
TCP头
传输控制协议(TCP)头是一组包含在TCP段开头的字段。头部包含用于控制TCP连接的建立、维护和终止的信息。TCP头的长度通常为20个字节,但如果包括选项,它可以达到60个字节。
TCP头中的字段包括
- 源端口 – 16位字段,用于识别源主机上的端口,该段来自于此。
- 目标端口 – 16位字段,用于识别发送网段的目标主机上的端口。
- 顺序号 – 32位字段,确定当前段中第一个数据字节的字节数。
- 确认号 – 32位字段,确认收到该字段中所有字节的值。
- 数据偏移 – 4位字段,表示TCP头中32位字的数量。
- Reserved – 6位字段,保留给未来使用。
- Flags – 6位字段,包含各种控制标志,包括URG、ACK、PSH、RST、SYN和FIN标志。
- Window – 16位字段,表示接收窗口的大小。
- Checksum – 16位字段,用于检测TCP段中的错误。
- Urgent Pointer – 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数据是 “你好,世界!”。
- 源IP地址(11000000 10101000 00000001 00000001)、目的IP地址(11000000 10101000 00000001 00000010)、保留字段(00000000000000)、协议字段(00000110)、TCP长度(00011000)和TCP数据(01001000 01100 01101100 01101100 01101111 00101100 00101111 01110111 01101111 01110010 01101100 01100001)的二进制值被连接起来。
所得的二进制值被视为大整数,并取一个位数的一补。
让我们假设第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)、保留字段(00000000000000)、协议字段(00000110)的二进制值。TCP长度(01100100)和TCP数据(01010100 01100011 01110000 01100011 01100101 01110011 01110100 01101001 01101110 01101011 01101001 01101110 01101111 01101110 01101001 01101110 01101011 01101001 01101110 01101011 01101011 01101001 01101001 01101110)被连接起来。
得到的二进制值被视为一个大的整数,并取一个位数为1的补码。
我们假设第2步的结果是1110011 11110011(示例数)
然后将结果值转换为16位二进制,放在TCP头的校验字段中(1110011 11110011)。
值得一提的是,上述例子是为了说明问题,不一定能反映真实的结果,因为这取决于数据包中的实际数据。另外,这些例子是关于如何计算校验和的,而不是实际的数据包。