跳转至

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 地址的协议:

  1. Discover:客户端广播发现 DHCP 服务器
  2. Offer:服务器提供可用 IP 地址
  3. Request:客户端请求使用该地址
  4. 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)

快重传后:

  1. ssthresh = cwnd / 2
  2. cwnd = ssthresh + 3 MSS
  3. 进入拥塞避免(而非慢启动)
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 地址(数据链路层地址):

  1. 发送 ARP 广播请求:"谁的 IP 是 192.168.1.1?"
  2. 目标主机回复:"我是 192.168.1.1,MAC 是 xx:xx:xx:xx:xx:xx"
  3. 结果缓存在 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 才能充分利用带宽。


导航


评论 #