TCP是什么
TCP(传输控制协议)是一种面向连接的、可靠的、全双工的传输协议。它使用头部(Header)和数据(Data)来组织数据包,确保数据的可靠传输和按序传递。
TCP协议报文结构
下面详细阐述TCP协议的结构:
- 源端口号和目的端口号:占用2个字节,分别表示发送方和接收方的端口号。这些端口号用于标识应用程序和服务,以确保数据被正确传递给相应的应用程序。
- 序列号:占用4个字节,用于标识TCP报文段中的第一个数据字节在整个数据流中的位置。
序列号是用于数据按序传递的关键。 - 确认号:占用4个字节,用于回复对方的序列号,表示期望接收的下一个数据字节的序列号。确认号实现了可靠传输的机制。
- 数据偏移:占用4位,表示TCP头部的长度,以4字节为单位。因此,数据偏移的值乘以4等于TCP头部的总长度。
- 保留位:占用6位,保留为未来使用,置为0。
- 标识位:TCP头部中有6个标识位,分别是:
- URG:紧急指针有效,表示紧急数据。
- ACK:确认号有效,表示确认号字段包含有效的确认信息。
- PSH:推送数据,通知接收方应用程序尽快将数据交给用户。
- RST:复位连接,用于终止连接。
- SYN:发起连接,用于建立连接。
- FIN:终止连接,用于关闭连接。
- 窗口大小:占用2个字节,表示接收方允许发送方发送的数据量,用于流量控制。
- 校验和:占用2个字节,用于检测TCP头部和数据的传输是否出错。TCP使用校验和来保证数据的完整性。
- 紧急指针:占用2个字节,仅当URG标志位为1时有效,表示紧急数据的偏移量。
- 选项(可选):TCP头部中还可以包含一些可选的选项字段,用于扩展TCP功能。
- 数据(可选):TCP数据报中的实际数据部分。这个部分的长度可以是0到最大MTU(最大传输单元)减去TCP头部的长度。
TCP协议的结构使其能够提供可靠的数据传输和连接管理功能,适用于对数据可靠性要求较高的应用,如Web浏览器、电子邮件、文件传输等。
-
TCP选项字段是在TCP报文的报头中的一个特定位置,用于扩展TCP功能。选项字段的长度是可变的,可以根据具体选项内容的大小动态调整。
例如:
struct tcphdr {uint16_t source;uint16_t dest;uint32_t seq;uint32_t ack_seq;uint16_t doff; // 数据偏移,用于标识TCP头部的长度uint16_t window;uint16_t check;uint16_t urg_ptr;uint32_t options[]; // 这里是选项字段,大小可变。使用柔性数组实现选项字段,\其好处是可以在不浪费额外空间的情况下,灵活地传递选项信息。当TCP报文不需要携带选项时,选项字段可以省略,\不占用额外的空间。而当TCP报文需要携带选项时,柔性数组允许动态分配选项内容的空间,以适应具体的选项需求。
};