text… [SYN] ← 客户端发起 … [SYN, ACK] ← 服务器回应 … [ACK] ← 客户端确认(连接建立完成)
略
tcp.port == 80访问http://neverssl.com,进去后点击关闭捕获分组
可以看到,前三条就是非常标准的三次握手流程。
相关信息
Wireshark的是"相对序列号"你看到Seq=0不是真实值,真实TCP会用随机初始序列号(ISN)防伪造。Wireshark 默认把每个连接的第一个包归一成 0,方便你看。想看真实值:菜单 编辑 → 首选项 → Protocols → TCP,取消勾选「相对序列号」。
+1,没有就是0显示过滤器(顶部输入框,抓包中/抓完后都能用):
字段 运算符 值,过滤"已抓到的数据"。 捕获过滤器(开始抓包前设置):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.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.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 | 只看 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 == 1 | 80 端口的 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)。
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
| 标志 | 英文全称 | 中文 | 阶段 | 作用 |
|---|---|---|---|---|
| SYN | Synchronize | 同步位 | 建立连接 | 发起连接,"咱们开始吧" |
| ACK | Acknowledge | 确认位 | 全程 | 确认收到对方数据,"我收到了" |
| PSH | Push | 推送位 | 传输数据 | 这段数据完整,立刻交给应用处理,别攒着 |
| FIN | Finish | 结束位 | 关闭连接 | 我不再发数据了,结束 |
| RST | Reset | 复位位 | 异常 | 出问题,强行中断连接 |
| URG | Urgent | 紧急位 | 传输数据 | 这段优先处理,插队(很少用) |
本文作者:油炸臭豆腐
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!