TCP/IP 协议栈
1. 五层模型
┌──────────────────────────────────────────┐
│ 应用层 (Application) │ HTTP, DNS, SMTP, FTP, SSH
├──────────────────────────────────────────┤
│ 传输层 (Transport) │ TCP, UDP
├──────────────────────────────────────────┤
│ 网络层 (Network) │ IP, ICMP, ARP
├──────────────────────────────────────────┤
│ 数据链路层 (Data Link) │ Ethernet, Wi-Fi, PPP
├──────────────────────────────────────────┤
│ 物理层 (Physical) │ 电信号、光信号、无线电
└──────────────────────────────────────────┘
| 层 | PDU 名称 | 核心功能 | 关键协议 |
|---|---|---|---|
| 应用层 | 消息 (Message) | 应用功能 | HTTP, DNS, SMTP |
| 传输层 | 段 (Segment) | 端到端可靠传输 / 多路复用 | TCP, UDP |
| 网络层 | 包 (Packet) | 路由、寻址 | IP, ICMP |
| 数据链路层 | 帧 (Frame) | 相邻节点间传输 | Ethernet, 802.11 |
| 物理层 | 比特 (Bit) | 物理介质传输 | RJ45, 光纤 |
封装过程:
\[
\text{Data} \xrightarrow{+\text{TCP/UDP头}} \text{Segment} \xrightarrow{+\text{IP头}} \text{Packet} \xrightarrow{+\text{帧头+帧尾}} \text{Frame} \xrightarrow{} \text{Bits}
\]
2. 网络层:IP 协议
2.1 IPv4 地址
32 位地址,通常用点分十进制表示(如 192.168.1.1)。
CIDR(无类别域间路由)
\[
\text{IP 地址} = \underbrace{\text{网络前缀}}_{n \text{ bits}} + \underbrace{\text{主机部分}}_{32-n \text{ bits}}
\]
表示法:192.168.1.0/24(前 24 位为网络地址,剩余 8 位为主机地址)。
子网划分
将一个大网络划分为多个子网:
| 网络 | CIDR | 子网掩码 | 可用主机数 |
|---|---|---|---|
10.0.0.0/8 |
A 类(私有) | 255.0.0.0 | \(2^{24} - 2\) |
172.16.0.0/12 |
B 类(私有) | 255.240.0.0 | \(2^{20} - 2\) |
192.168.0.0/16 |
C 类(私有) | 255.255.0.0 | \(2^{16} - 2\) |
\[
\text{可用主机数} = 2^{32-n} - 2 \quad (\text{减去网络地址和广播地址})
\]
2.2 IPv6
128 位地址,以冒号分隔的 8 组十六进制表示:2001:0db8:85a3::8a2e:0370:7334
- 地址空间:\(2^{128} \approx 3.4 \times 10^{38}\)
- 无需 NAT、内置 IPSec、简化的头部
- 采用渐进,IPv4/IPv6 双栈过渡
2.3 NAT(Network Address Translation)
将私有 IP 地址转换为公网 IP 地址:
内部: 192.168.1.100:5000 ──NAT──> 外部: 203.0.113.1:12345
内部: 192.168.1.101:5000 ──NAT──> 外部: 203.0.113.1:12346
- 优势:节约公网 IP、隐藏内部网络结构
- 劣势:破坏端到端透明性、P2P 通信困难(需 NAT 穿透技术如 STUN/TURN)
2.4 DHCP(Dynamic Host Configuration Protocol)
自动分配 IP 地址的协议:
- Discover:客户端广播发现 DHCP 服务器
- Offer:服务器提供可用 IP 地址
- Request:客户端请求使用该地址
- Acknowledge:服务器确认
同时分配:IP 地址、子网掩码、默认网关、DNS 服务器。
2.5 ICMP
Internet Control Message Protocol——网络诊断和错误报告:
| 类型 | 用途 |
|---|---|
| Echo Request/Reply | ping 命令 |
| Destination Unreachable | 目标不可达 |
| Time Exceeded | TTL 耗尽(traceroute 利用此特性) |
| Redirect | 通知主机更优路由 |
3. 传输层:TCP
3.1 TCP 特性
- 面向连接:通信前需建立连接
- 可靠传输:确认、重传、序号保证数据完整有序
- 流量控制:接收方控制发送速率
- 拥塞控制:感知网络拥塞并调整发送速率
- 全双工:双向同时传输
- 字节流:无消息边界
3.2 三次握手(Connection Establishment)
sequenceDiagram
participant C as 客户端
participant S as 服务器
C->>S: SYN, seq=x
Note right of S: SYN_RCVD
S->>C: SYN+ACK, seq=y, ack=x+1
Note left of C: ESTABLISHED
C->>S: ACK, seq=x+1, ack=y+1
Note right of S: ESTABLISHED
为什么需要三次? 防止历史重复连接请求(旧 SYN)导致错误建立连接。
3.3 四次挥手(Connection Termination)
sequenceDiagram
participant C as 客户端
participant S as 服务器
C->>S: FIN, seq=u
Note right of S: CLOSE_WAIT
S->>C: ACK, ack=u+1
Note left of C: FIN_WAIT_2
Note right of S: 可能还有数据要发送...
S->>C: FIN, seq=v
Note left of C: TIME_WAIT
C->>S: ACK, ack=v+1
Note right of S: CLOSED
Note left of C: 等待 2MSL 后 CLOSED
TIME_WAIT 状态:持续 2×MSL(Maximum Segment Lifetime,通常 60 秒),确保最后一个 ACK 到达对方,以及等待旧报文过期。
3.4 TCP 状态机
stateDiagram-v2
[*] --> CLOSED
CLOSED --> LISTEN: 被动打开
CLOSED --> SYN_SENT: 主动打开,发送 SYN
LISTEN --> SYN_RCVD: 收到 SYN,发送 SYN+ACK
SYN_SENT --> ESTABLISHED: 收到 SYN+ACK,发送 ACK
SYN_RCVD --> ESTABLISHED: 收到 ACK
ESTABLISHED --> FIN_WAIT_1: 主动关闭,发送 FIN
ESTABLISHED --> CLOSE_WAIT: 收到 FIN,发送 ACK
FIN_WAIT_1 --> FIN_WAIT_2: 收到 ACK
FIN_WAIT_1 --> CLOSING: 收到 FIN,发送 ACK
FIN_WAIT_2 --> TIME_WAIT: 收到 FIN,发送 ACK
CLOSING --> TIME_WAIT: 收到 ACK
CLOSE_WAIT --> LAST_ACK: 发送 FIN
LAST_ACK --> CLOSED: 收到 ACK
TIME_WAIT --> CLOSED: 2MSL 超时
3.5 流量控制(Flow Control)
滑动窗口(Sliding Window)机制:
- 接收方通过 rwnd(Receive Window) 告知发送方自己还能接收多少数据
- 发送方的发送窗口 ≤ rwnd
- 防止发送方淹没接收方缓冲区
\[
\text{发送窗口} = \min(\text{rwnd}, \text{cwnd})
\]
其中 cwnd 为拥塞窗口(拥塞控制决定)。
3.6 拥塞控制(Congestion Control)
TCP 通过调节 cwnd(Congestion Window) 探测网络容量。
慢启动(Slow Start)
- 初始 cwnd = 1 MSS(或 10 MSS,Linux 默认)
- 每收到一个 ACK,cwnd += 1 MSS → 指数增长
- 增长到 ssthresh(慢启动阈值) 时转入拥塞避免
\[
\text{cwnd}_{n+1} = \text{cwnd}_n \times 2 \quad (\text{每个 RTT 翻倍})
\]
拥塞避免(AIMD: Additive Increase Multiplicative Decrease)
- 每个 RTT:cwnd += 1 MSS(加性增)
- 检测到丢包:cwnd = cwnd / 2(乘性减)
快重传(Fast Retransmit)
收到 3 个重复 ACK → 立即重传丢失的报文段(不等超时)。
快恢复(Fast Recovery)
快重传后:
- ssthresh = cwnd / 2
- cwnd = ssthresh + 3 MSS
- 进入拥塞避免(而非慢启动)
cwnd
^
| /\
| / \ /\
| / \ / \ /
| / \ / \ /
| / \ / \ /
| / 慢启动 \/ 拥塞避免
| / (指数增) (线性增)
| /
+──────────────────────────> 时间
^ ^
| |
ssthresh 丢包(cwnd/2)
现代拥塞控制算法
| 算法 | 特点 |
|---|---|
| Reno | 经典 AIMD + 快重传快恢复 |
| Cubic | Linux 默认;cwnd 随时间的三次函数增长 |
| BBR | Google 开发;基于带宽和延迟估计而非丢包 |
| QUIC (HTTP/3) | 用户空间拥塞控制,更灵活 |
4. 传输层:UDP
4.1 特性
- 无连接:无需握手
- 不可靠:无确认、无重传、无排序
- 低开销:头部仅 8 字节(vs TCP 20+ 字节)
- 保留消息边界:每次 send 对应一个数据报
4.2 适用场景
| 场景 | 原因 |
|---|---|
| DNS 查询 | 单次请求-响应,低延迟 |
| 实时音视频 | 容忍丢包,不容忍延迟 |
| 游戏 | 低延迟优先于可靠性 |
| IoT 传感器 | 资源受限设备 |
| QUIC(HTTP/3) | 在 UDP 上构建可靠传输 |
4.3 UDP 头部
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| 源端口号 | 目的端口号 |
+--------+--------+--------+--------+
| 长度 | 校验和 |
+--------+--------+--------+--------+
| 数据 ... |
5. 端口与多路复用
- 知名端口(0-1023):HTTP=80, HTTPS=443, DNS=53, SSH=22
- 注册端口(1024-49151):应用程序注册
- 动态端口(49152-65535):客户端临时使用
多路复用/解复用:传输层通过(源IP, 源端口, 目的IP, 目的端口, 协议)五元组将数据分发给正确的应用进程。
6. 网络地址解析
ARP(Address Resolution Protocol)
将 IP 地址解析为 MAC 地址(数据链路层地址):
- 发送 ARP 广播请求:"谁的 IP 是 192.168.1.1?"
- 目标主机回复:"我是 192.168.1.1,MAC 是 xx:xx:xx:xx:xx:xx"
- 结果缓存在 ARP 表中
7. 路由
7.1 路由表
每个主机/路由器维护路由表,包含:
| 字段 | 含义 |
|---|---|
| 目的网络 | 目标 IP 网段 |
| 下一跳 | 转发给哪个路由器 |
| 接口 | 从哪个网络接口发出 |
| 度量值 | 路由优先级 |
最长前缀匹配(Longest Prefix Match):多条路由匹配时选择前缀最长(最具体)的。
7.2 路由协议
| 协议 | 类型 | 算法 | 适用范围 |
|---|---|---|---|
| RIP | 距离向量 | Bellman-Ford | 小型网络 |
| OSPF | 链路状态 | Dijkstra | 企业内网(AS 内) |
| BGP | 路径向量 | 策略路由 | 互联网骨干(AS 间) |
8. 网络性能指标
| 指标 | 定义 | 单位 |
|---|---|---|
| 带宽(Bandwidth) | 链路最大传输速率 | bps |
| 吞吐量(Throughput) | 实际传输速率 | bps |
| 延迟(Latency) | 数据从源到目的的总时间 | ms |
| RTT | 往返时间 | ms |
| 丢包率 | 丢失包/总包 | % |
\[
\text{延迟} = t_{\text{传播}} + t_{\text{传输}} + t_{\text{排队}} + t_{\text{处理}}
\]
\[
t_{\text{传播}} = \frac{\text{距离}}{\text{光速/介质速度}}, \quad t_{\text{传输}} = \frac{\text{包大小}}{\text{带宽}}
\]
带宽-延迟积(BDP):
\[
\text{BDP} = \text{Bandwidth} \times \text{RTT}
\]
BDP 表示网络管道中能容纳的最大数据量,TCP 窗口大小应 ≥ BDP 才能充分利用带宽。