OSI 与 TCP/IP
七层模型、TCP/UDP、协议栈。
OSI 与 TCP/IP:逐层拆解
这一课你将能做到
- 说出 OSI 七层与 TCP/IP 四层的对应关系及每层职责
- 用抓包验证一次请求的「封装—解封装」全过程
- 把一条命令或一个故障现象准确归到某一层
为什么要学
OSI 不是考试专用摆设,它是排障的坐标系。你以后会遇到无数「说不清」的故障:curl 卡住、握手失败、偶发超时。会分层的人,一句「TCP 都没建立,别看应用日志了」就能砍掉一半排查方向。这一课让你拿到这个坐标系,后面每一课都挂在它的某一层上。
先建立图像
一次 HTTPS 请求在协议栈里是这样「洋葱式」封装的:
应用层 │ HTTP: GET /index.html HTTP/1.1 ← 你写的代码在这层
传输层 │ TCP: 端口 51234 → 443 序号 / 确认 / 重传 ← 连接与可靠性
网络层 │ IP: 10.0.1.5 → 142.250.x.x TTL=64 ← 寻址与路由
链路层 │ 以太网: MAC aabb.ccdd.eeff → 网关MAC ← 相邻设备投递
物理层 │ 01010110... 电信号 / 光信号 ← 网线 / 光纤
对端收到后逐层剥壳:链路层拆帧 → 网络层拆包 → 传输层拆段 → 应用层拿到报文。每一层只处理自己的头,绝不越权——这就是「分层解耦」。
跟着做
步骤 1:确认工具
tcpdump --version # macOS/Linux 通用;Windows 用 Wireshark 直接抓
步骤 2:抓一次 DNS + TCP + TLS
sudo tcpdump -i any -nn -c 20 'host example.com and (port 443 or port 53)' &
curl -s https://example.com >/dev/null
观察输出依次出现:DNS 查询(端口 53)→ TCP SYN / SYN-ACK / ACK → TLS Client Hello → 加密应用数据。这就是四层协议在一秒内的真实协作;前三个包(SYN、SYN-ACK、ACK)就是三次握手,面试必考题在抓包里长这个样子。
步骤 3:保存文件用 Wireshark 逐层展开
sudo tcpdump -i eth0 -w /tmp/http.pcap 'tcp port 443 and host example.com' -c 30
用 Wireshark 打开 pcap,从 Frame → Ethernet → IP → TCP → TLS 逐层展开,对照上面那张图,每层头部的字段清晰可见。
步骤 4:每层配一条验证命令
ethtool eth0 # 物理:Link detected? 速率双工
ip neigh # 链路:ARP 表(IP ↔ MAC)
ping -c2 223.5.5.5 # 网络:三层可达
ss -tlnp | grep 443 # 传输:端口监听
curl -sI https://example.com | head -1 # 应用:全链路
记住这张「层 ↔ 命令」对照表,排障时按层点名。
步骤 5:记住「层 ↔ 设备 ↔ 地址」三对照
| 层 | 典型设备 | 地址形式 |
|---|---|---|
| 物理 | 网线 / 光纤 / 集线器 | 电信号 / 光信号 |
| 链路 | 交换机、网卡 | MAC(48 位,扁平无结构) |
| 网络 | 路由器、三层交换机 | IP(32 位,层次化) |
| 传输 | L4 防火墙、四层 LB | 端口(0-65535) |
| 应用 | Nginx、WAF、正向代理 | 域名 / URL / Header |