Lecture 11:思维导图 - 运输层
408 学习笔记:Lecture 11:思维导图 - 运输层。保留原有知识内容、公式与图示;有对应原件时提供查看和下载入口。
本页目录
描述:运输层在端系统中为应用进程提供端到端的逻辑通信。UDP 以最小开销提供无连接报文服务;TCP 通过连接管理、序号与确认、超时重传、滑动窗口、流量控制和拥塞控制提供可靠字节流。做题时必须同时跟踪
seq、ack、发送/接收窗口、cwnd、ssthresh和 RTT。
本篇按“进程通信与端口 -> UDP/TCP 首部 -> 连接管理 -> 可靠传输 -> 流量控制 -> 拥塞控制 -> 窗口与时间计算”整理。原 PDF 中的综合题另设两个专题入口:
| 专题 | 入口 |
|---|---|
| IPv4、UDP、TCP 首部、检验和、分片与封装效率 | 1 题型 - IP、UDP、TCP报文段 |
| 三次握手、四次挥手、窗口增长、RTT/MSL 与序号题 | 2 题型 - 连接控制 |
5.1 运输层概述
5.1.1 进程到进程通信
网络层把分组送到目的主机,运输层再利用端口号把数据交给具体应用进程。因此网络层提供主机到主机通信,运输层提供进程到进程的逻辑通信;运输层协议只运行在端系统中,路由器通常只转发其承载的 IP 分组。
- 复用:发送主机的多个应用进程通过各自套接字使用运输层。
- 分用:接收主机依据首部中的端口及地址信息,把报文段交给正确套接字。
- UDP 分用主要依据目的 IP 与目的端口;来自不同源端点的 UDP 数据报可交给同一个 UDP 套接字。
- 已建立的 TCP 连接通常由四元组唯一标识:
(源IP, 源端口, 目的IP, 目的端口);同一服务器端口可同时服务许多四元组不同的连接。
端口字段为 16 bit,取值范围 0-65535;其中 0 为保留值,不作为普通服务端点,通常使用 1-65535。端口只在本主机内标识运输层通信端点,不是物理接口;(IP 地址, 端口号) 合称套接字端点。
| IANA 端口范围 | 名称 | 常见用途 |
|---|---|---|
0-1023 |
系统/熟知端口(0 保留) | 由重要标准服务使用,如 HTTP 80、HTTPS 443、DNS 53 |
1024-49151 |
注册端口 | 为应用注册或约定使用,不等于操作系统会自动保留 |
49152-65535 |
动态/私有端口 | 客户端常临时选择;实际临时端口范围可由操作系统配置 |
服务器“监听某端口”与一条已建立连接不是同一对象:监听套接字负责接收新连接,建立后由包含两端地址与端口的连接套接字承载通信。
5.1.2 UDP 与 TCP 对比
| 项目 | UDP | TCP |
|---|---|---|
| 连接 | 无连接 | 面向连接,通信前需建立连接 |
| 数据单位 | 用户数据报,保留报文边界 | 字节流,不保留应用报文边界 |
| 可靠性 | 尽最大努力,不保证可靠、按序、无重复 | 可靠、有序、无重复,使用确认和重传 |
| 通信方式 | 支持单播、多播、广播 | 只支持一对一全双工 |
| 控制机制 | 无 TCP 式流量/拥塞控制 | 有滑动窗口、流量控制和拥塞控制 |
| 首部 | 固定 8 B | 基本 20 B,可带选项,最长 60 B |
| 典型需求 | 实时、简单查询、应用自定义可靠性 | 文件、网页、邮件等可靠传输 |
“面向连接”指通信前维护双方逻辑状态,不代表物理链路被独占;TCP 只提供点到点单播连接,UDP 可用于单播,并可由 IP 多播或广播承载。
5.2 UDP
5.2.1 UDP 首部与校验
UDP 首部包含源端口、目的端口、长度、校验和四个字段,各 2 B。长度字段包括 UDP 首部与数据。
UDP 校验和计算还使用由源 IP、目的 IP、协议号和 UDP 长度组成的伪首部;伪首部只参与校验,不实际发送为 UDP 首部的一部分。
- IPv4 中 UDP 校验和可选,值为 0 表示未使用;IPv6 中 UDP 校验和必须使用(408 基本规则)。
- UDP 校验失败的报文被丢弃,但 UDP 自身不负责重传。
- 一个
send形成一个 UDP 数据报,接收方按数据报交付,应用需自行避免数据报过大或处理丢失、乱序。 - UDP 长度字段为 16 bit,包含 8 B 首部;IPv4 无选项时,单个 IPv4 数据报理论最多承载 $65535-20-8=65507$ B 的 UDP 数据,但若链路 MTU 更小就可能发生 IP 分片,实际还受路径 MTU、分片策略和实现限制。
- 校验时若数据为奇数字节,末尾临时补 1 个全 0 字节凑成 16 bit,该补位不传输。IPv4 中若计算结果恰为 0,应在线上传为全 1;字段全 0 专门表示“未计算校验和”。
伪首部让 UDP/TCP 的校验同时绑定两端 IP、上层协议号与运输层长度,可发现部分误投递,但它既不是 IP 首部的一部分,也不会交给应用。
5.3 TCP 报文段
5.3.1 TCP 主要字段
| 字段 | 含义 |
|---|---|
| 源/目的端口 | 标识两端应用进程 |
序号 seq |
有数据且无 SYN 时为数据首字节序号;有 SYN 时为 SYN 的序号,同段数据从 seq+1 起;FIN 在数据之后再占 1 个序号 |
确认号 ack |
期望收到的下一个字节序号,表示此前字节均已按序收到 |
| 数据偏移 | TCP 首部长度,单位为 4 B |
ACK |
确认号字段有效;连接建立后通常为 1 |
SYN |
建立连接、同步初始序号 |
FIN |
发送方数据发送完毕,请求释放该方向连接 |
RST |
异常复位连接 |
PSH |
希望接收端尽快向应用交付 |
接收窗口 rwnd |
接收方通告当前可接收字节数,用于流量控制 |
| 校验和 | 覆盖 TCP 首部、数据和伪首部 |
| 紧急指针 | 与 URG 配合标识紧急数据位置 |
TCP 以字节编号,序号与确认号均为 32 bit,并按模 $2^{32}$ 回绕。设报文段 seq=x、数据长为 $L$ B;$I_{SYN}$、$I_{FIN}$ 分别在相应标志置位时取 1,否则取 0。该段占用 $L+I_{SYN}+I_{FIN}$ 个序号,段末后一序号为 $(x+L+I_{SYN}+I_{FIN})\bmod 2^{32}$。有数据且无 SYN 时数据首字节序号为 $x$;有 SYN 时同段数据从 $x+1$ 起。只有此前没有缺口且该段按序到达时,接收方的累计确认号才可越过这段已收到的连续序号;若更早序号仍缺失,即使收到更高序号的失序段,ACK 通常仍指向首个缺口。纯 ACK 不携带数据且不含 SYN/FIN 时不消耗序号;确认号字段只有在 ACK=1 时才有效。这一区分依据 RFC 9293,属于对知识图概括语句的教材补充与纠错。
数据偏移字段为 4 bit,取值 5-15,对应 20-60 B 首部。常见选项包括 MSS、窗口扩大、时间戳和 SACK 许可;选项末尾用填充补齐到 4 B 整数倍。首部中的 16 bit 窗口值是接收窗口通告,若协商了窗口扩大选项,实际窗口可超过 65535 B。
TCP 是字节流协议,不保留应用层报文边界:一次应用写入可能被拆成多个报文段,多次小写入也可能合并;接收应用只能依据自身协议重新识别消息边界。
5.3.2 MSS、窗口与实际发送量
MSS 是一个 TCP 报文段可承载的最大应用数据量,不包括 TCP/IP 首部。典型以太网中:
$$MSS=MTU-IP首部-TCP首部=1500-20-20=1460\ \text{B}$$
发送方可用窗口受接收端和网络拥塞共同限制:
$$swnd=\min(rwnd,cwnd)$$
若发送窗口左沿为已确认位置,已发送未确认数据占用 $FlightSize$,则当前还能发送:
$$Available=\max(0,swnd-FlightSize)$$
发送窗口可用三个位置理解:
已确认并可删除 | 已发送未确认 | 允许发送但尚未发送 | 当前不允许发送
SND.UNA SND.NXT SND.UNA + swnd
SND.UNA是最早未确认字节,窗口后沿随新累计 ACK 右移。SND.NXT是下一个准备发送的新字节;SND.NXT-SND.UNA就是在途未确认量。- 发送窗口的前沿可随 ACK 和窗口通告右移;若接收方缩小
rwnd,前沿也可能暂时不动甚至收缩,但已经发出的字节不能被“收回”。 - 同一时刻发送方看到的
swnd不一定等于接收方当前本地rwnd:窗口通告存在传播时延,且cwnd还可能进一步限制发送。
5.4 TCP 连接管理
5.4.1 三次握手
设客户端初始序号为 $x$,服务器初始序号为 $y$:
客户端 服务器
SYN=1, seq=x -------->
<-------- SYN=1, ACK=1, seq=y, ack=x+1
ACK=1, seq=x+1, ack=y+1 -------->
第三次握手让服务器确认客户端已经收到服务器的 SYN 与初始序号,可避免失效的旧连接请求使服务器长期保留半开连接。前两次握手中的 SYN 各消耗一个序号;第三次纯 ACK 通常不消耗序号。
三次握手同时验证双方的发送与接收路径,并同步双方初始序号。若第三段同时携带 $L$ B 数据,它仍从 seq=x+1 开始,并使客户端下一个新数据序号变为 $x+1+L$;若是纯 ACK,下一个数据仍从 $x+1$ 开始。
5.4.2 四次挥手与 TIME_WAIT
TCP 是全双工连接,两个方向可分别关闭,因此通常需要四个报文段。假设 A 主动关闭:
A: FIN=1, seq=u -------->
<-------- B: ACK=1, ack=u+1
<-------- B: FIN=1, seq=v
A: ACK=1, ack=v+1 -------->
A 进入 TIME_WAIT,等待 2MSL 后关闭
- 被动关闭端收到 FIN 后可继续发送剩余数据,这称半关闭状态。
TIME_WAIT=2MSL使最终 ACK 丢失时仍能重发,并让网络中的旧报文段自然消失,避免污染同四元组的新连接。- FIN 与 SYN 一样各消耗 1 个序号。
5.4.3 异常与攻击
- SYN 洪泛制造大量半连接并耗尽服务器资源。常见缓解包括 SYN Cookie、缩短半连接超时、限制速率与扩展队列。
- 收到不属于现存连接的 TCP 报文段或连接出现严重异常时,端点可发送
RST复位。 - 保活计时器用于发现长期无活动且对端已失效的连接,但不替代正常应用层超时设计。教材常用默认模型是空闲约 2 h 后发送探测,之后每 75 s 探测一次,连续 10 次无响应则关闭;这些数值均可由实现配置,题目给值时以题设为准。
- 保活、重传和持续计时器用途不同:保活检查长期空闲对端,重传计时器恢复丢失数据,持续计时器在
rwnd=0时防止窗口更新丢失造成永久等待。
5.4.4 完整状态机的特殊路径
常见题只画“客户端主动打开、主动关闭”的主路径,但完整 TCP 状态机还要容纳以下情况:
| 情况 | 关键状态/结论 | 边界 |
|---|---|---|
| 同时打开 | 双方都从 SYN-SENT 收到对方 SYN,可发送 SYN+ACK 并进入 SYN-RCVD,随后建立连接 |
少见但协议允许;不能把客户端/服务器角色绝对化 |
| 同时关闭 | 一方发送 FIN 后、自己的 FIN 尚未被确认时又收到对方 FIN,可进入 CLOSING;双方 FIN 均确认后由相应端进入 TIME-WAIT |
CLOSING 不出现在普通四次挥手主路径中 |
| 半关闭 | 一端发送 FIN 只表示自己不再发送数据,仍可继续接收对方剩余数据 | 收到 FIN 不等于两个方向立刻都关闭 |
| 异常复位 | RST 立即中止连接或拒绝无效连接 |
与 FIN 的有序、可继续接收剩余数据的关闭语义不同 |
TIME-WAIT 由发送最终 ACK 的一方进入,通常是主动关闭方,但“客户端一定进入、服务器一定不进入”并非协议规则;任一端都可能主动关闭,双方同时关闭时状态路径也会不同。考试若只给普通主动/被动关闭,就按题设主路径计算。
5.5 TCP 可靠传输
5.5.1 序号、确认与缓存
- TCP 使用累计确认:
ack=k表示序号小于 $k$ 的字节已按序收到,下一步期待字节 $k$。 - 收到失序报文段时可缓存并重复确认当前缺口;具体缓存策略由实现决定,但确认号不会越过缺失字节。
- 校验和检测比特错误;超时重传和快速重传恢复丢失数据;接收端按序向应用交付并丢弃重复字节。
- TCP 的 ACK 语义与选择重传协议常用的“确认某一帧”不同:TCP 的
ack=k确认的是连续字节前缀,不能据此断言序号大于等于 $k$ 的所有失序字节均未到达。
5.5.2 确认策略
- 立即确认:出现新的按序数据并需要及时推进窗口,或收到失序段需报告缺口时发送 ACK。
- 延迟确认:接收端可短暂等待,以减少纯 ACK;经典教材规则是延迟不超过 0.5 s,连续收到两个满长报文段时至少确认一次。
- 捎带确认:若反向恰有数据,可把 ACK 信息放进该数据段。若等待会触发对方不必要的超时,就应先发纯 ACK。
- ACK 丢失不一定导致数据重传:后续更大的累计确认可能覆盖它;只有在 RTO 到期或重复 ACK 触发快速重传时才恢复缺失数据。
5.5.3 RTT 估计与超时重传
TCP 用采样 RTT 平滑估计往返时间。常见形式为:
$$EstimatedRTT=(1-\alpha)EstimatedRTT+\alpha SampleRTT$$
$$DevRTT=(1-\beta)DevRTT+\beta\left|SampleRTT-EstimatedRTT\right|$$
$$RTO=EstimatedRTT+4DevRTT$$
典型取值为 $\alpha=1/8$、$\beta=1/4$。发生超时后 RTO 通常指数退避,避免拥塞时过于频繁重传。
Karn 算法思想:重传报文段得到 ACK 时无法判断 ACK 对应原报文还是重传报文,因此不使用该样本更新 RTT,并对超时值进行退避。
概念模型中,发送方为最早的未确认数据维护重传计时;收到推进 SND.UNA 的新 ACK 后更新确认状态,超时则重传缺失数据并增大 RTO。不能直接把某次 SampleRTT 当作 RTO,RTO 必须给 RTT 波动留出余量。
5.5.4 快速重传
接收端发现缺口后会对后续到达的失序段发送重复 ACK。发送端收到 3 个重复 ACK 时,不等待 RTO 到期便重传缺失段,称快速重传。
题目计数时要分清:触发快速重传的是原确认之后又收到 3 个相同 ACK,而不是把第一次正常 ACK 也算作 3 个重复确认之一。
5.6 TCP 流量控制
流量控制防止发送方速度超过接收应用取走数据的速度。接收端根据缓存剩余空间在 TCP 首部通告 rwnd,发送端确保未确认数据量不超过接收窗口。
- TCP 是全双工的,每一方向都有独立的发送缓存、接收缓存、序号空间和窗口;A 通告的
rwnd限制 B 向 A 发送,而不是限制 A 自己发送。 - 接收窗口为 0 时发送端暂停发送新数据,并启动持续计时器;计时到期后发送零窗口探测段,接收端必须回复当前窗口,避免非零窗口更新报文丢失后双方永久等待。
- 接收端应避免频繁通告很小的窗口,发送端可用 Nagle 算法在存在未确认小段时合并后续小写入。这两类策略用于缓解糊涂窗口综合征;低时延应用或题设禁用 Nagle 时应以题设为准。
- 流量控制关注接收端缓存,拥塞控制关注网络承载能力;实际发送窗口同时取二者最小值。
flowchart LR
A[发送缓存] -->|最多在途 min(rwnd,cwnd)| N[网络]
N --> B[接收缓存]
B -->|ACK + 当前 rwnd| A
B --> P[接收应用读取]
5.7 TCP 拥塞控制
拥塞是网络中某些链路、交换节点的缓存或处理能力被持续超额请求,表现为排队时延增大、丢包和吞吐量下降。TCP 主要依据超时、重复 ACK 和 RTT 变化进行隐式反馈;若网络与端点支持 ECN,也可利用显式拥塞标记。拥塞控制是全局问题,不能只靠接收端 rwnd 解决。
5.7.1 cwnd 与 ssthresh
- 拥塞窗口
cwnd由发送端维护,反映网络当前允许的未确认数据量,常以 MSS 为单位。 - 慢开始门限
ssthresh决定使用指数增长还是线性增长。 - 若题目给出接收窗口,还需使用 $swnd=\min(rwnd,cwnd)$;不能只看
cwnd。 - 经典 408 模型常令初始
cwnd=1MSS;现实 TCP 的初始窗口可能更大,考试必须服从题设。 - 慢开始并不是“增长很慢”:每收到确认新数据的 ACK,
cwnd约增加 1 MSS,因此一轮 RTT 内全部正常确认时近似翻倍。 - 拥塞避免中每个 ACK 只增加约 $MSS^2/cwnd$ 字节,合计每 RTT 约增加 1 MSS。
5.7.2 四种算法
| 阶段 | 触发条件 | cwnd 变化 |
|---|---|---|
| 慢开始 | cwnd < ssthresh |
每收到一轮完整 ACK,约翻倍:1、2、4、8... |
| 拥塞避免 | cwnd >= ssthresh |
每 RTT 约增加 1 MSS,线性增长 |
| 快速重传 | 收到 3 个重复 ACK | 立即重传缺失报文段,不等超时 |
| 快速恢复 | 3 个重复 ACK 后 | Reno 中把门限降为原窗口一半,利用重复 ACK 维持流水线;收到新 ACK 后进入拥塞避免 |
发生超时通常视为严重拥塞:
$$ssthresh=\max\left(\frac{FlightSize}{2},2MSS\right),\qquad cwnd=1MSS$$
发生3 个重复 ACK时,经典 Reno 通常执行:
$$ssthresh\approx\frac{FlightSize}{2},\qquad cwnd=ssthresh+3MSS$$
随后每来一个额外重复 ACK 可暂时增加 1 MSS;收到确认新数据的 ACK 后令 cwnd=ssthresh,进入拥塞避免。部分 408 题目使用简化规则“直接减半后线性增长”,应优先按题干给定规则计算。
Tahoe 与 Reno 边界:Tahoe 对超时和 3 个重复 ACK 都把 cwnd 降为 1 MSS 后慢开始;Reno 才在 3 个重复 ACK 时进入快速恢复。不同教材对 ssthresh 的取整、最小 2 MSS 和事件发生时点可能简化,题目若给出规则应按题设逐轮更新。
5.7.3 窗口演化题步骤
- 明确
cwnd的单位是 MSS 还是字节,并记录初始ssthresh。 - 每个 RTT 结束后根据当前阶段更新
cwnd;达到门限后从指数增长切换为线性增长。 - 遇到超时:门限减半、
cwnd置 1;遇到 3 个重复 ACK:按题设执行快重传/快恢复。 - 若给
rwnd,每轮实际发送段数为 $\min(cwnd,rwnd)$ 再扣除未确认数据。 - 统计时间时区分建立连接 RTT、数据传输 RTT、报文发送时延和关闭连接时间。
5.8 常见计算关系
若发送窗口足够大、忽略确认发送时间,一轮最多发送 $W$ 个 MSS,则窗口覆盖数据量为:
$$Data=W\times MSS$$
链路带宽为 $R$、往返时延为 RTT 时,要使发送方持续发送而不因等待 ACK 停顿,窗口至少覆盖带宽时延积。下式要求 $R$ 使用 B/s;若题目给的是 bit/s,应先除以 8:
$$W_{byte}\gtrsim R\times RTT$$
理想情况下 TCP 吞吐上限还受链路带宽、接收窗口和拥塞窗口共同限制:
$$Throughput\le\min\left(R,\frac{rwnd}{RTT},\frac{cwnd}{RTT}\right)$$
时间题可沿时序线直接计数:一次 RTT 是“报文到达对端再由响应返回”的往返时间,单程传播通常为 $RTT/2$。主动关闭端发送最终 ACK 时才进入 TIME-WAIT,若题目问其进入 CLOSED 的最短时间,还要从该时刻再加 $2MSL$。第三次握手捎带数据、纯 ACK 与 FIN 合并都必须有题设允许,不能为了少算 RTT 擅自合并。
5.9 高频边界与易错点
| 项目 | 必记结论 |
|---|---|
| 端口号 | 16 bit;端口只在主机内标识进程端点,TCP 连接由四元组区分 |
| UDP/TCP 数据边界 | UDP 保留一个个数据报;TCP 是连续字节流,不保留应用报文边界 |
| UDP 长度 | 单位 1 B,包含 8 B UDP 首部与数据 |
| TCP 数据偏移 | 单位 4 B;5-15,对应首部 20-60 B |
seq |
有数据且无 SYN 时为数据首字节序号;有 SYN 时为 SYN 的序号,同段数据从 seq+1 起;32 bit,按模 $2^{32}$ 回绕 |
ack=k |
期望下一个字节序号为 $k$,即小于 $k$ 的连续字节已按序收到 |
| 序号消耗 | 数据按字节消耗;SYN、FIN 各消耗 1;无数据且无 SYN/FIN 的纯 ACK 不消耗 |
| 实际发送窗口 | $swnd=\min(rwnd,cwnd)$,还要扣除已发送未确认量 |
| 超时 | 严重拥塞:经典模型令 cwnd=1 MSS,ssthresh 约为在途量一半 |
| 3 个重复 ACK | 快速重传;Reno 快速恢复,Tahoe 则回到 1 MSS |
TIME-WAIT |
通常由主动关闭方进入并等待 $2MSL$ |
- UDP/TCP 校验和覆盖伪首部、运输层首部和数据;IPv4 首部校验和只覆盖 IPv4 首部。
- TCP 首部本身没有源/目的 IP,伪首部中的地址来自 IP 层且只参与校验。
rwnd解决接收缓存压力,cwnd解决网络拥塞;接收窗口很大不代表一定能高速发送。- 累计 ACK 只越过连续无缺口的数据;收到失序段不应把确认号推进到缺口之后。
- 快速重传要求 3 个重复 ACK,不把缺口出现前的首次正常确认算入其中。
- MSS 是 TCP 数据载荷上限,不是整个 TCP 报文段长度,也不是 IP 数据报总长度。
5.10 题型索引
- 1 题型 - IP、UDP、TCP报文段:三类首部单位、因特网检验和、IPv4 分片、封装效率和伪首部。
- 2 题型 - 连接控制:握手/挥手、状态、
seq/ack、慢开始、RTT/MSL 和窗口综合计算。
相关知识
- 科目导航:计算机网络导航
- 阅读顺序:上一篇:移动 IP · 下一篇:IP、UDP、TCP 报文段
5.11 本节复盘
- 运输层用端口把主机到主机通信扩展为进程到进程通信;TCP 连接由四元组区分。
- UDP 无连接、保留报文边界、首部 8 B;TCP 面向连接、提供可靠有序字节流。
- TCP 有数据且无 SYN 时,
seq指数据首字节;若带 SYN 则指 SYN 本身,同段数据从seq+1起。ack指下一期待序号;SYN 和 FIN 各消耗 1 个序号,纯 ACK 不消耗序号。 - 三次握手同步双方序号,四次挥手分别关闭两个方向;主动关闭端等待
2MSL。 - TCP 依靠累计/延迟确认、RTO、快速重传和失序缓存实现可靠传输;实际发送窗口为
rwnd与cwnd的较小者。 - 零窗口由持续计时器和窗口探测解除;流量控制保护接收缓存,拥塞控制保护网络资源。
- 慢开始按 RTT 近似指数增长,拥塞避免近似线性增长;超时回到 1 MSS,3 个重复 ACK 触发快速重传,Reno 随后快速恢复。
