前置知识: Networking

OSI 与 TCP/IP 模型

7 min中级

OSI与TCP-IP模型深度:协议层次、数据封装、PDU与协议数据单元分析

前置知识

建议先阅读以下内容再进入本文:

1. OSI 七层模型详解

1.1 各层功能

层级名称功能PDU设备
7应用层网络服务接口数据网关
6表示层数据格式转换数据-
5会话层会话管理数据-
4传输层端到端通信段(Segment)防火墙
3网络层路由寻址包(Packet)路由器
2数据链路层帧传输帧(Frame)交换机
1物理层比特传输比特(Bit)集线器

1.2 数据封装过程

应用数据
    ↓ + 应用层头
表示层PDU
    ↓ + 表示层头
会话层PDU
    ↓ + TCP/UDP头
传输层段(Segment)
    ↓ + IP头
网络层包(Packet)
    ↓ + 帧头+帧尾
数据链路层帧(Frame)
    ↓
物理层比特流(Bit)

2. TCP/IP 模型

2.1 四层结构

TCP/IP 层对应 OSI 层协议
应用层5/6/7HTTP, DNS, SMTP, FTP
传输层4TCP, UDP, SCTP
网际层3IP, ICMP, ARP
网络接口层1/2Ethernet, Wi-Fi

2.2 TCP vs OSI

特性OSITCP/IP
层数74
先有模型是否
实用性理论参考实际标准
严格分层是较灵活

3. TCP 协议深度

3.1 TCP 首部格式

flowchart TD
    TCP[TCP 报文段<br/>源端口16 / 目标端口16<br/>序列号32 / 确认号32<br/>HL Rsv Flags 窗口大小<br/>校验和16 / 紧急指针16]

标志位:

标志含义
URG紧急指针有效
ACK确认号有效
PSH接收方应尽快交付
RST重置连接
SYN同步序列号
FIN释放连接

3.2 三次握手

sequenceDiagram
    participant C as 客户端
    participant S as 服务器
    Note over C: CLOSED → SYN_SENT
    C->>S: SYN, seq=x
    Note over S: LISTEN → SYN_RCVD
    S-->>C: SYN+ACK, seq=y, ack=x+1
    Note over C: SYN_SENT → ESTABLISHED
    C->>S: ACK, seq=x+1, ack=y+1
    Note over S: SYN_RCVD → ESTABLISHED

为什么是三次:本质上是最少要保证「双方的收发能力都被确认」。两次无法让服务器确认自己的 发送与客户端的接收可达;且历史中失效的旧 SYN 若直接建立连接,会浪费服务器资源——第三次 ACK 让客户端有机会否决旧连接。

初始序列号(ISN)是随机选取的:防止被猜测伪造(老的四元组报文迟到的「历史幻影连接」也 需要靠序列号区分新旧)。

3.3 四次挥手

sequenceDiagram
    participant C as 客户端
    participant S as 服务器
    C->>S: FIN, seq=u(客户端关闭发送)
    S-->>C: ACK, ack=u+1(服务器确认)
    Note over S: 服务器继续发送(半关闭状态)
    S-->>C: FIN, seq=w(服务器关闭发送)
    C->>S: ACK, ack=w+1(客户端确认)
    Note over C: TIME_WAIT 等待 2MSL

为什么是四次:TCP 全双工,两个方向各需一次 FIN/ACK。中间两次「ACK 与 FIN」通常因服务器 还有数据没发完而无法合并——若发完了,ACK+FIN 合并成一次,就退化为三次报文。

TIME_WAIT 为什么要 2MSL(MSL = 报文最大生存时间;Linux 把 TIME_WAIT 时长固定为约 60 秒, 不提供 sysctl 调整项,tcp_fin_timeout 调的是另一个状态 FIN_WAIT_2 的超时):

  1. 确保最后一个 ACK 若丢失,对方重传 FIN 时自己还在场应答;
  2. 让本连接的旧报文在网络中自然消亡,避免污染相同四元组的新连接。

大量 TIME_WAIT 出现在主动关闭方(通常是 Web 服务器),解决靠连接复用(长连接)而非调参。

3.4 滑动窗口与拥塞控制

TCP 可靠且高效,靠两套独立的窗口机制:

  • 流量控制(rwnd):接收方在 ACK 中通告剩余缓冲区大小,防止「快发送方淹死慢接收方」, 保护的是对端;
  • 拥塞控制(cwnd):发送方对网络拥塞程度的自我估计,防止「压垮网络」,保护的是链路。

实际发送窗口=min⁡(rwnd,cwnd)\text{实际发送窗口} = \min(\text{rwnd}, \text{cwnd})

经典拥塞控制(Reno)的四个阶段:

阶段行为触发条件
慢启动cwnd 从 10 MSS 起步,每个 RTT 翻倍(指数)连接建立/超时后
拥塞避免cwnd 达到阈值 ssthresh 后每个 RTT 线性 +1cwnd ≥ ssthresh
快重传收到 3 个重复 ACK 立即重传丢失段丢包(乱序到达)
快恢复ssthresh 与 cwnd 减半后线性增长,不回到慢启动触发快重传时

超时重传(RTO 到期)则被视为严重拥塞:cwnd 重置回初值、重新慢启动。Linux 默认算法为 CUBIC (以三次函数平滑增长,高带宽长肥管道下更激进),数据中心内常配 BBR(基于带宽与 RTT 测量而非 丢包信号,sysctl net.ipv4.tcp_congestion_control 可查)。

HTTP/3 为什么要换掉 TCP:TCP 的按序交付使一个流丢包阻塞整个连接的交付(队头阻塞),且拥 塞窗口被所有流共享;QUIC 把可靠传输下沉到「流」粒度解决前者,连接迁移解决后者无法适应 Wi-Fi 切换的问题,详见 HTTP 协议。

3.5 TCP 状态机

CLOSED → SYN_SENT → ESTABLISHED
                ↓
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED

ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED

ss -s 中各状态的排障含义见 网络故障排查工具: CLOSE_WAIT 偏多 = 应用漏调 close,SYN_RCVD 偏多 = SYN Flood 或握手积压。

4. UDP 协议

4.1 UDP 首部

flowchart LR
    SP[源端口 16] --- DP[目标端口 16]
    L[长度 16] --- CK[校验和 16]

仅 8 字节首部,无连接、无确认、无重传。

4.2 TCP vs UDP

特性TCPUDP
连接面向连接无连接
可靠性可靠不可靠
顺序有序无序
流控有无
拥塞控制有无
速度较慢快
首部20~60字节8字节
适用文件传输实时音视频

5. IP 协议

5.1 IPv4 首部

flowchart TD
    IP[IP 数据报头<br/>VER IHL TOS 总长度16<br/>标识16 Flags 片偏移13<br/>TTL8 协议8 校验和16<br/>源IP地址32<br/>目标IP地址32]

5.2 IPv6 改进

特性IPv4IPv6
地址长度32位128位
首部可变固定40字节
分片路由器可分片仅源端分片
安全可选内置IPsec
配置手动/DHCP自动配置

5.3 子网划分

子网数=2n\text{子网数} = 2^n

每子网主机数=2m−2\text{每子网主机数} = 2^m - 2

其中 nn 为借用的位数,mm 为剩余主机位。

示例:192.168.1.0/24 划分为4个子网:

子网网络地址可用范围广播地址
1192.168.1.0/26.1~.62.63
2192.168.1.64/26.65~.126.127
3192.168.1.128/26.129~.190.191
4192.168.1.192/26.193~.254.255

6. ARP 与 ICMP

6.1 ARP 协议

将 IP 地址解析为 MAC 地址:

主机A: 谁有 192.168.1.1?告诉 192.168.1.100(广播)
主机B: 192.168.1.1 的 MAC 是 aa:bb:cc:dd:ee:ff(单播)

ARP 缓存:

arp -a
ip neigh show

6.2 ICMP 协议

类型代码含义
00Echo Reply
30~15目标不可达
50~3重定向
80Echo Request
110~1超时

Ping 原理:发送 ICMP Echo Request,等待 Echo Reply。

Traceroute 原理:发送 TTL 递增的 IP 包,通过 ICMP 超时消息确定路径。

OSI 七层模型

基本写法:OSI 模型层次

`7. 应用层 (Application) - HTTP/FTP/SMTP/DNS
6. 表示层 (Presentation) - SSL/TLS/JPEG/ASCII
5. 会话层 (Session) - NetBIOS/RPC
4. 传输层 (Transport) - TCP/UDP
3. 网络层 (Network) - IP/ICMP
2. 数据链路层 (Data Link) - Ethernet/ARP
1. 物理层 (Physical) - 电信号/光信号`
# OSI 七层模型从上到下
7. 应用层 - 为应用程序提供网络服务
6. 表示层 - 数据格式转换和加密
5. 会话层 - 管理会话连接
4. 传输层 - 端到端通信
3. 网络层 - 路由和寻址
2. 数据链路层 - 相邻节点通信
1. 物理层 - 比特流传输

TCP/IP 四层模型

基本写法:TCP/IP 模型层次

`4. 应用层 (Application) - HTTP/FTP/SMTP/DNS/SSH
3. 传输层 (Transport) - TCP/UDP
2. 网络层 (Internet) - IP/ICMP/ARP
1. 网络接口层 (Link) - Ethernet/WiFi`
# TCP/IP 四层模型
4. 应用层 - 合并了 OSI 的应用、表示、会话层
3. 传输层 - 对应 OSI 传输层
2. 网络层 - 对应 OSI 网络层
1. 网络接口层 - 合并了 OSI 的数据链路和物理层

OSI 与 TCP/IP 对应关系

基本写法:模型对应映射

`OSI 模型          TCP/IP 模型        协议示例
7. 应用层    -->   4. 应用层          HTTP, DNS
6. 表示层    -->   4. 应用层          SSL/TLS
5. 会话层    -->   4. 应用层          RPC
4. 传输层    -->   3. 传输层          TCP, UDP
3. 网络层    -->   2. 网络层          IP, ICMP
2. 数据链路层 -->  1. 网络接口层      Ethernet
1. 物理层    -->   1. 网络接口层      双绞线`
# OSI 与 TCP/IP 模型对应关系
OSI 7层模型           TCP/IP 4层模型
应用层、表示层、会话层  -->  应用层
传输层              -->  传输层
网络层              -->  网络层
数据链路层、物理层      -->  网络接口层

TCP 协议

基本写法:TCP 三次握手

`客户端              服务端
  |                   |
  |--- SYN ------->   |  客户端发送 SYN, seq=x
  |                   |
  |<-- SYN-ACK ----   |  服务端回复 SYN+ACK, seq=y, ack=x+1
  |                   |
  |--- ACK ------->   |  客户端发送 ACK, ack=y+1
  |                   |
  |<== 数据传输 ==>|`
# TCP 三次握手建立连接
1. 客户端发送 SYN (seq=x)
2. 服务端回复 SYN+ACK (seq=y, ack=x+1)
3. 客户端发送 ACK (ack=y+1)
连接建立完成

基本写法:TCP 四次挥手

`客户端              服务端
  |                   |
  |--- FIN ------->   |  客户端发送 FIN
  |<-- ACK --------   |  服务端回复 ACK
  |                   |
  |<-- FIN --------   |  服务端发送 FIN
  |--- ACK ------->   |  客户端回复 ACK`
# TCP 四次挥手断开连接
1. 客户端发送 FIN
2. 服务端回复 ACK
3. 服务端发送 FIN
4. 客户端回复 ACK
连接断开完成

基本写法:TCP 状态

`LISTEN       - 服务端监听端口
SYN_SENT     - 客户端已发送 SYN
SYN_RECV     - 服务端已收到 SYN
ESTABLISHED  - 连接已建立
FIN_WAIT_1   - 主动关闭方等待 FIN
FIN_WAIT_2   - 主动关闭方等待对方 FIN
TIME_WAIT    - 等待足够时间确保对方收到 ACK
CLOSE_WAIT   - 被动关闭方等待关闭
LAST_ACK     - 被动关闭方发送 FIN 后等待 ACK
CLOSED       - 连接已关闭`
# TCP 连接状态转换
LISTEN -> SYN_RECV -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

TCP 特性

基本写法:TCP 可靠性机制

`- 序列号:保证数据有序到达
- 确认应答:确认收到的数据
- 超时重传:未收到确认则重传
- 流量控制:滑动窗口机制
- 拥塞控制:避免网络拥塞`
# TCP 可靠性保障机制
1. 序列号和确认号 - 保证数据有序和完整
2. 超时重传 - 丢包时自动重传
3. 滑动窗口 - 流量控制
4. 拥塞控制 - 慢启动、拥塞避免

基本写法:TCP 拥塞控制算法

`- 慢启动 (Slow Start) - 连接开始时缓慢增加窗口
- 拥塞避免 (Congestion Avoidance) - 线性增加窗口
- 快重传 (Fast Retransmit) - 收到 3 个重复 ACK 立即重传
- 快恢复 (Fast Recovery) - 快重传后不回到慢启动`
# TCP 拥塞控制四个阶段
1. 慢启动 - 窗口指数增长
2. 拥塞避免 - 窗口线性增长
3. 快重传 - 检测丢包立即重传
4. 快恢复 - 拥塞后快速恢复

UDP 协议

基本写法:UDP 特性

`- 无连接:不需要建立连接
- 不可靠:不保证数据到达
- 无序:不保证数据顺序
- 快速:无握手和确认开销
- 轻量:头部仅 8 字节`
# UDP 协议特点
- 无连接,直接发送数据
- 不保证可靠性,可能丢包
- 头部小(8 字节),开销低
- 适用于实时应用:视频、语音、游戏

基本写法:UDP 应用场景

`- DNS 查询 - 一次请求一次响应
- DHCP - 动态主机配置
- SNMP - 网络管理
- 流媒体 - 视频音频传输
- 在线游戏 - 实时交互`
# UDP 常见应用
- DNS (端口 53) - 域名解析
- DHCP (端口 67/68) - IP 分配
- TFTP (端口 69) - 简单文件传输
- NTP (端口 123) - 时间同步
- SNMP (端口 161) - 网络管理

IP 协议

基本写法:IPv4 地址结构 <网络号><主机号>

# IPv4 地址分类
A 类: 1.0.0.0 - 126.255.255.255   (默认掩码 /8)
B 类: 128.0.0.0 - 191.255.255.255 (默认掩码 /16)
C 类: 192.0.0.0 - 223.255.255.255 (默认掩码 /24)
D 类: 224.0.0.0 - 239.255.255.255 (组播)
E 类: 240.0.0.0 - 255.255.255.255 (保留)

基本写法:私有 IP 地址范围

`10.0.0.0/8        - A 类私有
172.16.0.0/12     - B 类私有
192.168.0.0/16    - C 类私有`
# RFC 1918 私有 IP 地址范围
A 类私有: 10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
B 类私有: 172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
C 类私有: 192.168.0.0 - 192.168.255.255 (192.168.0.0/16)

基本写法:CIDR 表示法 <IP>/<前缀长度>

# CIDR 无类域间路由
192.168.1.0/24  - 256 个地址 (254 可用)
10.0.0.0/16     - 65536 个地址
172.16.0.0/12   - 1048576 个地址

基本写法:IPv6 地址 <8组十六进制>:<8组十六进制>

# IPv6 地址格式
2001:0db8:85a3:0000:0000:8a2e:0370:7334

# 简化形式(省略前导零和连续零组)
2001:db8:85a3::8a2e:370:7334

# 回环地址
::1

# 未指定地址
::

ICMP 协议

基本写法:ICMP 类型

`Type 0  - Echo Reply (ping 响应)
Type 3  - Destination Unreachable (目标不可达)
Type 8  - Echo Request (ping 请求)
Type 11 - Time Exceeded (超时)
Type 5  - Redirect (重定向)`
# 常见 ICMP 类型
Type 0  - Echo Reply(ping 响应)
Type 3  - Destination Unreachable(目标不可达)
Type 8  - Echo Request(ping 请求)
Type 11 - Time Exceeded(TTL 超时,traceroute 使用)

基本写法:ping 命令原理

`# 发送 ICMP Echo Request
ping <目标>

# 接收 ICMP Echo Reply`
# ping 基于 ICMP 协议
ping -c 4 8.8.8.8

ARP 协议

基本写法:ARP 工作流程

`1. 主机 A 查询 IP 对应的 MAC
2. 发送 ARP 请求(广播)
3. 目标主机 B 回复 ARP 响应(单播)
4. 主机 A 缓存 ARP 条目`
# ARP 地址解析过程
1. 主机 A 需要发送数据给 192.168.1.2
2. 查询 ARP 缓存,未找到
3. 发送 ARP 广播:谁的 IP 是 192.168.1.2?
4. 主机 B 回复:我的 IP 是 192.168.1.2,MAC 是 xx:xx:xx:xx:xx:xx
5. 主机 A 缓存 ARP 条目并发送数据

基本写法:查看 ARP 表 arp -a

# 查看 ARP 缓存表
arp -a

常见协议端口

基本写法:常用 TCP 端口

`20/21  - FTP (文件传输)
22     - SSH (安全 Shell)
23     - Telnet (远程登录)
25     - SMTP (邮件发送)
53     - DNS (域名解析)
80     - HTTP (网页)
110    - POP3 (邮件接收)
143    - IMAP (邮件访问)
443    - HTTPS (安全网页)
3306   - MySQL
5432   - PostgreSQL
6379   - Redis
8080   - HTTP 备用`
# 常用 TCP 服务端口
22   - SSH
80   - HTTP
443  - HTTPS
3306 - MySQL
5432 - PostgreSQL
6379 - Redis

基本写法:常用 UDP 端口

`53     - DNS (域名解析)
67/68  - DHCP (动态主机配置)
69     - TFTP (简单文件传输)
123    - NTP (时间同步)
161    - SNMP (网络管理)`
# 常用 UDP 服务端口
53   - DNS
67/68 - DHCP
123  - NTP
161  - SNMP

子网划分

基本写法:子网掩码计算 <IP>/<前缀>

# 子网掩码示例
/24 = 255.255.255.0    - 256 个地址
/25 = 255.255.255.128  - 128 个地址
/26 = 255.255.255.192  - 64 个地址
/27 = 255.255.255.224  - 32 个地址
/28 = 255.255.255.240  - 16 个地址
/30 = 255.255.255.252  - 4 个地址

基本写法:计算可用主机数 可用主机 = 2^(32-前缀) - 2

# 子网可用主机数计算
/24 网络:2^8 - 2 = 254 个可用主机
/25 网络:2^7 - 2 = 126 个可用主机
/26 网络:2^6 - 2 = 62 个可用主机
/30 网络:2^2 - 2 = 2 个可用主机(点对点链路)

基本写法:子网划分示例

`# 将 192.168.1.0/24 划分为 4 个子网
子网 1: 192.168.1.0/26     (0-63)
子网 2: 192.168.1.64/26    (64-127)
子网 3: 192.168.1.128/26   (128-191)
子网 4: 192.168.1.192/26   (192-255)`
# 192.168.1.0/24 划分为 4 个 /26 子网
子网 1: 192.168.1.0/26    范围 0-63     可用 1-62
子网 2: 192.168.1.64/26   范围 64-127   可用 65-126
子网 3: 192.168.1.128/26  范围 128-191  可用 129-190
子网 4: 192.168.1.192/26  范围 192-255  可用 193-254