| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> Wireshark TS | 当超时或快速重传遇到零窗口 -> 正文阅读 |
|
[网络协议]Wireshark TS | 当超时或快速重传遇到零窗口 |
问题背景用户反馈 VNC 使用场景,在 VNC 客户端连接 VNC 服务器时,偶尔会出现客户端触摸点击的响应会延迟,延迟时间在 500ms 至 2s 之间。通过 Wireshark 捕获了数据包,看到了零窗口、乱序、重传等问题。用户对于服务器在 500ms 之后才发送重传而不是快速重传,表示疑问~ 在分析该案例起初,我也认为是一个一般的故障,但随着深入分析,该案例展示出很不一样的异常现象,故分享下一段很烧脑的分析过程。
问题分析基本信息跟踪文件信息基本信息如下
用户很好的过滤了所需的数据包,非常清晰,仅有一条 TCP Stream 0,便于排障分析。专家信息显示也证明了用户反馈的问题现象,零窗口、乱序、重传等统计。 唯一美中不足的是该 TCP 会话不完整,
深入分析首先跟踪文件初始,客户端 192.168.0.66 即出现了零窗口现象,以 [TCP ZeroWindow] 标识,并通知了服务器 192.168.0.10 。
客户端至服务器端方向在此抓包点显示这个传输方向上可能有丢包以及随之带来的重传现象。根据提示少了一个 Seq Num为 2711 ,Len 为 6 的 TCP 分段,在 No.239 进行了 TCP 重传。 首先第一个问题是,No.239 真的是一个超时重传数据包嘛? 带着这个疑问先继续往下。同样的现象在之后也有反复出现,如下,No.245 提示丢失分段和 No.254 提示重传,并且伴随着客户端本身所不断告知的零窗口现象。 开始进入一段烧脑的推导分析过程,No.254 是否是 TCP 超时重传数据包?(暂不考虑问题1 No.239)
综合以上,从个人理解也是自己能想到的场景(不排除任何可能性),可能有以下四种初步结论: 可能到此有的同学还会记得,对了,问题1 No.239 呢?和 No.254 是一个情况嘛 看起来差不多,但确实有一个细节不一样,不知道心细的同学在上面的图中是否有注意到 No.239 的 ACK Num,是的,它会小于前面数据包的 ACK Num,意味着这个数据包并不是超时重传数据包,而是原始数据包。但是由于 ACK Num 存在问题,No.239 和 No.254 不太一样的地方是, No.239 并没有被服务器端所正常接受。 在之后经由 DUP ACK 触发,在 No.277 上客户端进了一次真正的快速重传后,服务器端正常接收并确认。 结合 No.239 数据包所带来的线索,最后的结论缩小范围为两种:
服务器端至客户端方向转到服务器传输方向,也有着很不一样的地方。在客户端 192.168.0.66 ACK 135753 后,服务器端 192.168.0.10 连续发送了 5 个 MSS 的数据包,但是客户端 192.168.0.66 并没有做出确认,而是回复以 4 个 紧接着服务器端 192.168.0.10 重新发送了这 5 个 MSS 的数据包,wireshark 在此处前 4 个标识为乱序,后 1 个标识为重传,而由于间隔时间太短,Wireshark 在此判断错误,这 5 个数据包理论应该都为重传数据包,但是具体是超时重传还是快速重传呢? 仍然是缺少原始环境的进一步考证,所以分析可能的结果主要如下:
继续往下分析, 由于客户端零窗口一直存在而无法确认数据包,所以服务器在 No.240 Seq Num 135753 第一次发出后,No.249 Seq Num 135753 进行了第一次重传,正常应该在 No.265 第二次重传 Seq Num 135753,但是唯独少了这个包,一直到 No.297 才出现,同时也一样存在 IP ID 正常递增的情形,而且注意此时的 ACK Num 4209 也是递增的。 结合客户端和服务器端的故障现象和推导分析,可能得出最终这样的分析结论:客户端和服务器通讯路径中存在中间设备,会重新分配并修改数据包的 IP ID 字段,如果同时发生奇怪的乱序,就会出现重传或是假重传现象。由于客户端同时存在零窗口无法确认数据的问题下,造成故障现象反复,一直到客户端窗口恢复正常后,问题才随之消失。 总结没有实际环境加以佐证的情况下,部分故障案例分析真真真的是心累。。。 感谢阅读,更多技术文章可关注个人公众号:Echo Reply ,谢谢。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:43:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |