03

传输层

端到端的可靠传输

阅读量:2 · 预计 6 分钟读完

UDPTCP可靠数据传输流量控制拥塞控制三次握手
阅读进度8%

第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 ← 报文段3

2.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 → CLOSED

3.2 TCP 的公平性

TCP 的拥塞控制算法使得多个 TCP 连接能够公平地共享链路带宽。每个连接根据丢包率调整发送速率,最终达到平衡。

3.3 TCP 与 UDP 的对比

特性TCPUDP
连接面向连接无连接
可靠性可靠不可靠
顺序保证顺序不保证
流量控制有无
拥塞控制有无
头部开销20 字节8 字节
适用场景Web、邮件、文件传输视频、语音、DNS

四、常见误区与难点

4.1 误区一:"TCP 保证数据一定能到达"

TCP 保证在正常情况下数据能可靠交付,但如果网络故障、对端崩溃等异常情况,TCP 也会放弃。

4.2 误区二:"三次握手是为了防止攻击"

三次握手的主要目的是同步双方的初始序号,防止已失效的连接请求导致错误建立连接是附带好处。

4.3 难点:理解拥塞控制算法

拥塞控制是 TCP 最复杂的部分。需要理解慢启动、拥塞避免、快重传、快恢复四个阶段的转换条件。


五、实践应用

5.1 使用 netstat 查看 TCP 连接

bash
# 查看所有 TCP 连接
netstat -an | grep tcp

# 查看连接状态
netstat -ant | awk '{print $6}' | sort | uniq -c

5.2 使用 Wireshark 分析 TCP

启动 Wireshark,过滤 tcp

观察三次握手过程

分析序号和确认号的变化

观察超时重传和快重传

5.3 使用 tcpdump 抓包

bash
# 抓取 TCP 报文
sudo tcpdump -i eth0 tcp -w tcp.pcap

# 分析抓包文件
tcpdump -r tcp.pcap

六、本章小结

第3章讲解了传输层的核心协议:

UDP 是无连接的不可靠协议,开销小、延迟低

TCP 是面向连接的可靠协议,提供流量控制和拥塞控制

三次握手 建立连接,四次挥手 释放连接

可靠传输 通过序号、确认、重传实现

拥塞控制 通过慢启动、拥塞避免、快重传、快恢复实现

后续章节将深入网络层,讲解 IP 协议和路由算法。