一、协议基础与抓包环境搭建
各位同学好,我是老周。做网络协议分析这行十几年了,今天咱们聊聊最基础的东西——OSI模型、TCP/IP模型,还有怎么把Wireshark这个利器装好、配好。
说实话,很多人觉得协议模型是理论课,抓包才是实战。但我见过太多人,抓了一堆包却看不懂,就是因为对协议分层没概念。你想想看,没有地图就开车,能开到哪去?
1.1 OSI七层模型:理想中的完美分层
OSI七层模型,全称是开放系统互连参考模型。1984年由ISO提出,说白了就是给网络通信画了个标准蓝图。
我个人习惯把这七层分成两组:上面四层(应用层、表示层、会话层、传输层)处理数据内容,下面三层(网络层、数据链路层、物理层)处理数据传输。
| 层级 | 名称 | 核心职责 | 常见协议/设备 |
|---|---|---|---|
| 7 | 应用层 | 为用户应用提供网络服务 | HTTP、FTP、SMTP、DNS |
| 6 | 表示层 | 数据格式转换、加密、压缩 | SSL/TLS、JPEG、ASCII |
| 5 | 会话层 | 建立、管理、终止会话 | NetBIOS、RPC |
| 4 | 传输层 | 端到端可靠传输、流量控制 | TCP、UDP |
| 3 | 网络层 | 路由选择、逻辑寻址 | IP、ICMP、ARP |
| 2 | 数据链路层 | 帧封装、介质访问控制 | 以太网、PPP、交换机 |
| 1 | 物理层 | 比特流传输、电气特性 | 网线、光纤、集线器 |
1.2 TCP/IP四层模型:实战中的王者
OSI模型太理想化了,七层分得太细。TCP/IP模型就务实得多,只有四层。我当年刚入行时,师傅就跟我说:「别管OSI那七层,先把TCP/IP的四层搞明白,你就能干活了。」
TCP/IP四层模型:应用层、传输层、网络层、网络接口层。它把OSI的上三层合并为应用层,下两层合并为网络接口层。
为什么会这样?因为TCP/IP是伴随着ARPANET(互联网前身)发展起来的,经过了几十年的实战检验。OSI虽然设计得漂亮,但等它标准定完,TCP/IP已经占领天下了。
1.3 协议分层与数据封装
数据从应用层往下走,每一层都会加上自己的头部信息。这个过程叫封装。抓包时你看到的每个数据包,其实就是一层层头部叠起来的。
我记得有一次帮客户排查一个视频卡顿问题。对方说「网络没问题,带宽够」。我抓包一看,MTU设置不对,导致IP层分片太多,重传率高达15%。这就是典型的「上层表现异常,根在下层」——不懂分层,你根本想不到去查MTU。
1.4 Wireshark安装与配置
好,理论讲完了,咱们来点实在的。Wireshark是目前最强大的开源抓包工具,没有之一。我用了十几年,从它还叫Ethereal的时候就开始用了。
1.4.1 安装步骤
- 下载: 去官网 wireshark.org 下载对应操作系统的版本。Windows选64位安装包,macOS选.dmg,Linux用apt或yum。
- 安装: 一路Next就行。但注意——安装过程中会提示安装Npcap(Windows)或ChmodBPF(macOS),一定要勾选。这是抓包的底层驱动,没有它你抓不到包。
- 验证: 安装完成后打开Wireshark,能看到网卡列表就说明成功了。
1.4.2 基础配置
装好之后,我建议你先做三件事:
- 配置时间显示格式: 菜单栏 → View → Time Display Format → Seconds Since Beginning of Capture。这样看时间差更直观。
- 开启自动滚动: 菜单栏 → Capture → Options → 勾选「Update list of packets in real time」和「Automatically scroll during live capture」。
- 配置着色规则: Wireshark默认就有着色规则,但我习惯把TCP重传包标成红色,把HTTP包标成绿色。菜单栏 → View → Coloring Rules 可以自定义。
1.5 抓包过滤器与显示过滤器
这是Wireshark最核心的两个功能。很多新手搞混,我一句话说清楚:
- 抓包过滤器(Capture Filter): 在抓包之前设置,只抓符合条件的包。抓不到的包就永远丢了。
- 显示过滤器(Display Filter): 在抓包之后设置,从已经抓到的包里筛选显示。原始数据还在,只是隐藏了不符合条件的包。
1.5.1 抓包过滤器语法
抓包过滤器用的是BPF(Berkeley Packet Filter)语法。说白了就是三段式:协议 + 方向 + 条件。
| 示例 | 含义 |
|---|---|
host 192.168.1.1 |
只抓与192.168.1.1通信的包 |
port 80 |
只抓80端口的包(HTTP) |
tcp |
只抓TCP协议的包 |
src host 10.0.0.1 and dst port 443 |
抓源IP为10.0.0.1且目的端口为443的包 |
not arp |
排除ARP包 |
1.5.2 显示过滤器语法
显示过滤器是Wireshark的杀手锏。语法比抓包过滤器丰富得多,支持协议字段级别的筛选。
# 基础用法
ip.addr == 192.168.1.1 # 筛选IP地址
tcp.port == 443 # 筛选TCP端口
http.request.method == "GET" # 筛选HTTP GET请求
dns.qry.name contains "google" # 筛选包含google的DNS查询
# 组合用法
ip.src == 10.0.0.1 and tcp.dstport == 80
http.response.code >= 400
tcp.analysis.retransmission # 筛选所有TCP重传包(这个超实用)
我记得有一次排查一个「网页加载慢」的问题。用户说「网络没问题,测速正常」。我抓了30秒的包,用 tcp.analysis.retransmission 一筛,好家伙,重传率超过8%。再一看,是某个中间设备的MTU不匹配导致的。没有显示过滤器,你得从几千个包里一个个翻,那得翻到什么时候?
1.5.3 两者对比
| 对比项 | 抓包过滤器 | 显示过滤器 |
|---|---|---|
| 时机 | 抓包前 | 抓包后 |
| 语法 | BPF(简单) | Wireshark专用(强大) |
| 是否丢数据 | 是(不符合条件的直接丢弃) | 否(只是隐藏) |
| 适用场景 | 高流量环境、磁盘空间有限 | 日常分析、问题排查 |
| 示例 | port 80 |
http.response.code == 200 |
好了,这一章的内容就到这。协议模型是地基,Wireshark是工具,过滤器是钥匙。地基打牢了,工具用熟了,钥匙拿对了,后面的实战才能游刃有余。