tcp
太好了,基于上面的 TCP 传输原理,我们现在可以用 Wireshark 来做一次传输层的分析。以下是完整流程和分析思路,你可以结合抓包实际情况逐步对照:
🔍 一、打开 Wireshark 并加载 pcap
-
启动 Wireshark
-
打开一个抓包文件(或开始抓包)
-
使用
tcp.stream eq 0过滤,聚焦某一条 TCP 会话
📦 二、从三次握手开始分析
三次握手的特征:
| 包序号 | 标志位 | SEQ | ACK | 说明 |
|---|---|---|---|---|
| 1 | SYN | x | - | 客户端发起连接,随机初始序列号 |
| 2 | SYN,ACK | y | x+1 | 服务端响应并确认 |
| 3 | ACK | x+1 | y+1 | 客户端确认连接建立 |
Wireshark技巧:
-
右键 → Follow → TCP Stream:查看整个对话
-
过滤表达式:
tcp.flags.syn == 1
📊 三、数据传输阶段分析
在数据传输阶段,你可以检查以下内容:
1. 包结构
点开任意一个 TCP 包,查看:
-
Sequence Number(序列号)
-
Acknowledgment Number(确认号)
-
TCP payload size(数据长度)
-
[SEQ/ACK analysis] 标签
2. Next Sequence Number
Wireshark 会自动显示:
Sequence Number: 1000
Next Sequence Number: 1500
表示该包携带了 500 字节数据(1500-1000)
3. ACK 包分析
-
ACK 包中没有 payload
-
ACK 的值总是 = 上一次对方发送的 SEQ + 数据长度
-
示例:
-
对方发了
SEQ=1000长度 500 -
本方 ACK =
1500
-
⚠️ 四、异常情况分析
1. 重传(Retransmission)
-
Wireshark 会标红并显示
[TCP Retransmission] -
SEQ 是之前已经出现过的,说明没有收到 ACK 或 ACK 太慢
2. Out-of-order(乱序)
-
[TCP Out-Of-Order] -
SEQ 小于或不等于上次期望的值,说明包到了但顺序错了
3. Dup ACK(重复确认)
-
[TCP Dup ACK] -
多次发送相同的 ACK 通常是丢包或乱序信号
4. Zero Window / Window Full(窗口问题)
-
Window size value: 0:接收方当前处理不过来 -
可以分析拥塞或应用程序未及时读取缓冲区
📈 五、连接终止分析(四次挥手)
| 包序号 | 标志位 | SEQ | ACK | 说明 |
|---|---|---|---|---|
| A | FIN | x | y | 主动关闭一方 |
| B | ACK | y | x+1 | 另一方确认 |
| C | FIN | y | x+1 | 被动方也关闭 |
| D | ACK | x+1 | y+1 | 最终确认 |
你可以用过滤器 tcp.flags.fin == 1 来快速定位这些 FIN 包。
🧠 六、总结分析建议
| 分析点 | 常用过滤器 | 检查内容 |
|---|---|---|
| 握手与断开 | tcp.flags.syn == 1、tcp.flags.fin == 1 |
正常三次握手 / 四次挥手? |
| 序列号/确认号 | 展开 TCP Header 看 SEQ/ACK | 是否有乱序/重传/延迟 ACK |
| 性能瓶颈 | tcp.analysis.flags == 1 |
Wireshark 自动分析标签 |
| 延迟分析 | Time 列 |
包间延迟是否稳定 |
如果你有一份具体的 pcap 抓包文件,可以上传,我可以帮你完整分析一条流的 TCP 过程,包括每一个包的含义、SEQUENCE、ACK、NEXT 逻辑、以及异常点定位。你要不要试一下?
好的!下面是一个 完整、全面且结构清晰的 TCP 异常情况分析清单,涵盖了从基本重传、乱序到高级特性如 SACK、DSACK、Zero Window 等,适合用于实际抓包分析、网络调试和性能故障定位。
✅ TCP 异常情况分析大全(全栈版)
🔁 1. 重传相关
| 异常类型 | 标志/行为 | 说明与成因 |
|---|---|---|
| TCP Retransmission | [TCP Retransmission] SEQ 重复发送 |
数据包未被确认,超时重发(RTO) |
| TCP Fast Retransmission | [TCP Fast Retransmission] 连续 3 次相同的 ACK |
快速重发,节省等待超时时间 |
| TCP Spurious Retransmission | [TCP Spurious Retransmission] |
原包已达,重传是误判(通常由 ACK 延迟引起) |
| TCP Dup ACK | [TCP Dup ACK x#] |
ACK 重复,可能提示重传窗口触发 |
| TCP DSACK | TCP Option 中有重复 SACK 区段 |
表明已收到但仍被误重传,属于“伪重传”反馈 |
🔀 2. 顺序/乱序/流控问题
| 异常类型 | 标志/行为 | 说明与成因 |
|---|---|---|
| TCP Out-of-Order | [TCP Out-Of-Order] SEQ 提前到达 |
包到达顺序不一致,常因多路径(如 ECMP) |
| TCP Previous Segment Not Captured | [TCP Previous segment not captured] |
前面一个数据包未捕获(通常为丢包) |
| TCP ACKed unseen segment | [ACKed unseen segment] |
ACK 表示收到了某段数据,但该数据未在抓包中出现(可能是抓包丢帧) |
🧱 3. 窗口控制异常
| 异常类型 | 标志/行为 | 说明与成因 |
|---|---|---|
| Zero Window | [TCP Zero Window] Window size = 0 |
接收端已满,无法再接收数据 |
| Zero Window Probe | [TCP ZeroWindowProbe] |
发送端测试窗口是否恢复(探测包) |
| Zero Window Probe ACK | [TCP ZeroWindowProbeAck] |
接收方响应探测包 |
| Window Full | [TCP Window Full] |
已发送数据达到窗口极限,等待 ACK 后再发 |
🧨 4. 连接中断 & Keepalive
| 异常类型 | 标志/行为 | 说明与成因 |
|---|---|---|
| TCP Keep-Alive | 小于 MSS 长度的数据包,无数据 | 空闲时维持连接活动 |
| TCP RST | TCP.flags.reset == 1 |
强制断链,一方关闭或拒绝连接 |
| TCP FIN | TCP FIN 标志位置位 |
正常关闭连接请求 |
| TCP Keep-Alive ACK | 仅有 ACK 位,无有效载荷 | 响应 Keepalive 探测包 |
📡 5. 高级功能支持(SACK/DSACK)
| 功能类型 | 标志/行为 | 说明与成因 |
|---|---|---|
| SACK | tcp.option.sack |
选择性确认(Selective Acknowledgment)已收到的区段 |
| DSACK | SACK 中含有重复区段,且 ACK 已经覆盖该段 | 提示你重传了其实我已收到的包(“误重传”反馈) |
🔍 6. 实用过滤器(Wireshark)
| 类型 | 过滤器语句 |
|---|---|
| 重传包 | tcp.analysis.retransmission |
| 快速重传 | tcp.analysis.fast_retransmission |
| 伪重传 | tcp.analysis.spurious_retransmission |
| 乱序包 | tcp.analysis.out_of_order |
| 重复 ACK | tcp.analysis.duplicate_ack |
| 零窗口 | tcp.analysis.zero_window |
| 窗口已满 | tcp.analysis.window_full |
| 连接重置 | tcp.flags.reset == 1 |
| 使用 SACK 的包 | tcp.option.sack |
🧠 实战建议
-
先筛选所有异常包:
tcp.analysis.flags == 1 -
关注是否有重传包无对应 Dup ACK → 可能是拥塞或内核 bug
-
使用 Expert Info(分析 → 专家信息) 视图快速总览
-
结合 TCP Stream 分析(tcp.stream eq X) 聚焦问题连接
-
多路径或负载均衡场景特别关注乱序与重传(ECMP 下尤为常见)
如果你有具体需求(例如:服务器连接慢、连接掉线频繁、某段链路延迟剧烈等),我还可以提供 逐字段抓包分析模板 或 自动分析脚本(基于 Pyshark)。需要的话我可以整理一份实用工具清单或者写个示例脚本,随时告诉我!
你提到的 DSACK(Duplicate Selective Acknowledgement) 是 TCP 中一个非常关键但常被忽略的高级机制,用于优化 重传检测 和 误判修复。我们这就来深入分析它,并补充完善异常分析部分,让它真正“全面”。
🚨 四(续):TCP 异常分析补充 —— DSACK & SACK 相关
🔁 1️⃣ SACK(Selective Acknowledgment)
✅ 作用:
-
告知发送方:“我收到了一部分乱序的数据包”
-
比如:
SEQ 1000–1500丢了,但我收到了1500–2000 -
发送方只重传 缺失部分,避免全重传
📦 包表现:
-
在 TCP Options 中含有
SACK字段 -
会列出“已成功接收的 SEQ 区间”
📌 常见抓包标记:
-
[TCP segment not captured] -
SACK: 1500-2000, 3000-3500等区间
🧠 用处:
-
优化拥塞情况下的带宽使用
-
加速恢复丢包连接
🔄 2️⃣ DSACK(Duplicate SACK)
✅ 作用:
-
发送方 错误重传了已经被接收的数据,接收方反馈:“你重传错了”
-
是 SACK 的一种扩展,用来告知 多余重传 的情况
🧪 示例场景:
-
接收方已经收到 SEQ 1000–1500
-
发送方误以为丢了,又重传了一遍 1000–1500
-
接收方通过 DSACK 通知:“你这个我已经收到了”
📦 抓包特征:
-
TCP Options 中 SACK 包含一个重复块
SACK: [1000-1500](但此时 ACK 也已 >= 1500) -
通常伴随
[TCP Dup ACK]标记
🔍 过滤器:
tcp.option.sack
🚨 常见应用场景:
-
网络抖动/ACK延迟 导致重传误判
-
高丢包环境下优化重传效率
-
Wireshark 会在 Expert Info 标出
[TCP Spurious Retransmission]+ DSACK
🧩 3️⃣ SACK 与 DSACK 的异常意义
| 状态 | 说明 | Wireshark标志 |
|---|---|---|
| SACK | 丢包/乱序时反馈已收到的区间 | TCP Options > SACK |
| DSACK | 重传包其实已经收到,是“误判” | TCP Options > DSACK |
| 多次 DSACK | 网络严重抖动或拥塞 | TCP Dup ACK + 多个 DSACK |
| DSACK + RST | 应用或防火墙强制断链,数据无效 | DSACK后跟 RST |
🔍 实战抓包识别 DSACK 的技巧
-
使用过滤器找所有含 SACK 的包:
tcp.option.sack -
分析某一条流:
tcp.stream eq N -
查看 TCP Options 区段中是否包含:
-
Kind: SACK -
Duplicate SACK blocks: present
-
-
检查此包的 ACK 值是否已包含 SACK 报告的段(即已确认)→ 说明是 DSACK
🧠 总结:异常分析维度补充总表(完整版)
| 异常类型 | 过滤器/表现 | 涉及字段/标志 |
|---|---|---|
| 重传 | tcp.analysis.retransmission |
SEQ 重复 |
| 快速重传 | tcp.analysis.fast_retransmission |
多次 Dup ACK |
| 伪重传 | tcp.analysis.spurious_retransmission |
DSACK 提示误判 |
| 乱序 | tcp.analysis.out_of_order |
SEQ 早到 |
| 零窗口 | tcp.analysis.zero_window |
Window size = 0 |
| 窗口已满 | tcp.analysis.window_full |
达到接收窗口上限 |
| 重复 ACK | tcp.analysis.duplicate_ack |
多次 ACK 相同 |
| RST 中断 | tcp.flags.reset == 1 |
异常中断连接 |
| SACK | tcp.option.sack |
TCP Options → SACK |
| DSACK | 同上,且 SACK 块为 ACK 范围内 | 表示重复包已收到,提示冗余重传 |
如果你感兴趣,我可以根据一份实际的 TCP 流日志帮你 完整识别 DSACK 包,并分析是哪种场景触发了误判重传。要不要把抓包发上来看看?我们一起逐字段解析。
你说得对,异常情况分析是抓包诊断 TCP 问题的重中之重,我们可以更细致、系统地完善“异常情况分析”这一节,涵盖更多种类的异常和背后的原因:
🔥 四、异常情况分析(完整版本)
异常情况主要集中在 TCP 可靠性机制、拥塞控制、接收方状态、网络抖动等方面。以下是常见异常及详细解释、定位方法和可能成因:
1️⃣ TCP Retransmission(重传)
标志:Wireshark 标记为 [TCP Retransmission]
表现:
-
包的
SEQ已在之前出现过 -
出现延迟或 ACK 丢失时常见
-
TCP 重传超时时间(RTO)触发
可能原因:
-
丢包(链路不稳定)
-
接收端 ACK 没有及时返回(对端负载高)
-
网络中间设备(如防火墙)丢弃包
过滤器:
tcp.analysis.retransmission
2️⃣ TCP Fast Retransmission(快速重传)
标志:Wireshark 标记为 [TCP Fast Retransmission]
表现:
-
接收方连续发送 3 个相同的 ACK(即 Dup ACK)
-
发送方无需等待超时,立即重传
原因:
-
接收方发现中间某个包未收到,但后续包已到
-
快速恢复数据传输效率的机制
3️⃣ TCP Spurious Retransmission(伪重传)
标志:[TCP Spurious Retransmission]
表现:
-
原始包可能只是延迟送达
-
Wireshark 根据时间判断是多余重传
原因:
-
原包并未真正丢失,只是网络延迟导致 ACK 晚到
4️⃣ TCP Out-of-Order(乱序)
标志:[TCP Out-Of-Order]
表现:
-
数据包到达顺序和发送顺序不一致
-
SEQ 号不是期望值
原因:
-
网络多路径(如 ECMP)导致路径不一致
-
数据包中转路径中的乱序处理
5️⃣ TCP Dup ACK(重复 ACK)
标志:[TCP Dup ACK x#]
表现:
-
接收方反复发送相同的 ACK 序号
-
暗示期望的包尚未收到
原因:
-
丢包、乱序触发的确认重发
-
可导致快速重传
6️⃣ Zero Window(零窗口)
标志:[TCP Zero Window]
表现:
-
接收方窗口大小为 0(
Window size = 0) -
发送方暂停发送数据
原因:
-
接收方缓冲区满,未及时读取数据
-
接收端进程处理能力不足或死锁
7️⃣ TCP Window Full(窗口已满)
标志:[TCP Window Full]
表现:
-
已发数据达到窗口上限
-
无法继续发送更多数据
原因:
-
接收方未及时扩大窗口或处理缓慢
-
网络状况暂时拥塞
8️⃣ Keep-Alive / ACK 但无数据
标志:间隔 30-60 秒的 ACK 包,长度为 0
表现:
-
没有数据,仅保持连接活动
原因:
-
长时间空闲连接保持
-
某些设备设置 keepalive 参数
9️⃣ Reset (RST)
标志:TCP RST 标志位
表现:
-
一方强制断开连接
原因:
-
应用程序 crash、关闭 socket
-
防火墙或中间设备拒绝连接
-
非法连接请求(如探测扫描)
🔍 实用过滤器大全:
| 名称 | Wireshark 过滤器 |
|---|---|
| 重传包 | tcp.analysis.retransmission |
| 快速重传 | tcp.analysis.fast_retransmission |
| 伪重传 | tcp.analysis.spurious_retransmission |
| 乱序包 | tcp.analysis.out_of_order |
| 重复 ACK | tcp.analysis.duplicate_ack |
| 零窗口 | tcp.analysis.zero_window |
| 窗口已满 | tcp.analysis.window_full |
| RST 断开 | tcp.flags.reset == 1 |
🧠 高阶技巧建议:
-
配合 “Expert Info” 面板查看全部异常:菜单栏 → Analyze → Expert Information
-
设置时间轴视图(Time column)查看 RTT 波动
-
结合
tcp.stream eq N聚焦某一条流,按需诊断
如果你有具体抓包内容,我可以根据这些异常类型进一步精细定位问题根因和优化建议。要不要来一份实际抓包?我帮你逐包分析!
浙公网安备 33010602011771号