名词解释教学工作区 · 课程 0020 · 形态 单概念 · 约 6 分钟 · 前置:0013 · 前端 / 后端 / 接口 · 相关:0021 · 爬虫 · 2026-10-01
抓包:把流过网卡的数据抄一份下来
你能做到:别人一提「抓包」,你能说清它抄的是线路上真实跑过的帧,
能说出为什么加密之后只剩信封,以及它和日志、代理、监控各自管哪一段。
1 | 定义
抓包(packet capture,也叫 packet sniffing):把流经网卡的数据包(packet)原样复制一份、按时间顺序存成文件,事后逐条回看 —— 谁发给谁、什么协议、来回几次、各隔多久,以及没加密时里面的内容。
就像在网线上接一台录音机:从这里流过的数据都原样录一份下来,回头慢慢听 —— 程序自己说不清的那一段路,只有这盘录音能作证。
2 | 它解决什么麻烦
这一类问题的共同点是:答案不在程序里,在「路上」。
- ① 连不上。程序只留下一句「超时」或「连接被拒绝」;到底卡在域名没解析出来、TCP 连不上,还是连上又被谁重置,它说不清。
- ② 慢。一次请求其实分成好几段:域名解析、建立连接、加密握手、等服务器第一个字节、下载。日志往往只记总耗时,不告诉你哪一段花掉了时间。
- ③ 时好时坏。偶发失败重试一下就好了 —— 不把失败那一次完整照下来,永远找不到规律。
- ④ 双方各说各话。客户端说「我发了」,服务端说「我没收到」,中间还夹着代理和负载均衡;只有线上那份副本能当裁判。
3 | 它怎么解决
工具的活拆成三问:在哪抄、抄什么、抄下来怎么看。
- ① 在哪抄:网卡默认不给你别人的帧。网卡(NIC,Network Interface Card)的本职工作,是只把收件人是本机的帧(frame)(链路层的传输单位)交给系统,路过的流量它本来不管。想让「路过的」也交上来,有三条路:
- 混杂模式(promiscuous mode):告诉网卡别再挑收件人,凡经过它的帧全部交上来。但它只是让网卡「不挑」,交换机若不肯把别人的帧送到这个口,照样看不到 —— 所以实际生产里常要配合端口镜像。
- 抓本机自己的流量:本机进程之间、以及本机收发的那些包本来就经过内核,不需要混杂模式。在服务器上排查自己的服务,多半是这条。
- 在网络设备上复制一份:交换机的镜像端口(SPAN,Switched Port Analyzer),或者串在链路中间的分光/汇聚设备(TAP,Test Access Point),把某个端口或整条链路的流量复制给抓包机。抓整个机房的流量,走这条。
- ② 抄什么:先过滤,再落盘。不过滤会淹死:一条千兆链路几分钟就能攒出几个 G。所以都用BPF 过滤器(Berkeley Packet Filter)先声明条件 —— 比如「只要 tcp 且端口 443」—— 内核这一层就把不要的丢掉,只把命中的写进 pcap 文件(抓包存下来的标准文件格式)。抓包这件事本身靠 libpcap:它是 pcap 格式最常见的实现,负责向内核要数据;Windows 上由 Npcap 驱动代劳。
- ③ 抄下来看到哪一层:从帧到应用层一层层拆。
- 链路层:帧的源与目的 MAC 地址、以太网类型 —— 这一跳交给了谁。
- 网络层:IP 头 —— 源与目的 IP、TTL、是否分片。
- 传输层:TCP / UDP 头 —— 端口、序号与确认号、标志位;三次握手(handshake)有没有走完、谁先发出 RST 把连接掐了。
- 应用层:明文协议看得见内容(HTTP 的请求行与头、DNS 的查询与应答);一旦套上 TLS,内容到此为止,只剩握手时明文暴露的 SNI(Server Name Indication,客户端明说「我要访问哪个域名」)与证书。
一句话:加密之后,抓包手里剩下的是信封 —— 谁和谁、走哪个端口、多大、来回几次、各隔多久;信纸不在它手里。
4 | 用它的代价
- ① 要权限,还得在那台机器上。读网卡的原始数据要管理员或 root;Windows 上还得先装 Npcap 驱动。更要紧的是位置:抓哪台机器的流量,就得在哪台机器上(或它所在的镜像口上)抓,「远程顺手抓一下」不成立 —— 而设备在网络里演的是拨号的路由模式还是原样转发的桥接模式,决定了路过它的帧你抓不抓得到(见 0009 · 路由模式与桥接模式)。
- ② 全量抓会算不过来。高速链路上抓全量会丢包,内核缓冲区满了就默默丢 —— 你抓到的可能正缺最关键那几个。所以要先过滤、必要时只截每个包的前几十字节(只留头),或者用环形缓冲轮转文件。
- ③ 抓下来的是数据副本。请求头里的 Cookie、令牌、Authorization、表单内容都会原样躺在 pcap 里;存、传、删都要按「它含敏感信息」来对待。
- ④ 加密就是看不透。要读内容,只能在客户端装证书、走一个中间代理(如 mitmproxy);那只限自己的设备,并且代理本身会变成新的故障点。
- ⑤ 它是事后照相机,不是监控。没抓到的就不存在;偶发问题要么提前起抓,要么挂着一个抓包进程等它再犯一次。
5 | 真实使用场景
场景一:线上某台服务器偶发慢,先抓到文件再回头算账。
# 服务器上:只留 https 流量,写进文件;复现完按 Ctrl-C 停
sudo tcpdump -i eth0 -w slow.pcap 'tcp port 443'
# 回看有哪些 TCP 会话、各自持续多久、各传了多少字节
tshark -r slow.pcap -q -z conv,tcp
# 挑出最慢的那一对地址,丢进 Wireshark 逐包看时间线:哪一段跳得最多
tshark -r slow.pcap -Y 'ip.addr == 198.51.100.7'
时间列按顺序读下去:域名解析、几次握手、请求发出到第一个响应字节等了多久、之后又传了多久 ——
跳得最多的那一段,就是瓶颈所在的那一段。
场景二:自己这台机器上,一次页面加载到底慢在哪(不碰网卡的近似视角)。
这类问题甚至不用抓包工具:浏览器里按 F12 打开开发者工具,切到 Network(网络)面板,勾上保留日志,刷新页面,
点开一条请求的 Timing(计时)标签 —— 它把这次加载拆成域名查询、建立连接、TLS 握手、等待首字节、内容下载几段分别计时。
它只是浏览器对自己那批请求的自述,不碰网卡:看不到别的程序,也看不到线路上真实跑过的帧;但要定位「这次加载慢在哪一段」,通常已经够用。
6 | 和相近的东西怎么分
| 工具 | 它是什么 | 和抓包什么关系 |
| tcpdump | Linux / Unix 自带的命令行抓包工具,直接向网卡要数据,输出最原始的报文列表 | 抓包的命令行形态;服务器上没图形界面时,靠它把流量存成 pcap |
| tshark | Wireshark 附带的命令行分析器,协议解析引擎与 Wireshark 同一套 | 管的是抓包的第三段「抄下来怎么看」:按字段过滤、统计会话,也能自己抓 |
| Wireshark | 图形界面的抓包与协议分析软件,会话重组和逐包解读最完整 | 抓包与解读一体的桌面工具,把 pcap 拖回本机对着时间线细看 |
| 浏览器 Network 面板 | 浏览器记录自己发出的那批请求,并给出分段耗时 | 抓包的一个局部替身:只看得到浏览器进程,不碰网卡,也看不到别的程序 |
| curl -w | 命令行 HTTP 客户端;-w 按模板输出这次请求的分段时间 | 抓包的一种窄口径取数:只覆盖自己这一次请求,不落 pcap 文件 |
它和另外几个「看问题的手段」也不一样:
- ① 日志:程序自己写下的记录 —— 它只有程序愿意说的话,网线上真实跑过的帧它常常缺。
- ② 代理(proxy):挡在客户端与服务器之间、替双方转手请求的中转程序 —— 它比抓包多了一步「改」,还要装证书,只适用于自己的设备。
- ③ 监控(monitoring):长期盯着指标、超了就告警的一套系统 —— 它回答「一般怎么样」,回答不了「这一次到底怎么了」,而抓包正是为了那一次。
- ④ 抓包:线上原始流量的副本 —— 解的是「路上真的发生了什么」,上面三样都只给侧面。
还有一个常被混进来说的词是爬虫:
它是照着接口批量取数据的程序。抓包负责先把接口看清楚,爬虫负责看清之后搬运 —— 一个弄懂线路,一个批量取货。
7 | 常见误解
- ① 「抓包就能看到密码和聊天内容。」今天绝大多数流量是加密的,你看到的是信封 —— 地址、端口、长度、时间,不是信。
- ② 「抓包能查出一切问题。」程序内部的逻辑错、缓存没刷新、数据库慢,都不在网线上,它帮不上。
- ③ 「抓包一定要装 Wireshark、开图形界面。」服务器上一条 tcpdump 或 tshark 命令就够;图形界面只是把同一个 pcap 读得更舒服。
- ④ 「什么流量都能抓。」先要有授权:抓自己的设备、自己管着的网络是正当用途;抓别人的网络要看法律与单位规定,随意抓可能违法。
- ⑤ 「一个包都没抓到,说明网络没问题。」更可能是网卡选错、过滤器写太严,或者权限不够 —— 那是抓包本身没配对。
8 | 练习
三题自测,每题只有一个正确选项;选完立刻看到解释。
1. 抓包只看得到「信封」、看不到「信纸」,直接原因是什么?
对。TLS 把内容盖住之后,明文留下的只有地址、端口、长度、时间与握手时暴露的域名;帧是整段复制下来的,过滤器也是你自己写的。
2. 要让网卡把「不是发给本机」的帧也交上来,靠的是什么?
对。挑不挑收件人是网卡自己的行为,只有混杂模式能改它;BPF 过滤器管的是「留下来哪些」,权限管的是「能不能读网卡」。
3. 下面哪一种问题,抓包帮不上忙?
对。缓存逻辑住在程序内部,网线上看不出对错;DNS 解析、TLS 握手轮次、连接被 RST 掐断,都会在包的时间线上留下痕迹。