编辑
2026-10-22
测试
0

目录

三次握手流程
操作
安装wireshark
打开wireshark
打开浏览器
结果展示
核心重点
常用
wireshark
举例
Wireshark 常用过滤表达式速查
一、最常用的基础过滤
二、TCP 排障专用(定位连接问题)
三、HTTP 专用(调接口/前后端联调)
四、DNS / HTTPS 专用
五、逻辑组合(进阶)
六、快速排障套路
tcpdump
举例
术语
tcp标志位表

三次握手流程

text
… [SYN] ← 客户端发起 … [SYN, ACK] ← 服务器回应 … [ACK] ← 客户端确认(连接建立完成)

操作

安装wireshark

略

打开wireshark

  • 开始捕获分组
  • 设置过滤器tcp.port == 80

打开浏览器

访问http://neverssl.com,进去后点击关闭捕获分组

结果展示

image.png 可以看到,前三条就是非常标准的三次握手流程。

相关信息

Wireshark的是"相对序列号"你看到Seq=0不是真实值,真实TCP会用随机初始序列号(ISN)防伪造。Wireshark 默认把每个连接的第一个包归一成 0,方便你看。想看真实值:菜单 编辑 → 首选项 → Protocols → TCP,取消勾选「相对序列号」。

核心重点

  • client和server的首次seq都是随机的
  • client和server的ack=对方上一次的seq+len+1(syn/fin)
    • 三次握手阶段len默认是0,传数据就不是0了
    • 有syn/fin才+1,没有就是0
  • 如果拿书页来比喻,ack确认了收到多少书页,让对方下一次直接从seq指定页发

常用

wireshark

举例

Wireshark 常用过滤表达式速查

显示过滤器(顶部输入框,抓包中/抓完后都能用):字段 运算符 值,过滤"已抓到的数据"。 捕获过滤器(开始抓包前设置):BPF 语法,只让符合的包进内存。日常排障优先用显示过滤器。

一、最常用的基础过滤
过滤表达式干什么用
ip.addr == 192.168.1.10只看这个 IP 相关的所有包(源或目的)
ip.src == 192.168.1.10只看源是这个 IP 的包(它发出的)
ip.dst == 192.168.1.10只看目的是这个 IP 的包(发给它的)
ip.addr == 192.168.1.0/24只看整个网段
tcp.port == 443只看 443 端口(HTTPS)
tcp.srcport == 443 / tcp.dstport == 443只看源/目的端口为 443
udp.port == 53只看 DNS 流量(53 端口)
tcp / udp / http / tls只看对应协议
二、TCP 排障专用(定位连接问题)
过滤表达式干什么用
tcp.flags.syn == 1看所有连接建立包(SYN 和 SYN,ACK)
tcp.flags.syn == 1 && tcp.flags.ack == 0只看握手发起方(纯 SYN,三次握手第①个包)
tcp.flags.fin == 1只看四次挥手(FIN 包)
tcp.flags.reset == 1看 RST 中断(连接被异常掐断,排障神器)
tcp.analysis.retransmission看超时重传(网络丢包/延迟的标志)
tcp.analysis.fast_retransmission看快速重传(网络拥塞/丢包的标志)
tcp.analysis.duplicate_ack看重复 ACK(接收方催促重传)
tcp.analysis.out-of-order看乱序包(路由路径抖动)
tcp.analysis.zero_window看接收窗口为 0(对端忙不过来/被压垮)
tcp.stream == 5只看某一条 TCP 流(右键→Follow→TCP Stream 自动填)
三、HTTP 专用(调接口/前后端联调)
过滤表达式干什么用
http.request只看 HTTP 请求
http.response只看 HTTP 响应
http.request.method == "POST"只看 POST 请求
http.request.method == "GET"只看 GET 请求
http.response.code == 404只看某个状态码(如 404/500)
http.request.uri contains "login"只看 URL 路径里带 login 的请求
http.host == "www.baidu.com"只看访问某个域名的流量
http.user_agent contains "curl"只看某种客户端的请求
四、DNS / HTTPS 专用
过滤表达式干什么用
dns只看 DNS 查询与响应
dns.flags.response == 1只看 DNS 响应(回包)
dns.qry.name contains "baidu"只看查某个域名的 DNS
tls.handshake.type == 1只看 TLS 握手的 ClientHello
tls.handshake.extensions_server_name contains "baidu"通过 SNI 看访问了哪些域名(未解密的 HTTPS 也能看到域名)
五、逻辑组合(进阶)
表达式干什么用
http && ip.addr == 192.168.1.10某台机器的 HTTP 流量
tcp.port == 80 && tcp.flags.reset == 180 端口的 RST 中断
!ip.addr == 192.168.1.1排除某 IP(不看它)
ip.addr == 1.2.3.4 && (tcp.port == 80 || tcp.port == 443)某 IP 的 80/443 端口
tcp.analysis.flags一把看所有 TCP 专家异常(慢/丢/乱序都标记出来)
六、快速排障套路

感觉连接"很慢/失败"时,先输入:

tcp.analysis.flags

Wireshark 会把有问题的包自动标黑/标红,再结合 tcp.analysis.retransmission 看是否反复重传,基本就能定位是丢包、拥塞还是对方拒绝(RST)。

tcpdump

举例

bash
# 抓取网卡eth0 tcp 3389端口,不解析域名端口名,只抓20个包 sudo tcpdump -i eth0 tcp port 3389 -nn -c 20 # 保存到文件里,ctrl + C结束保存 tcpdump -i eth0 tcp port 3389 -w ./frp30.pcap # 从文件中读取数据 tcpdump -r frp30.pcap -nn

术语

tcp标志位表

标志英文全称中文阶段作用
SYNSynchronize同步位建立连接发起连接,"咱们开始吧"
ACKAcknowledge确认位全程确认收到对方数据,"我收到了"
PSHPush推送位传输数据这段数据完整,立刻交给应用处理,别攒着
FINFinish结束位关闭连接我不再发数据了,结束
RSTReset复位位异常出问题,强行中断连接
URGUrgent紧急位传输数据这段优先处理,插队(很少用)

本文作者:油炸臭豆腐

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!