第1章:网络基础回顾 — OSI七层模型与TCP/IP协议栈核心概念
做抓包分析,说白了就是在看数据包是怎么「走路」的。你得先认识路,才能知道它在哪摔了跤。这一章我们快速过一下网络基础,别觉得枯燥,抓包定位丢包源全靠这些底子。
我个人习惯把OSI七层模型和TCP/IP协议栈放在一起看。它们就像两张地图,一张画得特别细,一张是精简版。但内核是一样的——数据从上层往下走,一层层打包;到了对端,再一层层解开。
核心结论:
- 数据封装是「加头加尾」,从应用层一路到物理层
- 数据解封装是「去头去尾」,从物理层一路回到应用层
- 丢包的本质,就是在封装或解封装的某个环节出了岔子
1.1 OSI七层模型:教科书里的那个「标准答案」
OSI模型把网络通信分成七层。你想,大家约定好每层该干什么,互相配合。这个分层思想太有用了——抓包时看到哪一层有问题,你就知道从哪开始查。
| 层数 | 名称 | 核心工作 | 典型协议/设备 |
|---|---|---|---|
| 7 | 应用层 | 为用户应用程序提供网络服务接口 | HTTP, FTP, SMTP, DNS |
| 6 | 表示层 | 数据格式转换、加密解密、压缩解压缩 | SSL/TLS(实操中常归到应用层) |
| 5 | 会话层 | 建立、管理、终止应用程序之间的会话 | NetBIOS, RPC |
| 4 | 传输层 | 端到端连接、可靠传输、流量控制 | TCP, UDP |
| 3 | 网络层 | 逻辑寻址、路由选择、分组转发 | IP, ICMP, ARP, 路由器 |
| 2 | 数据链路层 | 帧封装、物理寻址(MAC)、差错检测 | 以太网协议, 交换机, 网桥 |
| 1 | 物理层 | 比特流传输、定义电气/机械特性 | 网线, 光纤, 集线器, 中继器 |
嗯,这里要注意。你在抓包软件里,其实看不到「会话层」和「表示层」单独出来。为什么呢?因为实际应用中,这两层的功能基本被合并到应用层协议里处理了。但懂OSI,你能更清晰地理解那些复杂的加密和会话管理行为。
一个实用技巧: 排查丢包问题时,先判断是哪一层。如果用ping能通但网页打不开,问题大概率在应用层或传输层。如果ping都丢包,那赶紧往下看——网络层或数据链路层出事了。
1.2 TCP/IP协议栈:实战中的「常青树」
TCP/IP模型只有四层。它把OSI的高三层合并成「应用层」,把物理层和数据链路层合并成「网络接口层」。更实用,也跟现实设备对接得更紧密。
| TCP/IP 层 | 对应 OSI 层 | 核心任务 | 抓包时你最常看到的 |
|---|---|---|---|
| 应用层 | 5/6/7 | 处理用户数据 | HTTP请求/响应, DNS查询, TLS握手 |
| 传输层 | 4 | 端到端通信 | TCP三次握手, SEQ/ACK, UDP数据报 |
| 网络层 | 3 | 路由与寻址 | IP头部, TTL, ICMP差错报文 |
| 网络接口层 | 1/2 | 物理传输 | MAC地址, 以太网帧, VLAN tag |
我记得最早学TCP/IP时,老觉得这模型太「瘦」了。后来做项目才知道,瘦有瘦的好——它把复杂的东西藏起来了,留给你最核心的排查字段。
1.3 数据封装与解封装:数据包的「穿衣脱衣」全过程
这个很重要。抓包定位丢包源,其实就是看数据穿衣脱衣的过程中,哪件衣服穿错了或者没穿上。
封装过程(发送端):
- 应用层:原始数据(比如HTTP报文)
- 传输层:加上TCP头部(包含源端口、目的端口、序列号等)→ 形成数据段
- 网络层:加上IP头部(包含源IP、目的IP、TTL等)→ 形成数据包
- 数据链路层:加上以太网帧头部(包含源MAC、目的MAC、类型等)和尾部(FCS校验)→ 形成数据帧
- 物理层:把帧转换成比特流,发送出去
解封装过程(接收端):
- 物理层:接收比特流,还原成帧
- 数据链路层:检查MAC地址和FCS,去掉帧头和帧尾 → 得到数据包
- 网络层:检查IP地址,去掉IP头部 → 得到数据段
- 传输层:检查端口号,去掉TCP头部,重组数据 → 交给应用层
- 应用层:拿到原始数据
你想想看,如果在中间某个节点,比如交换机转发时发现FCS校验失败,那它就把这个帧直接丢弃了。这就是一个典型的丢包源——数据链路层的错误。
避坑指南: 我曾经在一个项目中,排查了一整天的丢包问题,最后发现是交换机端口上的MTU太小。数据在IP层被分片后,某一片在链路上丢了,导致整个数据包无法重组。所以在抓包时,一看到IP分片报文或TCP重传,第一个念头就要检查MTU。
1.4 核心知识体系一览
我习惯把这一章的内容画成一张图。你把它理清了,后续30章的抓包技巧就有根了。
1.5 抓包场景中的「对等层通信」
这个要记住:网络通信遵循「对等层通信」原则。你发出的数据,在接收方必须由相同层次的协议来处理。比如,你发送端的数据链路层封装了一个帧,接收端的数据链路层就得解这个帧。如果中间设备(比如交换机)只工作在数据链路层,它就不看IP头和TCP头。
为什么这对抓包重要?因为你在Wireshark里看到的内容,完全取决于你抓包的「点」在哪。
- 如果在交换机上抓,看到的是完整的以太网帧
- 如果在PC上抓,看到的是网卡剥离了帧头后的IP包(通常)
- 如果在路由器上抓,看到的是经过路由处理后的数据包
我的经验: 当你怀疑是某个中间设备丢包时,就在它入口和出口分别抓一次包,对比两边的帧或包内容,立马能看出是不是这个设备做了丢弃。这叫「分步抓包法」,后面会专门讲。
嗯,基础就这么多。别看这章内容基础,你后续遇到的所有丢包场景,归根结底都能落到这些层次和封装过程上。把基础打牢,后面的路就好走了。