2 题型 - 连接控制
408 学习笔记:2 题型 - 连接控制。保留原有知识内容、公式与图示;有对应原件时提供查看和下载入口。
本页目录
描述:TCP 连接控制题把三次握手、四次挥手、序号/确认号、状态机、慢开始窗口和 RTT/MSL 时间计算组合在一起。核心规则是:SYN、FIN 各占一个序号,纯 ACK 不占序号;仅当
ACK=1时确认号字段有效,有效的累计确认号表示下一期待的连续字节序号。
TIP · 章节导航:返回第五章:运输层总纲
2.1 序号与确认号规则
2.1.1 序号消耗
| 报文段 | 是否消耗序号 | 消耗量 |
|---|---|---|
| 携带 $L$ B 数据 | 是 | $L$ |
| SYN=1 | 是 | 1 |
| FIN=1 | 是 | 1 |
| 不带数据的纯 ACK | 否 | 0 |
SYN 或 FIN 即使不携带数据,也各占用一个序号。
2.1.2 确认号
若已经按序收到对方截至序号 $x$ 的所有内容,则:
$$ ack=x+1 $$
只有 ACK=1 时确认号字段才有效。TCP 的确认是累计确认:确认号只推进到当前连续、无缺口的数据前缀之后,也就是首个尚未按序收到的字节序号,而不是“本次收到的报文段序号”。收到更高序号的失序报文段时,累计确认号不能越过缺口;启用 SACK 后可以额外报告已经收到的失序数据块,但不改变累计确认号本身的含义。
2.2 三次握手
设客户端初始序号为 $x$,服务器初始序号为 $y$:
| 次序 | 方向 | 标志与序号 | 发送后/收到后的典型状态 |
|---|---|---|---|
| 1 | 客户端 -> 服务器 | SYN=1, seq=x |
客户端 SYN-SENT |
| 2 | 服务器 -> 客户端 | SYN=1, ACK=1, seq=y, ack=x+1 |
服务器 SYN-RCVD |
| 3 | 客户端 -> 服务器 | ACK=1, seq=x+1, ack=y+1 |
双方进入 ESTABLISHED |
为使时间最短,第三次握手的 ACK 可以同时携带第一个数据段;纯 ACK 本身不消耗序号,数据按长度消耗序号。
三次握手用于确认双方收发能力并同步初始序号,不能简化为只有两次报文交换。
2.3 四次挥手与状态
设客户端主动关闭:
| 步骤 | 方向 | 典型报文 | 主动方状态 | 被动方状态 |
|---|---|---|---|---|
| 1 | 主动方 -> 被动方 | FIN=1, ACK=1 |
FIN-WAIT-1 |
收到后 CLOSE-WAIT |
| 2 | 被动方 -> 主动方 | ACK=1 |
收到后 FIN-WAIT-2 |
CLOSE-WAIT |
| 3 | 被动方 -> 主动方 | FIN=1, ACK=1 |
- | 发送后 LAST-ACK |
| 4 | 主动方 -> 被动方 | ACK=1 |
TIME-WAIT |
收到后 CLOSED |
若被动方没有剩余数据且立即同意关闭,第 2 步 ACK 与第 3 步 FIN 可以合并成一个 FIN+ACK 报文段。逻辑上仍完成了对主动 FIN 的确认和被动方向的关闭,只是时间题中可按三段报文达到最短时间。
主动关闭方在发送最后 ACK 后进入 TIME-WAIT,等待 $2MSL$:
- 若最后 ACK 丢失,可以再次响应对方重传的 FIN。
- 让本连接产生的旧重复报文段在网络中消失,避免影响后续同四元组连接。
2.4 TCP 状态路径
2.4.1 主动打开、主动关闭方
CLOSED -> SYN-SENT -> ESTABLISHED
-> FIN-WAIT-1 -> FIN-WAIT-2 -> TIME-WAIT -> CLOSED
2.4.2 被动打开、被动关闭方
CLOSED -> LISTEN -> SYN-RCVD -> ESTABLISHED
-> CLOSE-WAIT -> LAST-ACK -> CLOSED
正确拼写是 ESTABLISHED;原资料图中的 ESTANLISHE 是排版错误。
2.5 窗口与慢开始
发送方允许的在途数据窗口上限满足:
$$ swnd=\min(cwnd,rwnd) $$
若已有 $FlightSize$ 字节发出但尚未确认,则在窗口数值和确认状态不变的这一时刻,还可继续发送的字节数为 $\max(0,swnd-FlightSize)$;不能把整个 swnd 都当作剩余可发送量。
- $cwnd$ 是拥塞窗口,由发送方拥塞控制决定。
- $rwnd$ 是接收窗口,由接收方通告,承担流量控制。
- 慢开始阶段,若每轮数据均被正常确认,$cwnd$ 可按 RTT 近似从 1、2、4、8 MSS 增长。
- 实际一次能发送的数据仍受 $rwnd$ 限制。
本资料的时间题均按“忽略报文段发送时延、无重传、及时确认、为取得最短时间而允许捎带/合并”处理。
2.6 2024 年真题:3000 B 数据传输总时间
2.6.1 条件
数据量 = 3000 B
RTT = 10 ms
MSL = 30 s
MSS = 1000 B
初始 cwnd = 1 MSS
H 在数据传输完成后主动关闭
2.6.2 最短过程
- 第 1 个 RTT 完成三次握手;第三个报文段捎带 1 MSS 数据。
- 第 2 个 RTT 结束时,第 1 MSS 得到确认,$cwnd$ 从 1 增至 2。
- H 连续发送余下 2 MSS;第 3 个 RTT 结束时全部得到确认。
- H 立即发送 FIN;S 没有数据待发,把 ACK 与自己的 FIN 合并。
- 第 4 个 RTT 结束时 H 收到
FIN+ACK,发送最后 ACK 并进入TIME-WAIT。 - H 再等待 $2MSL$ 后进入
CLOSED。
因此:
$$ T_H=4RTT+2MSL =4\times10\ \mathrm{ms}+2\times30\ \mathrm{s} =60.04\ \mathrm{s} $$
答案:D,60.04 s。
2.7 模拟题三:11 KB、接收窗口 4 KB
2.7.1 条件
数据量 = 11 KB
RTT = 10 ms
MSL = 30 s
MSS = 1 KB
接收窗口 rwnd = 4 KB = 4 MSS
每批数据都立即确认
慢开始与接收窗口共同限制发送量:
| 轮次 | cwnd | rwnd | swnd | 本轮发送 |
|---|---|---|---|---|
| 第 1 轮 | 1 MSS | 4 MSS | 1 MSS | 1 KB |
| 第 2 轮 | 2 MSS | 4 MSS | 2 MSS | 2 KB |
| 第 3 轮 | 4 MSS | 4 MSS | 4 MSS | 4 KB |
| 第 4 轮 | 8 MSS | 4 MSS | 4 MSS | 4 KB |
总量:
$$ 1+2+4+4=11\ \mathrm{KB} $$
三次握手的第三段捎带第 1 MSS。全部数据确认、最短释放并进入 TIME-WAIT 后:
$$ T_H=6RTT+2MSL =6\times10\ \mathrm{ms}+60\ \mathrm{s} =60.06\ \mathrm{s} $$
服务器 S 不进入 TIME-WAIT;最终 ACK 再经过半个 RTT 到达 S:
$$ T_S=6.5RTT=65\ \mathrm{ms} $$
H 的答案:C,60.06 s。
2.8 模拟题四:512 B 传输全过程
2.8.1 条件
A 为客户端,初始序号 100
B 为服务器,初始序号 200
A 向 B 发送 512 B
发送窗口 swnd = 100 B
每个满段携带 100 B
A 的第 2 个 TCP 报文段不携带数据
B 只发送确认,不发送应用数据
2.8.2 建立连接
- A 第 1 段:
SYN=1, seq=100。 - B 第 1 段:
SYN=1, ACK=1, seq=200, ack=101。 - A 第 2 段:
ACK=1, seq=101, ack=201,不带数据。 - B 收到 A 的 SYN 并发送 SYN+ACK 后,处于
SYN-RCVD。
2.8.3 数据序号
512 B 按 100 B 窗口拆为:
| A 的报文段 | 数据范围 | seq |
数据长度 | B 返回的累计 ack |
|---|---|---|---|---|
| A-3 | 101-200 | 101 | 100 B | 201 |
| A-4 | 201-300 | 201 | 100 B | 301 |
| A-5 | 301-400 | 301 | 100 B | 401 |
| A-6 | 401-500 | 401 | 100 B | 501 |
| A-7 | 501-600 | 501 | 100 B | 601 |
| A-8 | 601-612 | 601 | 12 B | 613 |
A 第 8 段因此满足:
ACK=1, seq=601, 数据长度=12 B
按标准 TCP 规则,B 在此之前只发送不带数据的 ACK,纯 ACK 不消耗序号,所以 A 第 8 段的 ack 应仍为 201。
原 PDF 答案把第(5)问写成
ack=202,但这与题干“B 仅给 A 发送确认”、图中 B 的seq=201以及“纯 ACK 不占序号”相冲突。标准推导应为ack=201;这里保留该原答案差异,避免复习时把它当作 TCP 规则。
2.8.4 释放连接
B 确认全部 512 B 后返回 ack=613。随后:
- A 第 9 段发送连接释放请求:
FIN=1, ACK=1, seq=613, ack=201;A 进入FIN-WAIT-1。 - B 确认 A 的 FIN:
ACK=1, seq=201, ack=614;A 收到后进入FIN-WAIT-2,B 处于CLOSE-WAIT。 - B 发送自己的 FIN:
FIN=1, ACK=1, seq=201, ack=614;B 进入LAST-ACK。B 的纯 ACK 没有消耗序号,所以 FIN 仍可使用seq=201。 - A 最后一段:
ACK=1, seq=614, ack=202;A 进入TIME-WAIT。
这里最终 ack=202 是正确的,因为 B 的 FIN 从序号 201 开始并占用一个序号。
2.8.5 原题七问汇总
| 问题 | 结果 |
|---|---|
| (1)A 第 1 段 | SYN=1, seq=100 |
| (2)B 第 1 段 | SYN=1, ACK=1, seq=200, ack=101 |
| (3)A 第 2 段 | ACK=1, seq=101, ack=201 |
| (4)B 的状态 | SYN-RCVD |
| (5)A 第 8 段 | ACK=1, seq=601, ack=201,12 B;原 PDF 写 ack=202 |
| (6)A 第 9 段 | 释放段,FIN=1, ACK=1;发送后 FIN-WAIT-1 |
| (7)A 最后一段 | ACK=1, seq=614, ack=202;发送后 TIME-WAIT |
2.9 忽略发送时延时的时序等价
当题目明确忽略 TCP 报文段的发送时延时,在时序图中:
- 第三次握手 ACK 与紧接着的 HTTP 请求可以画成两条近乎重合的线。
- 若允许捎带,也可把 ACK 与应用数据画在同一个 TCP 报文段中。
- 两种画法的传播时间计算可以等价,但是否为同一报文段必须服从题目对“是否携带数据”的明确说明。
2.10 解题步骤
- 先画三次握手,给双方写出初始序号,并让 SYN 各消耗 1。
- 数据阶段按字节累计序号;先确认
ACK=1,再把累计确认号写为当前连续无缺口前缀之后的下一期待序号。 - 在途数据窗口上限用 $\min(cwnd,rwnd)$;若已有未确认数据,先扣除其占用量,再按 MSS 和剩余数据量分批。
- 时间题先数到主动方进入 TIME-WAIT 的 RTT,再额外加 $2MSL$。
- 释放阶段检查 ACK 与 FIN 是否可合并;SYN、FIN 占序号,纯 ACK 不占。
- 状态题分别沿主动方和被动方状态链判断,不能混用
FIN-WAIT与CLOSE-WAIT。
2.11 易错点
- 第三次握手 ACK 可以携带数据,但若题目明确“不携带”,第一个数据段要另算。
- 慢开始窗口增长还要受接收窗口限制,不能只看 cwnd。
- SYN 和 FIN 即使没有数据也各占一个序号;纯 ACK 不占序号。
- 主动关闭方进入
TIME-WAIT,被动关闭方通常进入CLOSE-WAIT、LAST-ACK。 - 题目问主动方最终
CLOSED时间时,必须加 $2MSL$;问被动方则通常不加。 - 不要把 RTT 当作单程时延,单程传播时间通常是 $RTT/2$。
- 原资料 512 B 题第(5)问的
ack=202与标准 TCP 规则冲突,标准答案应为 201;最终 ACK 的ack=202则正确。
相关知识
- 科目导航:计算机网络导航
- 阅读顺序:上一篇:IP、UDP、TCP 报文段 · 下一篇:应用层思维导图
- 关联专题:运输层总纲
2.12 本节复盘
- 三次握手依次为 SYN、SYN+ACK、ACK;SYN 占一个序号。
- 四次挥手中主动方经历
FIN-WAIT-1 -> FIN-WAIT-2 -> TIME-WAIT,并等待 $2MSL$。 - 发送窗口满足 $swnd=\min(cwnd,rwnd)$;慢开始在题目模型中按 1、2、4 MSS 增长。
- 2024 年 3000 B 题最短时间为 $4RTT+2MSL=60.04$ s,答案 D。
- 11 KB、rwnd=4 KB 题按 1+2+4+4 KB 发送,H 最短 60.06 s,答案 C。
- 512 B 题最后 12 B 的序号为 601-612,A 的 FIN 序号为 613,最终 ACK 为
seq=614, ack=202。 - 纯 ACK 不消耗序号;原 PDF 在 A 第 8 段确认号上存在一处与标准规则不一致的答案,复习时应采用
ack=201。