假设你是快递公司监控室的值班员,面前是一条长长的传送带,无数包裹(数据包)从眼前经过。Wireshark 就是那台能看清每个包裹面单、封口、沿途盖章的扫描仪。平时你只看“包裹从哪来、往哪去、什么时候到”,但一出投诉,你就要调出录像,一步步还原包裹到底堵在哪一环。这篇文章带你学会:在哪个路口装摄像头(选网卡)、怎么从海量包裹里筛出目标(显示过滤器)、怎么看寄收双方的三句确认通话(TCP 三次握手)、包裹丢了怎么补发(重传)、哪段传送带最慢(延迟分析),以及最终锁定“包裹迟迟不到”的真凶(实战排错)。学完这些,你就能三分钟定位一个网络包裹到底卡在哪里。

岗位关联

网络包分析是后端开发、运维和技术支持的核心排错能力。掌握 Wireshark,你能把“接口慢”这种模糊问题拆解成连接建立、数据传输、服务处理的具体耗时,直接定位到代码、网络还是配置。

目录
  1. 可视化演示
  2. 抓包原理
  3. 网卡选择
  4. 显示过滤器
  5. 三次握手
  6. 重传分析
  7. 延迟分析
  8. HTTP分析
  9. 实战排错
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示TCP三次握手过程、BPF捕获过滤器与显示过滤器协同工作、以及RTT延迟与丢包诊断分析。

本节配有交互动效(进入视口后自动加载,约 3KB)。

TCP三次握手 客户端发送SYN请求建立连接 服务端回复SYN+ACK确认 客户端发送ACK连接建立

抓包原理

快递监控室里,包裹在传送带上匀速经过扫描台,扫描台会“咔嚓”一下拍下包裹的每一面。网卡上的 Wireshark 就是这台扫描台——它把一个经过网卡的以太网帧原样复制一份,然后在界面上拆解给你看。Wireshark 的捕获引擎负责接管网卡,普通应用程序只能读到发给自己的数据,而捕获引擎能拿到链路层原始比特流,就像监控室有权限调取整条传送带的录像。

一个数据包在网络上其实是“套娃”式包装的:最外层是以太网帧,相当于包裹的硬纸箱,写着寄件人/收件人的 MAC 地址;纸箱里是 IP 层,相当于物流单上的城市和区号;再里面是 TCP 层,相当于收件人电话和门牌号;最里面才是应用数据,也就是包裹里真正装的东西。Wireshark 的“拆包”过程,就是监控员一层层撕开包装,把每个字段标注清楚,数据包列表就是一份按时间排列的拆包记录。

所以当你打开 Wireshark,看到的一条条记录,本质上是这段“包装+货物”的完整展示。老监控员只需扫一眼颜色和协议列,就能知道这是一个普通网页请求还是哪个服务调用,因为他们已经把“拆包装”练成了肌肉记忆。

包长=14⏟以太网头+20⏟IP头+20⏟TCP头+载荷\text{包长} = \underbrace{14}_{\text{以太网头}} + \underbrace{20}_{\text{IP头}} + \underbrace{20}_{\text{TCP头}} + \text{载荷}
一个普通 TCP 数据包在网络上的总长度,等于链路层、IP 层、TCP 层三段“包装”的字节数加上最里层的业务数据字节数。
  1. 以太网头14 字节,记录目的 MAC、源 MAC,是包裹的硬纸箱。
    14⏟以太网头\underbrace{14}_{\text{以太网头}}
  2. IP 头20 字节,记录源 IP、目的 IP,决定包裹寄往哪个城市。
    20⏟IP头\underbrace{20}_{\text{IP头}}
  3. TCP 头20 字节,记录源端口、目的端口、序号,相当于收件人的精确门牌。
    20⏟TCP头\underbrace{20}_{\text{TCP头}}
  4. 载荷真正的业务数据,例如一行 HTTP 请求文本。
    载荷=HTTP / TLS / 业务数据\text{载荷} = \text{HTTP / TLS / 业务数据}

网卡选择

监控室不可能把摄像头装遍全城,你必须先决定“在哪个分拣中心装探头”。Wireshark 启动后的第一步也是选网卡:主界面列出所有网络接口,以太网、Wi-Fi、虚拟网卡,每个都是一路摄像头。如果装了无线网卡却选了以太网口,自然什么都抓不到——这就像你在 A 分拣中心装了探头,可包裹走的却是 B 传送带。

默认情况下,网卡只接收“发给本机 MAC”的帧,就像分拣员只拣写着自己工位号的包裹。但排错时你想看同一链路里别的设备在干什么,就要打开混杂模式(Promiscuous Mode)。普通模式相当于“事不关己,高高挂起”,混杂模式则是“只要是经过这条传送带的,我全都要看一眼”。开启后,网卡会把途经的所有帧都交给 Wireshark,广播帧、组播帧也一并收入囊中。抓包前还可以设置捕获过滤器(Capture Filter),它的作用是“拍之前就决定不拍哪些”,与显示过滤器完全不同。

记住这个判断逻辑,你就明白为什么排查“别人机器上的包”时,光插在一个交换机上还不够,得确保网卡开启混杂模式。摄像头装对位置、调到“全视野”模式,监控室才有后续分析的基础。

P(接收)={1,目的 MAC = 本机或广播1,混杂模式已开启0,其他情况P(\text{接收}) =\begin{cases}1, & \text{目的 MAC = 本机或广播} \\1, & \text{混杂模式已开启} \\0, & \text{其他情况}\end{cases}
网卡能否收到一个数据包,取决于目的 MAC 是否匹配本机,或者是否开启了混杂模式。这是抓包“拍得到拍不到”的根本逻辑。
  1. 目的 MAC = 本机或广播数据包点名发给本机才会被普通网卡接收,广播则人人有份。
    目的 MAC=本机 MAC∨广播\text{目的 MAC} = \text{本机 MAC} \lor \text{广播}
  2. 混杂模式开启一旦打开混杂模式,所有路过本网卡的帧都会被接收。
    混杂模式=1\text{混杂模式} = 1
  3. 其他情况既不是发给本机,也没开混杂模式,网卡直接丢弃。
    P(接收)=0P(\text{接收}) = 0

显示过滤器

录像拍回来了,十万个包裹堆在屏幕上,眼睛根本看不过来。这时候你要的不是“少拍”,而是“只显示我想看的”。显示过滤器就是监控室的智能检索框,它不删任何录像,只把命中条件的那几帧高亮显示出来,其余暂时隐藏。最常见的需求是只关心某个 IP 对某个端口的通信,例如过滤条件 ip.addr == 10.0.0.1 会把所有与这台机器相关的包挑出来。

Wireshark 的显示过滤器语法很直观:字段名 + 比较符 + 值。ip.src 是源地址,ip.dst 是目的地址,tcp.port 是 TCP 端口,http 则代表所有 HTTP 协议包。多个条件可以用 and、or、not 组合,就像监控员说“我要看上午 10 点到 11 点之间、从 3 号传送带过来、且面单写着'加急'的包裹”。

过滤器是用好 Wireshark 的分水岭。新人面对几千个包无从下手,老手输入一行 tcp.port == 8080 && http,画面瞬间只剩自己和目标服务的对话记录,定位问题的速度自然天差地别。

命中(p)=(ip.src=A∨ip.dst=A)∧tcp.port=80\text{命中}(p) = (\text{ip.src} = A \lor \text{ip.dst} = A) \land \text{tcp.port} = 80
一个数据包只要满足“源地址或目的地址是 A,且 TCP 端口是 80”,就会被当前显示过滤器展示出来。
  1. ip.src = A包的来源地址等于 A,比如某台客户端。
    ip.src=A\text{ip.src} = A
  2. ip.dst = A包的去向地址等于 A,双向都能命中。
    ip.dst=A\text{ip.dst} = A
  3. tcp.port = 80源端口或目的端口为 80,即 HTTP 默认端口。
    tcp.port=80\text{tcp.port} = 80
  4. and / or 组合地址条件用“或”,因为请求和响应分属两个方向;地址与端口用“且”,两个维度同时满足才算数。
    (… )∧(… )(\dots) \land (\dots)

三次握手

寄件人把箱子打包好,不会直接扔上传送带,而是先拨个电话:“我要寄了,你准备好了吗?”(SYN)。收件人回答:“可以,你寄吧,我也准备好了。”(SYN-ACK)。寄件人再应一声:“好,我知道了。”(ACK)。这三句对话就是 TCP 的三次握手,目的是让双方确认序号同步、窗口大小互相可见。Wireshark 里过滤 tcp.flag 就能一眼看到这三个特殊的数据包。

第一次握手,客户端发送一个 SYN 标志置 1 的包,同时带上一个随机初始序号 x,相当于“我要申请从序号 x 开始通信”。第二次握手,服务器返回 SYN+ACK,带自己的初始序号 y,并把确认号设为 x+1,意思是“我收到你的 x 了,下一个包请从 x+1 开始”。第三次握手,客户端发送 ACK,确认号设为 y+1,告诉服务器“我收到你的 y 了”。Wireshark 默认显示相对序号,所以你在界面里看到的 seq=0、seq=1,是为了阅读方便做过的“归零换算”。

在抓包里,如果只看到 SYN 却迟迟没有 SYN-ACK,说明服务器根本没响应,可能是防火墙丢弃、服务未监听;如果看到了 SYN-ACK 却没等到 ACK,问题往往出在客户端的最后确认环节。这三句对话,一句都不能少。

C→SYN(x)S→SYN(y), ACK(x+1)C→ACK(y+1)SC \xrightarrow{\text{SYN}(x)} S \xrightarrow{\text{SYN}(y),\, \text{ACK}(x+1)} C \xrightarrow{\text{ACK}(y+1)} S
三次握手的过程是:客户端发 SYN,服务器回 SYN-ACK,客户端再回 ACK。每一方的序号都要被对方确认加 1,连接才算建立。
  1. SYN(x)客户端向服务器发起连接请求,初始序号 x。
    C→SYN(x)SC \xrightarrow{\text{SYN}(x)} S
  2. SYN(y) + ACK(x+1)服务器同意连接,回应自己的初始序号 y,并确认 x+1。
    S→SYN(y), ACK(x+1)CS \xrightarrow{\text{SYN}(y),\, \text{ACK}(x+1)} C
  3. ACK(y+1)客户端确认 y+1,双方握手完成,进入数据传输阶段。
    C→ACK(y+1)SC \xrightarrow{\text{ACK}(y+1)} S

重传分析

传送带偶尔会把包裹压坏,寄件人发出包裹后迟迟收不到回执,就会重新打印面单再寄一次,这就是重传。TCP 为保证可靠传输,会给每个包编序号,并要求接收方回 ACK。发送方启动一个超时定时器;如果在超时时间(RTO)内没等到对应 ACK,就认为包裹丢了,立刻重发一次。Wireshark 会在异常包的前方写一行 [TCP Retransmission] 标记,像快递系统里“此单已补寄”的红色印章。

还有一种更聪明的情况叫快速重传:如果接收方收到了序号 5 的包,却等来了序号 7 的包,发现中间少了 6,它不会干等,而是连续回三个“我要序号 6”的重复 ACK。发送方收到三个重复 ACK 后,不等定时器到点就直接补发序号 6。Wireshark 里的快速重传通常与“重复 ACK”成对出现,你看到一排重复 ACK 紧跟着一个重传包,就知道链路里发生了乱序或短暂拥塞,而不是真正的长时间断线。

看到重传标记不用立刻判死刑。你要做的是数一数重传比例:偶尔一两次可能是网络抖动,大面积重传才说明链路质量差。这就好比快递偶尔补一单是正常损耗,如果每天都有几百件包裹要补寄,你就得检查传送带是不是出了问题。

RTO=SRTT+4×RTTVAR\text{RTO} = \text{SRTT} + 4 \times \text{RTTVAR}
超时重传的等待时间不是拍脑袋定的,而是由平滑往返时间 SRTT 加上 4 倍往返波动 RTTVAR 估算出来的。网络越稳,RTO 越接近真实往返时间。
  1. SRTT对最近一段时间的 RTT 做加权平均,代表“当前网络大概多快”。
    SRTT=平滑后的 RTT 均值\text{SRTT} = \text{平滑后的 RTT 均值}
  2. RTTVARRTT 的波动程度,网络抖动越大这个值越大。
    RTTVAR=RTT 抖动方差\text{RTTVAR} = \text{RTT 抖动方差}
  3. RTO = SRTT + 4 × RTTVAR给平均时间预留 4 倍波动余量,避免误判超时。
    RTO=SRTT+4×RTTVAR\text{RTO} = \text{SRTT} + 4 \times \text{RTTVAR}

延迟分析

客户投诉“我的包裹怎么这么慢”,监控员翻出录像,把包裹从进门到出门的每一段盖章时间都抄下来,看看它到底在哪台分拣机上躺了最久。延迟分析干的就是这件事。Wireshark 里每个包都有精确到微秒的时间戳,Time 列显示相对起始时间,选中一个请求包再选中对应的 ACK 包,两个时间一减,就是一次完整的 RTT(往返时间)。

一次 HTTP 请求的总耗时,可以粗略拆成三块:网络传输时间、服务器处理时间、中间排队时间。网络传输时间由链路质量和距离决定,服务器处理时间要看应用代码,排队时间则是中间网关或负载均衡攒了一堆请求导致等待。抓包时,你看到请求包发出,到响应包第一个字节回来之间的间隔,已经包含了这三块的叠加。

抓包分析延迟,核心就是回答一个问题:这三块里哪一块最大?如果你在客户端抓包发现 RTT 稳定在 200ms,而服务器本地压测只要 5ms,那问题多半出在网络上;反过来,客户端到服务器延迟很低,但 TTFB 等了 2 秒,那就是服务端业务代码拖了后腿。

T响应=T传输+T服务+T排队T_{\text{响应}} = T_{\text{传输}} + T_{\text{服务}} + T_{\text{排队}}
一个接口从前端发出到后端返回,总耗时 = 数据在网络上跑的时间 + 服务器干活的时间 + 在中间设备排队的时间。三部分分别对应不同的优化手段。
  1. T(传输)数据从客户端网卡到服务器网卡,加上回包全过程的时间。
    T传输T_{\text{传输}}
  2. T(服务)服务器从内核收到请求到应用层返回响应的时间,重点是代码忙了多久。
    T服务T_{\text{服务}}
  3. T(排队)请求在负载均衡、接入层、CDN 等环节等待的时间。
    T排队T_{\text{排队}}

HTTP分析

包裹拆到最里层,才是客户真正买的货。HTTP 就是大家最熟悉的“货物”,Wireshark 能自动识别并解析它。你只要在过滤框输入 http,屏幕上就只剩 HTTP 请求和响应包,展开后能看到方法、URL、状态码、头部字段等完整信息,相当于把面单和货物清单整整齐齐摊在你面前。

一个典型的 HTTP 请求包后面,跟着一个 HTTP 响应包。请求包里能看到 GET /api/order HTTP/1.1,响应包里能看到 HTTP/1.1 200 OK。Wireshark 还计算了一个关键字段叫 TTFB(Time To First Byte),也就是从请求发出到收到响应第一个字节的等待时间。TTFB 最能反映服务端处理快慢,因为它排除了响应体下载时间;如果 TTFB 很长但下载很快,说明瓶颈在服务端“想事情”的时间,而不是带宽不够。

看 HTTP 状态码时也要和过滤器结合:http.response.code == 500 能快速捞出所有失败请求,http.request.uri contains "login" 能定向追踪某个接口。货物拆开看到“易碎”“生鲜”标签后,快递员就知道该用什么方式处理它。

THTTP=TTTFB+T下载T_{\text{HTTP}} = T_{\text{TTFB}} + T_{\text{下载}}
一次 HTTP 响应消耗的总时间,等于“等第一个字节”的时间加上“下载剩余内容”的时间。前者看服务端能力,后者看带宽和文件大小。
  1. TTFB从发出请求到响应头第一字节到达,包含网络 RTT 和服务端处理。
    TTTFB=T网络+T处理T_{\text{TTFB}} = T_{\text{网络}} + T_{\text{处理}}
  2. T(下载)从第一个字节开始到最后一个字节结束,主要受带宽和内容大小影响。
    T下载T_{\text{下载}}
  3. 两者相加前端大文件卡顿查下载时间,空接口转圈慢查 TTFB。
    THTTP=TTTFB+T下载T_{\text{HTTP}} = T_{\text{TTFB}} + T_{\text{下载}}

实战排错

监控室值班员最值钱的本事,是当客户气冲冲来说“我有个包裹三天都没到”时,能冷静地问:“单号给我。”然后在监控系统里输入单号,回放这一路的所有记录。Wireshark 实战排错也是这个思路——不猜,只靠包说话。接到“接口超时”工单后,第一步在客户端或服务器侧选对网卡抓全量包;第二步用显示过滤器锁定目标 IP 和端口;第三步顺着三次握手往下看,连接到底有没有建起来。

排错是一个“分段切割”的过程:把一次请求的完整链路切成若干时间片段——DNS 解析、TCP 握手、请求发出、首个响应字节、响应传输结束。每一段的耗时分别算出来,然后找出最大的那一段。这就是用一个简单的“最大耗时定位”来锁定瓶颈:哪一段最慢,问题就出在哪一段。如果 TCP 握手就花了 3 秒,那是网络或防火墙问题;如果握手很快但 TTFB 很慢,那是服务器应用问题;如果响应中途大量重传,那是链路丢包问题。

实战里看问题不要只盯一个包,要把请求和响应、客户端和服务器的双方视角配合起来看。就像调监控一样,只看一个路口永远猜不到包裹是在上一站丢了还是在这一站堵了,把整条传送带的时间线拼起来,真相才会浮出水面。

瓶颈=arg⁡max⁡i (分段耗时i)\text{瓶颈} = \arg\max_{i}\,(\text{分段耗时}_i)
排错思路就是找链路中耗时最大的分段。把一次请求切成若干段,逐段计算时间差值,耗时最大的那段就是优先排查对象。
  1. 分段按 DNS、TCP、HTTP 请求、TTFB、下载等阶段切分。
    分段耗时i\text{分段耗时}_i
  2. argmax 取最大值从所有分段里挑出耗时最大的那个。
    arg⁡max⁡i\arg\max_{i}
  3. 锁定瓶颈最大分段对应的环节就是根因最可能所在地。

AI 应用场景

后端开发定位接口超时

阶段:部署与调试

解决的问题:线上接口偶发超时,日志只能看到统一超时异常,分不清是数据库慢、下游服务慢还是网络抖动。Wireshark 抓包能还原每次请求的 TCP 连接耗时和 HTTP 响应耗时,把模糊的“超时”切成可量化的时间片段。

具体案例:某订单服务偶发 5 秒超时,后端在服务器上抓包过滤 tcp.port == 8080,发现三次握手总是停留在 SYN 重传阶段,定位到是接入层防火墙对长连接做了空闲回收导致的重建冲突,调整 keepalive 后超时消失。

运维排查网络丢包重传

阶段:监控与告警

解决的问题:用户反馈视频卡顿,但带宽监控正常。通过抓包统计 [TCP Retransmission] 占比,能快速区分是链路丢包还是服务器处理瓶颈,替代“重启大法”式盲目排查。

具体案例:某云上服务跨可用区同步数据,反复出现传输慢。抓包后发现重传率高达 12%,且 RTT 波动剧烈,配合 ping 和 traceroute 定位到某条跨区链路上有突发拥塞,联系云厂商调整路由后重传率降到 1% 以内。

性能压测瓶颈拆解

阶段:模型服务性能调优

解决的问题:AI 推理接口单次延迟高,客户端和服务器各有归因。Wireshark 抓包后按 TTFB、下载、TCP 握手分段,判断是网络传输占大头还是服务端推理占大头,避免盲目加机器。

具体案例:一个大型语言模型 API 对外延迟 2.8 秒,抓包发现 TCP 握手仅 40ms,TTFB 占 2.4 秒,确认瓶颈在服务端推理和排队,于是优化 batch 策略,延迟降到 800ms。

Python 演示

python45 行
# -*- coding: utf-8 -*-"""用 Python 模拟 Wireshark 抓包日志分析:统计三次握手耗时、重传率、平均 RTT。""" CAPTURE = [    {"no": 1, "time": 0.000, "src": "10.0.0.1", "dst": "10.0.0.2", "flags": "SYN"},    {"no": 2, "time": 0.011, "src": "10.0.0.2", "dst": "10.0.0.1", "flags": "SYN-ACK"},    {"no": 3, "time": 0.012, "src": "10.0.0.1", "dst": "10.0.0.2", "flags": "ACK"},    {"no": 4, "time": 0.020, "src": "10.0.0.1", "dst": "10.0.0.2", "flags": "PSH-ACK",     "info": "GET /api/order"},    {"no": 5, "time": 0.021, "src": "10.0.0.1", "dst": "10.0.0.2", "flags": "PSH-ACK",     "info": "[TCP Retransmission] GET /api/order"},    {"no": 6, "time": 0.075, "src": "10.0.0.2", "dst": "10.0.0.1", "flags": "PSH-ACK",     "info": "200 OK", "rtt": 0.055},]  def analyze(packets):    total = len(packets)    retrans = sum(1 for p in packets if "[TCP Retransmission]" in p.get("info", ""))    retrans_rate = retrans / total * 100 if total else 0.0     syn_time = None    handshake_time = None    for p in packets:        if p["flags"] == "SYN" and syn_time is None:            syn_time = p["time"]        if syn_time is not None and p["flags"] == "SYN-ACK":            handshake_time = p["time"] - syn_time            break     rtt_list = [p["rtt"] for p in packets if p.get("rtt") is not None]    avg_rtt = sum(rtt_list) / len(rtt_list) if rtt_list else None     return {        "total": total,        "retrans_rate": retrans_rate,        "handshake_time": handshake_time,        "avg_rtt": avg_rtt,    }  if __name__ == "__main__":    result = analyze(CAPTURE)    for key, value in result.items():        print(f"{key}: {value}")
目的:用一个简化抓包日志样例,演示如何像 Wireshark 一样自动化统计握手耗时、重传率和平均 RTT,把排错指标变成程序输出的诊断报告。
  1. retrans = sum(1 for p in packets if "[TCP Retransmission]" in p.get("info", ""))遍历所有包,凡是 info 字段带重传标记的就计数,对应在 Wireshark 里数红色重传标记。
  2. syn_time = p["time"]记下第一个 SYN 包的时间戳,三方通话的第一句在什么时刻说出。
  3. handshake_time = p["time"] - syn_time用 SYN-ACK 到达时间减去 SYN 发出时间,得到握手响应耗时。
  4. rtt_list = [p["rtt"] for p in packets if p.get("rtt") is not None]提取所有带 RTT 字段的包,过滤掉空值,好计算平均往返时间。
  5. avg_rtt = sum(rtt_list) / len(rtt_list) if rtt_list else None有 RTT 数据才计算均值,避免除零报错。

常见误区

误区我明明点了开始抓包,等了半天一个包都没有,一定是防火墙把包全挡了。于是去改防火墙规则、重启 Wireshark,折腾半天还是零。

正解防火墙确实可能丢包,但更常见的原因是网卡选错了。Wireshark 里列出十几个接口,你选了“虚拟网卡”或“回环网卡”,而真实流量走的是以太网口,自然什么都抓不到。另外,Windows 上抓包需要以管理员身份运行,macOS 上要安装并授权 Wireshark 的抓包扩展。先检查网卡、权限、混杂模式这三件事,再怀疑防火墙。

为何常见:防火墙对“抓不到包”的表象最像“幕后黑手”,但实际上抓包工具自身的权限问题更普遍,用户下意识选了“看起来最不可能出错”的网卡选项。

误区我在过滤框输入 `http` 之后,屏幕上只剩 HTTP 包了,那没显示的包是不是已经被 Wireshark 删掉了?我得重新抓一次才能拿到完整数据。

正解显示过滤器只影响“当前视图”,一切包都还在缓存中,只是被临时隐藏。你改回 tcp 或清空过滤条件,之前的包立刻全部回来。真正决定“哪些包会被记录下来”的是捕获过滤器,它发生在抓包阶段,就像快递分拣时提前把生鲜件分流,没被捕获的包永远不会进入录像带。

为何常见:很多工具里“筛选”会直接销毁数据,用户把 Excel 筛选的直觉带到了 Wireshark 里,忽略了捕获与显示两个阶段的区别。

误区Wireshark 里出现 `[TCP Retransmission]` 标记,就断定是网络丢包,立刻找运营商投诉,结果链路质量其实很好。

正解重传只说明“发送方没等来预期的 ACK”,原因可能是真的丢包,也可能是报文乱序、延迟突然变大、接收端缓冲区拥塞,甚至发送端自身的 bug 导致超时误判。要综合看重复 ACK 的数量、RTT 曲线、抖动情况,只有大量重传伴随持续未确认时,才能定性为丢包。

为何常见:重传自带“补救”语义,人脑容易把它等同于“丢了才补”,忽略了 TCP 定时器对微小延迟波动同样敏感。

面试题

Q1. Wireshark 的核心功能是什么?

单选题 · easy

  • A.编写网络协议代码
  • B.抓取并解析网络数据包← 正确答案
  • C.编译运行 C 程序
  • D.检测服务器 CPU 温度

答案:B。Wireshark 是抓包分析工具,核心是捕获网卡经过的数据包并逐层解析。写协议代码靠编辑器,编译语言靠编译器,CPU 温度要靠监控软件,都不属于它的主职。

Q2. 混杂模式的主要作用是什么?

单选题 · easy

  • A.只接收发给本机的帧
  • B.提高网卡的数据传输速率
  • C.接收经过网卡的所有帧← 正确答案
  • D.自动过滤掉广播风暴

答案:C。普通网卡只收目的 MAC 为本机的帧,混杂模式则让网卡“不管是不是写给自己都收下”,这样才能在同一链路里观察别的设备通信。它不改变速率,也不防广播风暴。

Q3. 显示过滤器输入 http 会怎样?

单选题 · easy

  • A.只抓取新的 HTTP 包
  • B.只显示已有的 HTTP 包← 正确答案
  • C.隐藏所有 HTTP 包
  • D.统计 HTTP 包的数量

答案:B。显示过滤器只影响当前展示,不会重新抓包。http 的含义是“把协议列为 HTTP 的包显示出来”,其他包仍在缓存里。要控制抓什么,得用捕获过滤器。

Q4. TCP 三次握手中,服务器收到 SYN 后回复什么?

单选题 · mid

  • A.ACK 加上 FIN 标志
  • B.SYN 加上 ACK 标志← 正确答案
  • C.RST 重置连接标志
  • D.PSH 加上 ACK 标志

答案:B。服务器收到 SYN 后,如果同意建立连接,会回复 SYN-ACK,既告知自己的初始序号,又确认客户端的序号。FIN 是挥手阶段才出现的,RST 是异常拒绝,PSH 是数据传输阶段的推送标志。

Q5. RTT 指的是什么?

单选题 · mid

  • A.数据包单程传输的时间
  • B.发出数据到收到对应 ACK 的时间← 正确答案
  • C.服务器处理一个请求的时间
  • D.磁盘读写一个扇区的时间

答案:B。RTT 是从发送方发出数据包,到收到接收方回传的确认 ACK 之间经过的总时间,包含双向传输和处理等待,是衡量链路延迟的经典指标。单程一段路、服务器处理时间、磁盘 I/O 都不等于 RTT。

Q6. TTFB 变长但响应下载速度正常,通常说明什么?

单选题 · mid

  • A.客户端出口带宽不足
  • B.服务器处理请求较慢← 正确答案
  • C.客户端本地磁盘已满
  • D.DNS 服务器解析失败

答案:B。TTFB 是“首字节时间”,它长说明第一个字节迟迟没到,多半是服务端在业务逻辑或排队上消耗时间。下载速度正常说明带宽没有问题;DNS 失败会导致请求根本发不出去,而不是 TTFB 变长。

Q7. TCP 超时重传计算 RTO 时,通常与什么有关?

单选题 · hard

  • A.平滑 RTT 和 RTT 波动← 正确答案
  • B.最大报文段和最大传输单元
  • C.生存时间 TTL 和窗口大小
  • D.拥塞窗口和慢启动阈值

答案:A。RTO 的经典公式是 SRTT 加上 4 倍 RTTVAR,也就是把平滑往返时间加上波动余量。MSS、MTU、TTL 和拥塞控制相关参数都会影响传输,但不是计算 RTO 的直接输入量。

Q8. 接口超时排错时,Wireshark 无法直接确认什么?

单选题 · hard

  • A.三次握手是否顺利完成
  • B.请求是否发生了重传
  • C.数据库执行了哪些 SQL← 正确答案
  • D.服务端响应耗时是否过长

答案:C。Wireshark 能看出 TCP 连接建立情况、重传标记、请求与响应时间差,但数据库里的 SQL 执行计划属于应用内部行为,抓包看不到,需要靠数据库慢日志或 APM 工具配合定位。

Q9. 关于 TCP 重传,下列说法正确的是?

多选题 · mid

  • A.超时未收到 ACK 会触发重传← 正确答案
  • B.收到三次重复 ACK 会快速重传← 正确答案
  • C.出现重传就一定意味着丢包
  • D.重传包在 Wireshark 中带标记← 正确答案

答案:ABD。超时重传和快速重传是两种典型机制,Wireshark 会用 [TCP Retransmission] 标记。但重传不等于丢包,乱序、抖动、接收端拥塞都能导致重传,C 把因果说死了所以是错的。

Q10. 关于显示过滤器和捕获过滤器,正确的是?

多选题 · mid

  • A.捕获过滤器决定哪些包被记录← 正确答案
  • B.显示过滤器只影响当前展示← 正确答案
  • C.两者的语法规则完全相同
  • D.捕获过滤器在抓包前设置← 正确答案

答案:ABD。捕获过滤器在抓包开始前生效,决定“录不录”;显示过滤器在抓包后生效,决定“看不看”。两者语法并不相同,捕获过滤器基于 BPF 语法,显示过滤器用的是协议字段表达式,所以 C 错。