C++——TCP和UDP头部结构(下)

1. TCP头部结构

OSI七层模型网络传输层中,TCP是面向连接、可靠的、字节流传输。

TCP协议通信双方必须先建立连接,通信双方必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP是全双工的,即双方的数据读写可通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

 TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。而无连接的UDP则十分适合这种广播和多播。

TCP协议使用字节流(UDP使用数据报),实际编程中字节流和数据报的主要区别体现在通信双方是否必须执行相同次数的读、写操作(只是表现形式),发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。

      当接收端收到一个或多个TCP报文段后,TCP模块将他们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以一次性将TCP接收缓冲区中的数据全部都出,也可以分多次读取,这取决于用户制定的应用程序读缓冲区的大小。因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间也没有固定的数量关系

### 构建TCP头部的数据结构与字段组成 TCP头部TCP协议的核心组成部分之一,负责封装必要的元信息以确保数据能够在网络中可靠传输。以下是关于TCP头部构建方式及其字段组成的详细介绍。 #### TCP头部的标准结构 TCP头部由固定的20字节标准部分以及可变长度的选项部分构成[^2]。具体来说,TCP头部的主要字段如下: 1. **源端口号 (Source Port)** 占用16位,用于标识发送方的应用程序端口。 2. **目的端口号 (Destination Port)** 占用16位,用于标识接收方的应用程序端口。 3. **序列号 (Sequence Number)** 占用32位,表示本报文段所发送数据的第一个字节的编号。此字段对于实现可靠的按序交付至关重要。 4. **确认号 (Acknowledgment Number)** 占用32位,在ACK标志被置为1时生效,表示期望收到下一个报文段的第一个字节的编号[^1]。 5. **数据偏移量 (Data Offset)** 又称为首部长度,占用4位,指示TCP头部的长度(以4字节为单位)。由于最小的TCP头部长度为20字节,因此该字段的最小值为5(即 \(5 \times 4 = 20\) 字节),最大值为15(即 \(15 \times 4 = 60\) 字节)[^2]。 6. **保留字段 (Reserved Field)** 占用6位,默认全为0,供未来扩展使用。 7. **控制位 (Control Bits)** 占用6位,分别代表URG、ACK、PSH、RST、SYNFIN六个标志位。这些标志位决定了当前TCP报文的行为[^4]: - URG:紧急指针是否有效。 - ACK:确认号字段是否有效。 - PSH:提示接收方尽快将数据提交给应用层。 - RST:重置连接。 - SYN:同步序列号,用于建立连接。 - FIN:结束连接。 8. **窗口大小 (Window Size)** 占用16位,表示接收方能接受的最大数据量(以字节为单位),用于流量控制机制[^2]。 9. **校验 (Checksum)** 占用16位,覆盖整个TCP头部数据部分,用于检测传输过程中发生的错误。 10. **紧急指针 (Urgent Pointer)** 占用16位,当URG标志被置为1时生效,指出本报文中紧急数据的最后一个字节相对于序列号的位置[^1]。 11. **选项 (Options)** 长度不定,但必须是4字节的整数倍。常见选项包括MSS(Maximum Segment Size)、时间戳(Timestamps)等[^3]。每个选项由三个字段组成:类型(Kind)、长度(Length)信息(Info)。 #### 示例代码:构建TCP头部 以下是一个简单的C语言示例,展示如何手动创建一个TCP头部结构体: ```c #include <stdint.h> // 定义TCP头部结构体 typedef struct tcp_header { uint16_t source_port; // 源端口号 uint16_t destination_port; // 目的端口号 uint32_t sequence_number; // 序列号 uint32_t acknowledgment_number; // 确认号 uint8_t data_offset_reserved_flags; // 数据偏移量 | 保留字段 | 控制位 uint8_t window_size; // 窗口大小 uint16_t checksum; // 校验 uint16_t urgent_pointer; // 紧急指针 } __attribute__((packed)) tcp_header; // 初始化TCP头部 tcp_header create_tcp_header(uint16_t src_port, uint16_t dst_port, uint32_t seq_num, uint32_t ack_num) { tcp_header header = {0}; header.source_port = htons(src_port); header.destination_port = htons(dst_port); header.sequence_number = htonl(seq_num); header.acknowledgment_number = htonl(ack_num); // 设置数据偏移量为5(无选项) header.data_offset_reserved_flags = (5 << 4); return header; } ``` 上述代码定义了一个紧凑的TCP头部结构,并提供了一种初始化方法。注意,实际应用中还需要计算校验并处理其他细节。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值