哈喽各位小伙伴!第3章运输层的学习到这里就要告一段落啦!这一章的内容真的很多,从运输层概述到多路复用分解,从 UDP 到可靠数据传输原理,从 TCP 到拥塞控制,还有 QUIC 等新协议。今天我们就来好好复盘一下,做做习题,再用 Wireshark 亲手抓几个包,把理论和实践结合起来!
一、本章知识树

先来看一下这一章的"知识树",帮大家梳理一下整体脉络:
- 运输层概述:运输层 vs 网络层、逻辑通信、TCP vs UDP
- 多路复用与分解:端口号、UDP 二元组、TCP 四元组
- UDP:无连接、8字节首部、检验和、端到端原则
- 可靠数据传输原理:rdt1.0→rdt3.0、流水线、GBN、选择重传
- TCP:报文段结构、RTT估计、可靠传输、流量控制、连接管理
- 拥塞控制:拥塞原因、端到端 vs 网络辅助、TCP 拥塞控制(慢启动/拥塞避免/快速恢复)、AIMD、公平性、CUBIC/BBR
- 运输层演化:QUIC 协议、HTTP/3、连接迁移、多路复用
二、重要知识点回顾
1. 运输层 vs 网络层
网络层 负责主机之间的逻辑通信,运输层负责应用进程之间的逻辑通信。网络层是"送货到小区",运输层是"送货到家门"。运输层只在端系统中实现,路由器不参与运输层的处理。
2. 多路复用与分解
多路复用 :发送方多个应用进程共用一个运输层。
多路分解:接收方运输层把数据分发给正确的应用进程。
端口号就是用来做这件事的:
- UDP 分解:只用目的端口号(二元组:目的IP、目的端口)
- TCP 分解:用四元组(源IP、源端口、目的IP、目的端口)
3. UDP
UDP 很简单:无连接、不保证可靠、没有拥塞控制、首部只有8字节。但正因为简单,它速度快、开销小,适合 DNS、视频会议、直播等场景。UDP 的检验和是端到端原则的体现------哪怕链路层已经校验过了,运输层还要再校验一遍。
4. 可靠数据传输原理
这是本章的重点也是难点。我们从最简单的 rdt1.0 开始,一步步加入功能:
- rdt1.0:完美信道,啥也不用管
- rdt2.0:比特差错,加了检验和、确认、重传
- rdt2.1/2.2:处理重复的 ACK,加了序号
- rdt3.0:处理丢包,加了定时器和超时重传
- 流水线:提高效率,不用等一个确认再发下一个
- GBN(回退N步):滑动窗口,累积确认,丢了就全部重传
- 选择重传:只重传丢的,窗口内各自独立确认
5. TCP
TCP 是本章的重头戏:
- 报文段结构:源端口、目的端口、序号、确认号、首部长度、标志位、接收窗口、检验和、紧急数据指针、选项
- RTT 估计:SampleRTT → EstimatedRTT → DevRTT → TimeoutInterval
- 可靠传输:基于流水线的 GBN + 选择重传的混合体,超时重传 + 快速重传
- 流量控制:接收窗口 rwnd,防止发送方发太快把接收方缓存撑爆
- 连接管理:三次握手建立连接,四次挥手关闭连接,SYN 洪泛攻击
6. 拥塞控制
拥塞控制也是本章的重点:
- 拥塞的代价:丢包、时延增加、资源浪费
- 两种方法:端到端拥塞控制(TCP 用的)和 网络辅助拥塞控制(ATM 等)
- TCP 拥塞控制四件套:慢启动、拥塞避免、快速重传、快速恢复
- AIMD 原则:加性增乘性减,实现公平性
- 现代算法:CUBIC(Linux 默认)、BBR(Google 的)
- ECN:显式拥塞通知,网络设备直接标记拥塞
7. QUIC 与运输层演化
QUIC 是下一代传输协议,基于 UDP,提供 TCP 的可靠性和更多特性:0-RTT/1-RTT 握手、多路复用、连接迁移、内置加密。HTTP/3 就是基于 QUIC 的。
三、课后习题精选

复习题
1. 为什么运输层能够提供逻辑通信?
运输层在端系统之间运行,它把应用进程的数据封装起来,通过网络层发送出去。对于应用进程来说,就好像两个进程之间有一条直接的"管道"一样,不用关心底下的网络是怎么传的。这就是逻辑通信的含义------不是真的有一条物理线路,而是从效果上看起来像有。
2. UDP 和 TCP 最主要的区别是什么?
最大的区别就是可靠性。TCP 提供可靠的、按序的、面向连接的服务,还有流量控制和拥塞控制。UDP 提供无连接的、不可靠的数据报服务,啥额外功能都没有。
但 UDP 也不是一无是处:它简单、开销小、速度快,而且应用层可以更灵活地控制什么时候发、发多少。对于实时应用来说,UDP 往往是更好的选择。
3. 为什么需要端口号?
因为一台主机上同时跑着很多应用进程,每个进程都可能在收发网络数据。网络层只能把数据送到主机,但是送给哪个进程呢?这就需要端口号来区分了。端口号就像楼里的房间号,网络层把包裹送到楼里,运输层再根据房间号送到具体的住户。
4. 什么是停等协议?它有什么问题?
停等协议就是发一个分组,等确认,确认到了再发下一个。就像寄快递,寄一个等对方说收到了,再寄下一个。
问题就是效率太低了!如果信道的时延带宽积很大,发送方大部分时间都在等确认,信道利用率很低。所以才有了流水线协议(GBN、选择重传),一次发多个,提高效率。
5. TCP 的三次握手能不能改成两次?为什么?
不能!主要是为了防止过期的连接请求建立无效连接。如果只有两次握手,假设客户端发了一个 SYN,但是在路上堵了很久,客户端以为丢了就重发了一个。后来第一个 SYN 又到了服务器,服务器收到就会建立连接,但客户端根本不想建立这个连接,服务器就白白浪费资源了。
三次握手的第三次 ACK 就是让客户端确认"我确实想要建立这个连接",这样服务器才会真正建立连接。
6. 流量控制和拥塞控制有什么区别?
流量控制是接收方对发送方的限制,防止发送方发太快把接收方的缓存撑爆。这是端到端的问题。
拥塞控制是防止网络中间的路由器过载,是全局的问题。流量控制是"你别把我撑着了",拥塞控制是"别把路堵死了"。
7. 为什么 TCP 拥塞控制用 AIMD(加性增乘性减)?
AIMD 有几个好处:
- 公平性:多个流竞争同一条链路的带宽时,AIMD 能让它们最终均分带宽
- 简单:实现简单,不需要复杂的计算
- 分布式:每个发送方自己控制,不需要网络设备参与
慢启动是为了快速探测网络容量,拥塞避免阶段的 AIMD 是为了稳定地在公平点附近振荡。
习题
1. 假设一个 UDP 客户端向服务器发送了一个 UDP 数据报,源端口是 12345,目的端口是 53。服务器回复的时候,源端口和目的端口分别是什么?
答:服务器回复时,源端口是 53(服务器自己的端口),目的端口是 12345(客户端的端口)。就像你写信给别人,收信人地址写对方的,回信的时候对方把你的地址写在收信人位置。
2. 考虑一个 GBN 协议,发送窗口大小是 4,序号范围是 0-7。假设当前发送了 0、1、2 号分组,收到了 0 和 1 的 ACK,此时发送方还能发哪些序号的分组?
答:GBN 的发送窗口是 base, base+N-1。初始 base=0,窗口是 0, 1, 2, 3。收到 0 的 ACK 后 base 变成 1,窗口是 1, 2, 3, 4。收到 1 的 ACK 后 base 变成 2,窗口是 2, 3, 4, 5。
已经发了 0、1、2,所以还能发 3、4、5。
3. 假设 TCP 的 MSS 是 1000 字节,拥塞窗口是 10 个 MSS,RTT 是 100ms。此时的吞吐量大约是多少?
答:吞吐量 = 拥塞窗口大小 / RTT = (10 × 1000 × 8) / 0.1 = 800,000 bps = 800 kbps。
或者更简单地说,每 100ms 发 10 × 1000 = 10,000 字节,每秒就是 100,000 字节 = 800 kbps。
4. 如果 TCP 在拥塞避免阶段,cwnd = 20 MSS,此时检测到丢包(三个重复 ACK),cwnd 和 ssthresh 变成多少?(假设是 TCP Reno,有快速恢复)
答:ssthresh = cwnd / 2 = 10 MSS。然后进入快速恢复,cwnd = ssthresh + 3 = 13 MSS(因为收到了3个重复ACK)。之后每收到一个重复 ACK,cwnd 增加 1 MSS。等到收到新的 ACK 时,cwnd = ssthresh = 10 MSS,进入拥塞避免阶段。
如果是超时导致的丢包,那就不一样了:ssthresh = cwnd / 2 = 10 MSS,cwnd = 1 MSS,重新进入慢启动。
四、编程作业思路
教材第3章的编程作业通常是用套接字写一个可靠数据传输的程序,比如实现一个简单的 GBN 或选择重传协议。这里给大家一些思路:
1. 可靠文件传输
目标是在不可靠的 UDP 之上实现可靠的文件传输。你需要实现:
- 序号:给每个数据编号,接收方知道哪个收到了哪个没收到
- 确认 ACK:接收方发回确认,告诉发送方哪些收到了
- 超时重传:发送方设定时器,超时了就重传
- 校验和:检查数据有没有出错(可选,题目可能已经提供了丢包模拟)
可以先实现 GBN,再试试选择重传。GBN 相对简单,用累积确认就行。选择重传稍微复杂一点,接收方需要缓存乱序到达的分组。
2. 实现建议
1. 先用 UDP 把基本的收发跑通
2. 加入序号和 ACK 机制
3. 加入定时器和超时重传
4. 测试丢包场景,看能不能正确重传
5. 加上流量控制(可选)
做这个作业的时候,你会深刻体会到可靠数据传输的复杂性,也会更加理解 TCP 为什么要设计成那样。
五、Wireshark 实验
实验一:探究 TCP

第一个实验是抓 TCP 的包,看看 TCP 连接是怎么建立的,数据是怎么传输的,连接又是怎么关闭的。
实验步骤
- 打开 Wireshark,选择你的网卡,开始抓包
- 设置过滤条件 :输入
tcp,只看 TCP 包 - 访问一个网站:在浏览器里打开一个网页(比如 http://example.com)
- 停止抓包,找到 TCP 三次握手的包
观察内容
1. 三次握手
找到三个连续的包:
- 第一个包:SYN 标志位为 1,客户端 → 服务器
- 第二个包:SYN 和 ACK 标志位都为 1,服务器 → 客户端
- 第三个包:ACK 标志位为 1,客户端 → 服务器
看看这三个包的序号(Sequence Number)和确认号(Acknowledgment Number),理解三次握手的过程。
2. 数据传输
看看后面的数据包:
- 序号是怎么增长的?(每次增加发送的数据字节数)
- 确认号是怎么变化的?(确认号 = 对方的序号 + 收到的字节数)
- 接收窗口(Window Size)有多大?
3. 四次挥手
找到连接关闭的包:
- 第一个 FIN 包:一方说"我说完了"
- 第二个 ACK 包:另一方说"好的,我知道了"
- 第三个 FIN 包:另一方说"我也说完了"
- 第四个 ACK 包:一方说"好的,再见"
注意,有时候服务器会把 FIN 和 ACK 合并成一个包(第二个和第三个合并),看起来像三次挥手,这是正常的。
4. 流量控制
看看 Window Size 字段的值在传输过程中有没有变化。如果接收方处理不过来,窗口会不会变小?
5. 拥塞控制(选做)
这个观察起来比较难,因为你看不到对方的 cwnd。但是你可以用 Wireshark 的"Follow TCP Stream"功能,看看数据传输的速率变化,大概感受一下拥塞控制的效果。
实验二:探究 UDP

第二个实验是抓 UDP 的包,感受一下 UDP 的简单。
实验步骤
- 打开 Wireshark,开始抓包
- 设置过滤条件 :输入
udp或者dns(DNS 用的是 UDP) - 发起一个 DNS 查询 :在命令行里输入
nslookup www.baidu.com或者直接访问一个新网站 - 停止抓包,找到 UDP 包
观察内容
1. UDP 首部格式
点开一个 UDP 包,看看 UDP 的首部:
- 源端口(Source Port)
- 目的端口(Destination Port)
- 长度(Length)
- 检验和(Checksum)
对比一下 TCP 的首部,是不是简单多了?TCP 首部通常有 20 多字节,而 UDP 只有 8 字节。
2. DNS 查询和响应
找到 DNS 查询和响应的包:
- 查询包:客户端 → DNS 服务器(目的端口 53)
- 响应包:DNS 服务器 → 客户端(源端口 53)
看看 DNS 查询是用 UDP 发的,响应也是用 UDP 回来的。没有握手,没有确认,发出去就完事了。
3. 有没有丢包?
多做几次 DNS 查询,看看有没有丢包的情况。一般来说局域网内不太容易丢包,但如果你在弱网环境下,可能会看到 DNS 查询超时重传的情况------这就是应用层自己实现可靠性的例子。
你也可以试试发一个很大的 DNS 查询,看看会不会用 TCP 来传(DNS 超过 512 字节会改用 TCP)。
六、学习建议
第3章内容很多,也比较难,这里给大家一些学习建议:
- 画图理解:很多概念(比如三次握手、滑动窗口、拥塞控制)画个图就清楚了。光看文字可能会晕。
- 抓包实践:一定要用 Wireshark 亲手抓包看看,理论联系实践,印象才深刻。
- 动手编程:如果有时间,最好把编程作业做了。自己实现一遍可靠数据传输,比看十遍书都管用。
- 对比学习:TCP vs UDP、GBN vs 选择重传、流量控制 vs 拥塞控制、慢启动 vs 拥塞避免......对比着学,理解更透彻。
- 多看几遍:这一章比较难,看一遍不懂很正常。多看几遍,每一遍都会有新的收获。
七、小结
好啦,第3章运输层的内容到这里就全部结束了!这一章是计算机网络的核心章节之一,也是面试常考的重点。希望大家通过这一章的学习,对运输层有了深入的理解。
回顾一下我们学了什么:
- 运输层的作用和两种协议(TCP、UDP)
- 多路复用与分解的原理
- UDP 的特点和检验和
- 可靠数据传输的原理(从 rdt 到 GBN 到选择重传)
- TCP 的方方面面(报文段、RTT、可靠传输、流量控制、连接管理)
- 拥塞控制的原理和 TCP 拥塞控制
- 运输层的演化和 QUIC 协议
学完这一章,你应该能看懂很多网络问题了------为什么网页加载慢?为什么视频会卡?为什么换 WiFi 的时候应用会断连?这些问题的答案都在运输层里。
下一章我们将学习网络层,看看数据是怎么从一个网络走到另一个网络的。路由算法、IP 地址、路由器......更多精彩内容等着你!大家加油!