TCP传输中标记位含义
在 TCP(传输控制协议)中,标记位(Flags) 是 TCP 头部中的一个重要字段,用于控制连接的建立、数据传输和连接的关闭。TCP 头部中的标记位字段占用 6 位(在现代实现中通常还有额外的位用于扩展,但标准的是 6 个主要标记位)。这些标记位通过置 1 或 0 来表示不同的控制信息。
TCP 标记位详解
SYN(Synchronize Sequence Numbers)
- 含义:同步序列号,用于建立连接。
- 作用:在 TCP 三次握手中,发起方发送 SYN 标记位为 1 的报文,表示请求建立连接并初始化序列号。
- 使用场景:三次握手的第 1 步(客户端发送 SYN)和第 2 步(服务器回复 SYN+ACK)。
ACK(Acknowledgment)
- 含义:确认,用于确认收到数据或控制报文。
- 作用:ACK 标记位为 1 时,头部中的“确认号”(Acknowledgment Number)字段有效,表示确认收到前序数据或报文。
- 使用场景:三次握手的第 2 步(SYN+ACK)和第 3 步(ACK),以及四次挥手中的确认报文。
FIN(Finish)
- 含义:结束,表示发送方已无数据要发送,请求关闭连接。
- 作用:在 TCP 四次挥手中,发送 FIN 标记位为 1 的报文,表示一方完成了数据发送。
- 使用场景:四次挥手的第 1 步和第 3 步(主动关闭方和被动关闭方分别发送 FIN)。
RST(Reset)
- 含义:重置,用于异常终止连接。
- 作用:当出现错误(如端口未监听、连接不可达)或需要强制中断连接时,发送 RST 标记位为 1 的报文。
- 使用场景:连接异常(如客户端连接未开放的端口)或拒绝连接时。
PSH(Push)
- 含义:推送,要求接收方尽快将数据交给应用层。
- 作用:标记位为 1 时,指示接收端不要缓存数据,而是立即将数据推送给上层应用。
- 使用场景:实时应用(如 Telnet)中,确保数据及时交付。
URG(Urgent)
- 含义:紧急,表示报文中包含紧急数据。
- 作用:标记位为 1 时,头部中的“紧急指针”(Urgent Pointer)字段有效,指示紧急数据的结束位置,接收方需优先处理这些数据。
- 使用场景:很少使用,常见于需要中断或优先处理的情况(如 SSH 的 Ctrl+C)。
TCP 头部结构中的标记位
TCP 头部的标记位位于第 13 个字节(偏移量 12),占 8 位,其中 6 位用于上述标准标记位,另外 2 位在早期是保留位,后来被扩展使用(例如 NS、CWR、ECE 用于拥塞控制,但不在基础标记位讨论范围内)。标记位的布局如下:
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
|URG|ACK|PSH|RST|SYN|FIN|...|...|
+---+---+---+---+---+---+---+---+
标记位在典型场景中的使用
三次握手:
- 客户端 → 服务器:
SYN = 1
- 服务器 → 客户端:
SYN = 1, ACK = 1
- 客户端 → 服务器:
ACK = 1
- 客户端 → 服务器:
四次挥手:
- 主动关闭方 → 被动方:
FIN = 1
- 被动方 → 主动方:
ACK = 1
- 被动方 → 主动方:
FIN = 1
- 主动方 → 被动方:
ACK = 1
- 主动关闭方 → 被动方:
异常中断:
- 一方发送:
RST = 1
- 一方发送:
数据传输:
- 通常设置
ACK = 1
,若需立即推送数据,则附加PSH = 1
。
- 通常设置
总结
TCP 的标记位是实现其可靠性和连接管理的基础。以下是主要标记位的简要概括:
- SYN:建立连接
- ACK:确认接收
- FIN:关闭连接
- RST:重置连接
- PSH:推送数据
- URG:紧急数据