TCP 首部结构详解
TCP 首部是 TCP 协议的核心部分,包含了控制 TCP 连接和数据传输的关键信息。
TCP 首部字段
1. 源端口(Source Port,16 位)
- 作用:标识发送方的端口号
- 范围:0-65535
- 示例:HTTP 客户端使用随机端口,服务器使用 80 端口
2. 目的端口(Destination Port,16 位)
- 作用:标识接收方的端口号
- 范围:0-65535
- 示例:HTTP 服务器监听 80 端口
3. 序列号(Sequence Number,32 位)
- 作用:标识数据在流中的位置
- 特点:每个字节都有序列号,序列号是字节的偏移量
- 初始值:连接建立时随机生成
- 作用:确保数据按序到达,检测丢失数据包
4. 确认号(Acknowledgment Number,32 位)
- 作用:期望收到的下一个字节的序列号
- 条件:只有 ACK 标志位为 1 时才有效
- 特点:累积确认,确认号之前的所有字节都已收到
5. 数据偏移(Data Offset,4 位)
- 作用:指示 TCP 首部的长度(以 32 位字为单位)
- 范围:5-15,对应 20-60 字节
- 计算:首部长度 = 数据偏移 × 4 字节
6. 保留(Reserved,6 位)
- 作用:保留供将来使用
- 值:必须设置为 0
7. 标志位(Flags,6 位)
- URG(Urgent):紧急指针有效
- ACK(Acknowledgment):确认号有效
- PSH(Push):接收方应尽快将数据交付应用层
- RST(Reset):重置连接
- SYN(Synchronize):同步序列号,用于建立连接
- FIN(Finish):发送方完成数据发送,用于关闭连接
8. 窗口大小(Window Size,16 位)
- 作用:通告接收方的可用缓冲区大小
- 单位:字节
- 作用:流量控制,防止发送过快导致缓冲区溢出
9. 校验和(Checksum,16 位)
- 作用:检测首部和数据在传输过程中的错误
- 计算范围:TCP 首部、数据和伪首部
- 伪首部:包含源 IP、目的 IP、协议号、TCP 长度
10. 紧急指针(Urgent Pointer,16 位)
- 作用:指向紧急数据的最后一个字节
- 条件:只有 URG 标志位为 1 时才有效
- 用途:用于紧急数据传输
11. 选项(Options,可变长度)
- 作用:提供额外的功能
- 常见选项:
- MSS(最大报文段大小)
- 窗口扩大因子
- 时间戳
- SACK(选择性确认)
首部结构图
shell0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
相关问题
- TCP 首部最小和最大长度是多少?
- 为什么需要伪首部计算校验和?
- 窗口扩大因子有什么作用?