传输层

官方信息技术老师·12 页·深入(追求细节与边界)·0 次浏览·3 天前
TCP/UDP拥塞控制可靠性状态机

传输层

穿透TCP/UDP每一层机制,看清可靠传输的设计权衡与异常路径

按 空格/→ 演示下一步

1 / 12 页

全部页面点击任意一页,跳回舞台从这页播放

TCP/UDP拥塞控制可靠性状态机

传输层

穿透TCP/UDP每一层机制,看清可靠传输的设计权衡与异常路径

1第 1 页 · 传输层

传输层概述

你电脑同时打开网页、看直播、聊 QQ——三个应用的数据在网线上并行传输。系统怎么知道哪个包该交给哪个应用?网络层只负责把包送到主机,剩下的「最后一公里」由传输层完成。

端到端定位
负责进程到进程通信;网络层只到主机到主机
端口与多路复用
用 16 位端口号(0~65535)区分同一主机上的不同应用进程
两大核心协议
TCP 面向连接、可靠有序;UDP 无连接、尽力交付
典型应用映射
HTTP/邮件/文件传输走 TCP;DNS 查询/实时音视频走 UDP
快递门牌号系统对应 →传输层寻址与多路复用

网络层是城市间运输,传输层负责把包裹送到具体收件人手里

2第 2 页 · 传输层概述

用户数据报协议 UDP

上一页我们看了传输层的整体定位,这一页进入其中最轻的协议——UDP。它几乎不做额外工作:把应用层的数据加上一个 8 字节的小信封就发出去。

无连接
通信前不握手,发送方直接把数据报发出去
不可靠
不确认、不重传、不排序、不去重,丢了不补
面向报文
保留应用层消息边界,不拆分也不合并
首部小开销低
固定 8 字节首部,适合小报文高频传输
典型应用
DNS 查询、视频直播、实时游戏、语音通话
寄明信片对应 →UDP 发数据报

写好地址投筒即走,不挂号不签收,便宜但可能丢

3第 3 页 · 用户数据报协议 UDP

通信模型

上一页讲了 UDP 是「发完就走」的简单模式。但浏览网页、看视频、远程登录这些真实应用,通信远比一次发包复杂。先把通信模型拆清楚,下一页 TCP 的可靠传输才有立足点。

端到端通信
传输层在两端主机的进程间建立逻辑信道,IP 只管到主机
C/S 架构
客户端主动发起请求,服务器在固定端口监听并响应
面向连接
通信前先握手建立通道,全程维护状态再传数据(TCP)
无连接
无需握手,每个数据报独立路由、互不关联(UDP)
寄信对应 →两种通信模型

平信是 UDP——写好地址寄出就完;挂号信是 TCP——要签收回执、全程可追

4第 4 页 · 通信模型

TCP数据段

上一页我们看到 UDP 把数据扔出去就不管了,TCP 要做到可靠,就必须给每个数据包附加更多信息——这个被打包好的单元,就叫 TCP 段。

段的结构
由 20~60 字节头部和数据负载两部分组成
端口号字段
源端口与目的端口标识通信两端的进程
序号与确认号
给每个字节编号,确认号告知已收到位置
控制标志位
SYN/ACK/FIN 等比特控制连接状态切换
窗口与校验和
窗口字段做流量控制,校验和检测传输错误
挂号信对应 →TCP 段

信头=挂号单(寄件人/收件人/单号),信纸=数据负载

$\text{Header}=\underbrace{20}_{\text{固定}}+\underbrace{0\sim 40}_{\text{选项}}\ \text{字节}$
5第 5 页 · TCP数据段

TCP三次握手建立连接

你点开网页时TCP在背后悄悄握手三次。本节把上一节段首部的SYN标志位真正用起来——为什么建立连接要三次报文,而不是两次?

三个报文
客户端发SYN,服务端回SYN+ACK,客户端再回ACK,三次才算齐
初始序号ISN
双方各随机选一个32位起始序号,防止旧报文扰乱新连接
状态变迁
客户端CLOSED→SYN_SENT→ESTABLISHED,服务端多经SYN_RCVD中转
为何必须三次
两次无法确认客户端收发能力,且不能阻止旧SYN造成错误连接
顺带协商参数
SYN段可携带MSS、窗口缩放等选项,影响后续传输效率
酒店办入住对应 →三次握手建立连接

客人亮证件→前台递表→客人签字交回,每步都在双向确认,缺一不可

6第 6 页 · TCP三次握手建立连接

TCP连接释放

三次握手建起了通话,怎么收尾?打电话你说「我挂了」,对方答「好」——但他也得说「我也挂了」才能真结束。TCP全双工,两个方向独立关闭,所以比建立多一步。

四次挥手
FIN→ACK→FIN→ACK,每对FIN/ACK独立关闭一个方向
半关闭
单向关闭后另一方向仍可传数据,类似「我说完了,但你还能说」
TIME_WAIT
主动方等待2MSL,保证最后ACK能重发并消化旧报文
状态机
FIN_WAIT_1/2、CLOSE_WAIT、LAST_ACK、TIME_WAIT五种状态
两人挂电话对应 →TCP四次挥手

你说挂、我答好、我又说挂、你答好——两次「我说+你答」是因为两个方向独立

7第 7 页 · TCP连接释放

TCP传输策略

三次握手把通道打开后,真正困难的部分才开始——怎么把数据又快又稳地送过去?TCP 并非「一上来就猛发」,而是用一组策略边发边探、边发边调。

慢启动
cwnd 从 1 MSS 起步,每个 RTT 翻倍,指数式试探网络容量
拥塞避免
越过阈值 ssthresh 后每 RTT 仅加 1 MSS,线性增长避免触顶
快重传
收到 3 个重复 ACK 立即重传,不必等超时定时器
快恢复
快重传后 cwnd 减半直接进入拥塞避免,不重启慢启动
向漏斗注水对应 →TCP 传输策略

细水试探→稳流→堵了快停→减流继续,对应四种状态切换

cwnd{2cwnd慢启动cwnd+1拥塞避免\text{cwnd} \gets \begin{cases} 2\,\text{cwnd} & \text{慢启动} \\ \text{cwnd}+1 & \text{拥塞避免} \end{cases}
8第 8 页 · TCP传输策略

TCP拥塞控制

当很多人同时下载,网络就像一条突然拥挤的高速路:TCP不能只管重发,还要主动放慢发送。拥塞控制决定“我还能发多快”。

拥塞控制
发送端依据网络拥塞调节发送速率,避免把网络压垮;不同于接收端流量控制
cwnd与ssthresh
cwnd限制在途未确认数据,ssthresh划分慢启动与拥塞避免两个阶段
慢启动与避免
初始阶段每RTT近似将cwnd翻倍;超过ssthresh后,每RTT约加1 MSS
AIMD与回退
AIMD是加性增大、乘性减小;重复ACK触发快重传与快恢复,超时更保守,网页、文件与流媒体等TCP业务都受影响
城市道路车流对应 →TCP拥塞控制

道路畅通时逐步加速,堵车时降速;车辆限速对应窗口的增大、减小

9第 9 页 · TCP拥塞控制

TCP定时器等

上一页讲完四次挥手收尾,但其实TCP运行中后台有几个定时器在并行工作,分别应对不同异常。这一页把它们摆出来,看各自管什么、超时时间怎么算。

重传计时器
最核心:超时未收到ACK就重发,是可靠传输的兜底
坚持计时器
接收方窗口为0时,周期性发零窗口探测报文,防止死等
保活计时器
连接长时间无数据时探测对方是否仍存活,默认约2小时
2MSL定时器
主动关闭方等2倍MSL再彻底关闭,确保最后ACK到达且旧报文段消失
RTT与RTO计算
Jacobson/Karels算法平滑估算往返时间,定量决定超时阈值
打电话时的耐心与试探对应 →TCP的多个定时器

重传=没说应再说;坚持=忙时小声问;保活=沉默问还在吗;2MSL=挂后等一下

RTO=RTTs+4RTTdRTO = RTT_s + 4 \cdot RTT_d
10第 10 页 · TCP定时器等

本节要点

  • UDP不保证到达,TCP以序号+确认+重传保证可靠
  • 三次握手实质是双向确认收发能力,两次不够
  • 滑动窗口同时管流量与可靠传输,是效率关键
  • 拥塞控制是慢启动→避免→快恢复的动态循环
  • TIME_WAIT等2MSL是为防旧报文段迷途干扰
延伸主题:QUIC如何重做传输层网络层与传输层拥塞协同实时传输与流量工程
11第 11 页 · 本节要点

课后思考

先独立思考,再对照参考答案。重点不是答对,而是把思考过程走通。

1为什么TCP建立连接要三次握手,而关闭连接却要四次挥手?多出来那一次在做什么?

参考答案建立时SYN和ACK可以合并在同一次往返里传递,三次就够了。关闭时因为TCP是全双工的,每一方都要单独发FIN并收ACK,所以是四次。多出来的那次,是为了让被动关闭方能把剩余数据发完再正式关闭。

2假设你要设计一个支持百万用户同时观看的视频直播系统,要求低延迟、偶尔丢帧可接受。你会选UDP还是TCP?为什么?

参考答案选UDP。直播对实时性的要求远高于完整性,偶尔丢帧可以用后续帧掩盖;TCP的重传和拥塞控制会引入明显延迟,破坏流畅度。一般在UDP之上自己实现必要的可靠性,比如选择性重传。

3假如未来物理网络能做到零丢包、零延迟,TCP里哪些机制会失去意义?哪些仍然必要?

参考答案重传、超时、拥塞控制中针对丢包的部分会失去意义。但流量控制(防发送方压垮接收方)和连接管理(三次握手、四次挥手)仍然必要——这些约束来自通信双方的处理能力与状态同步,而不是网络本身。

12第 12 页 · 课后思考
传输层 · 知识图解