第3章:传输层(Transport Layer)
一、导读
3.1 本章学习目标
传输层是网络协议栈中最关键的一层,它负责在端到端之间提供可靠的数据传输服务。本章深入讲解 TCP 和 UDP 协议,重点分析 TCP 的可靠数据传输机制、流量控制和拥塞控制算法。
本章的核心学习目标包括:
- 理解传输层的功能:多路复用/分解、可靠数据传输、流量控制、拥塞控制
- 掌握 UDP 协议:无连接、不可靠、尽最大努力交付
- 掌握 TCP 协议:面向连接、可靠传输、流量控制、拥塞控制
- 理解 TCP 的三次握手和四次挥手
- 掌握 TCP 的可靠数据传输机制:序号、确认、重传
- 理解 TCP 的拥塞控制算法:慢启动、拥塞避免、快重传、快恢复
3.2 为什么传输层如此重要
传输层是端到端通信的核心。应用层协议(如 HTTP、SMTP)都依赖传输层提供的服务。理解传输层的工作原理,对于开发高性能网络应用、调试网络问题至关重要。
二、核心概念详解
2.1 多路复用与多路分解
传输层通过端口号(port number)实现多路复用和多路分解:
- 多路分解:将接收到的报文段交付给正确的 Socket(进程)
- 多路复用:将来自不同 Socket 的数据封装成报文段发送
进程1 ← Socket1 ← 报文段1
进程2 ← Socket2 ← 报文段2
进程3 ← Socket3 ← 报文段32.2 UDP 协议
UDP(User Datagram Protocol)是最简单的传输层协议:
- 无连接:不需要建立连接
- 不可靠:不保证交付、不保证顺序、不重传
- 尽最大努力交付:如果分组丢失,UDP 不会重传
UDP 的优点是开销小、延迟低,适合实时应用(如视频、语音)。
UDP 报文段格式:
+--------+--------+--------+--------+
| 源端口 | 目的端口 | 长度 | 校验和 |
+--------+--------+--------+--------+
| 数据(payload) |
+------------------------------------+2.3 TCP 协议
TCP(Transmission Control Protocol)是面向连接的可靠传输协议:
- 面向连接:通信前需要建立连接(三次握手)
- 可靠传输:保证数据无差错、按序、不丢失、不重复
- 流量控制:防止发送方发送过快,接收方来不及处理
- 拥塞控制:防止发送方发送过快,网络承受不了
2.3.1 TCP 报文段格式
+--------+--------+-------------------+
| 源端口 | 目的端口 | 序号 |
+--------+--------+-------------------+
| 确认号 | 数据偏移 | 保留 | 标志位 |
+-------------------+--------+------+-----+
| 窗口大小 | 校验和 | 紧急指针 | 选项 |
+--------+--------+--------+--------------+
| 数据 |
+----------------------------------------+关键标志位:
- SYN:同步(建立连接)
- ACK:确认
- FIN:结束(释放连接)
- RST:重置
2.3.2 TCP 的三次握手
客户端 服务器
| |
|--- SYN (seq=x) -------->|
| |
|<-- SYN+ACK (seq=y, ack=x+1) ---|
| |
|--- ACK (ack=y+1) ------>|
| |
| 连接建立完成 |为什么需要三次握手?
- 防止已失效的连接请求到达服务器,导致错误建立连接
- 双方确认对方的发送和接收能力
2.3.3 TCP 的四次挥手
客户端 服务器
| |
|--- FIN (seq=u) -------->|
| |
|<-- ACK (ack=u+1) -------|
| |
| (服务器继续发送剩余数据)|
| |
|<-- FIN (seq=w) ---------|
| |
|--- ACK (ack=w+1) ------>|
| |
| (等待 2MSL 后关闭) |为什么需要四次挥手?
- TCP 是全双工的,每个方向的关闭需要独立进行
- 为什么需要 TIME_WAIT(2MSL)?确保最后一个 ACK 能到达服务器
2.4 可靠数据传输
TCP 通过以下机制实现可靠传输:
2.4.1 序号和确认号
- 序号(seq):报文段第一个字节的序号
- 确认号(ack):期望收到的下一个字节的序号
2.4.2 超时重传
发送方在发送报文段后启动定时器,如果在超时时间内没有收到确认,就重传该报文段。
2.4.3 流水线传输
为了提高效率,TCP 允许发送方连续发送多个报文段,而不需要等待确认。
2.5 流量控制
流量控制防止发送方发送过快,接收方来不及处理。TCP 通过滑动窗口机制实现流量控制:
- 接收方在 ACK 中通告窗口大小(rwnd)
- 发送方根据 rwnd 调整发送速率
发送窗口 = min(cwnd, rwnd)2.6 拥塞控制
拥塞控制防止发送方发送过快,网络承受不了。TCP 通过拥塞窗口(cwnd)实现拥塞控制:
2.6.1 慢启动(Slow Start)
连接建立初期,cwnd 从 1 个 MSS 开始,每收到一个 ACK,cwnd 加倍。直到 cwnd 达到 ssthresh。
cwnd: 1 → 2 → 4 → 8 → 16 → ...2.6.2 拥塞避免(Congestion Avoidance)
当 cwnd 达到 ssthresh 后,进入拥塞避免阶段,cwnd 每个 RTT 增加 1 个 MSS。
cwnd: 10 → 11 → 12 → 13 → ...2.6.3 快重传(Fast Retransmit)
收到 3 个重复 ACK 时,立即重传丢失的报文段,而不等待超时。
2.6.4 快恢复(Fast Recovery)
快重传后,ssthresh = cwnd/2,cwnd = ssthresh + 3,然后进入拥塞避免阶段。
三、重要知识点
3.1 TCP 的状态机
TCP 连接的生命周期可以用状态机描述:
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED3.2 TCP 的公平性
TCP 的拥塞控制算法使得多个 TCP 连接能够公平地共享链路带宽。每个连接根据丢包率调整发送速率,最终达到平衡。
3.3 TCP 与 UDP 的对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠 |
| 顺序 | 保证顺序 | 不保证 |
| 流量控制 | 有 | 无 |
| 拥塞控制 | 有 | 无 |
| 头部开销 | 20 字节 | 8 字节 |
| 适用场景 | Web、邮件、文件传输 | 视频、语音、DNS |
四、常见误区与难点
4.1 误区一:"TCP 保证数据一定能到达"
TCP 保证在正常情况下数据能可靠交付,但如果网络故障、对端崩溃等异常情况,TCP 也会放弃。
4.2 误区二:"三次握手是为了防止攻击"
三次握手的主要目的是同步双方的初始序号,防止已失效的连接请求导致错误建立连接是附带好处。
4.3 难点:理解拥塞控制算法
拥塞控制是 TCP 最复杂的部分。需要理解慢启动、拥塞避免、快重传、快恢复四个阶段的转换条件。
五、实践应用
5.1 使用 netstat 查看 TCP 连接
# 查看所有 TCP 连接
netstat -an | grep tcp
# 查看连接状态
netstat -ant | awk '{print $6}' | sort | uniq -c5.2 使用 Wireshark 分析 TCP
启动 Wireshark,过滤 tcp
观察三次握手过程
分析序号和确认号的变化
观察超时重传和快重传
5.3 使用 tcpdump 抓包
# 抓取 TCP 报文
sudo tcpdump -i eth0 tcp -w tcp.pcap
# 分析抓包文件
tcpdump -r tcp.pcap六、本章小结
第3章讲解了传输层的核心协议:
UDP 是无连接的不可靠协议,开销小、延迟低
TCP 是面向连接的可靠协议,提供流量控制和拥塞控制
三次握手 建立连接,四次挥手 释放连接
可靠传输 通过序号、确认、重传实现
拥塞控制 通过慢启动、拥塞避免、快重传、快恢复实现
后续章节将深入网络层,讲解 IP 协议和路由算法。