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 |
面试被问「某某设备工作在哪一层」,用这张表秒答;同时它也是你阅读设备规格书时定位功能模块的索引。
讲清楚要点
- OSI 是教学模型,TCP/IP 是现实协议栈:OSI 的会话 / 表示层在现实中融进了应用层,TLS 介于传输与应用之间。日常说「四层 / 七层」指的是 TCP/IP 模型。
- 封装向下、解封装向上:发送端每层加自己的头,接收端每层剥掉对应的头;对等层之间靠协议对话,同机内层与层之间靠接口传递。
- TTL 每过一个路由器减一:防环的生命线;MAC 地址在每一跳都会重写,IP 地址端到端不变(NAT 除外)——这两条解释了 traceroute 为什么能工作。
- 报文叫法分层:链路层叫帧(Frame),网络层叫包(Packet),传输层叫段(Segment),应用层叫消息(Message)。面试说错会很尴尬。
- 分层也是产业分工:IEEE 定链路层(以太网 / WiFi),IETF 定网络与传输层(IP/TCP),W3C/WHATWG 定应用层(HTTP)。看懂分工,就知道去哪找一手标准文档——延伸链接里的 RFC 就是这么查的。
你可能会懵的地方
-
既然 OSI 有七层,为什么天天说四层 / 七层负载均衡? 四层负载均衡基于 IP+端口转发(LVS/云 NLB),七层基于 HTTP 内容分流(Nginx/云 ALB)。这里的「层」指转发依据所在的层。
-
TLS 算哪一层? 介于传输层与应用层之间,职责对应 OSI 的表示 / 会话层:加密、压缩、认证都属「数据加工」。面试答「TLS 让应用层拿到加密好的字节流」即可,不必硬塞进某层;能接一句「HTTPS = HTTP over TLS over TCP」更好,展示层次感。
-
ARP 算哪一层? 它帮 IP 找 MAC,教科书归链路层,实际像「2.5 层」。理解它就能解释:同网段通信为什么要先问 MAC。
-
交换机是不是只看二层、路由器只看三层? 概念分工如此,现代设备早已是多面手:三层交换机、带防火墙模块的路由器到处都是。学的是概念分工,用的时候看配置。
-
ping 通就代表网络没问题吗? 不代表。ping 只证明 ICMP 可达,服务端口可能没开、被 ACL 拦、应用假死。传输层结论要用
curl host:port或telnet拿;反过来端口通也不代表应用健康,还要看 HTTP 状态码——每一层都有「通了但不对」的形态,这正是分层排查的价值。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| ping 不通就断定对端挂了 | 对端禁 ping 很常见 | 用 telnet/curl 探测目标端口 |
| 把 MAC 地址当唯一标识跨网段追踪 | 跨网段 MAC 逐跳重写 | 跨网段追踪用 IP |
| 认为交换机能隔离广播域 | 默认不能,VLAN 才能隔离 | 划 VLAN 或用三层设备分段 |
| 抓包不过滤直接看 | 全网噪音淹没目标 | 先写 BPF 过滤 port 443 再抓 |
| 忘了 TTL 有上限 | 路由环路可打爆链路 | TTL 归零回 ICMP Time Exceeded,traceroute 正靠它工作 |
| 把「段」说成「包」跟面试官 | 术语错层,显生疏 | 帧 / 包 / 段 / 消息各归其层 |
卡点急救
- tcpdump 提示权限不足:加 sudo;容器里抓包需特权或在宿主机抓网卡。
- 抓包刷屏:先加过滤表达式,再
-c 50限量,或-w落盘离线分析。 - Wireshark 打开没数据:确认
-w保存的文件和抓的接口选对(云主机抓 eth0 而非 lo)。
面试常问
-
浏览器输入 URL 后发生了什么?请按层回答。 应用层:DNS 解析域名、构造 HTTP 报文;传输层:TCP 三次握手建立连接;网络层:逐跳路由、TTL 递减;链路层:ARP 求网关 MAC、帧逐跳重写。能按层说清 = 真懂分层。
-
TCP 三次握手为什么不是两次? 两次无法让服务端确认「客户端能收到自己的数据」,历史重复连接会造成资源错配;握手同时交换初始序列号,为可靠传输打基础。
-
四层与七层负载均衡的区别与取舍? 四层快、省、不看内容,适合 TCP 与超大流量;七层能按 URL/Header 分流、卸载证书、做压缩。本站的 Nginx 入口就是七层负载均衡。
自测三问
- 一次 HTTPS 请求至少用到哪几层协议?各自干了什么?
- traceroute 的工作原理依赖 IP 头的哪个字段?
- 「帧、包、段、消息」分别对应哪一层?
小结一句话
分层模型是网络的坐标系:每个故障都能落进某一层,每层都有对应的验证命令——先分层,再动手。
延伸
- RFC 1122:互联网协议栈标准
- 下一课:IP 寻址与子网划分——IPv4、VLSM、CIDR 与 NAT。