zoukankan      html  css  js  c++  java
  • Wireshark抓包实例分析TCP重复ACK与乱序

    转载请在文首保留原文出处: EMC 中文支持论坛https://community.emc.com/go/chinese

    介绍

    TCP 的一大常见问题在于重复 ACK 与快速重传。这一现象的发生也是由于性能问题,本章讨论如何发现这一问题以及他们意味着什么。

    另一个常见问题是前一片段丢失以及乱序片段。某些情况下,这一现象喻示着故障发生,可能是由于网络问题或是抓包中断。

    更多信息

    重复 ACK 与快速重传 :

    当网速变慢时,重复 ACK 是可能的原因之一。大多数情况下,重复 ACK 的发生是由于高延时,延迟的变化,或无法响应 ACK 请求的慢速终端。

    1. 当重复 ACK 的数量保持在合理范围时,即 1 或 2 个百分比,则可能不是本机问题。
    2. 当有大量的重复 ACK 时(假设有 10 个),则可能:
    • 通信链路繁忙引起延迟改变
    • 服务器或客户端无响应

    3.  快速重传是对重复 ACK 的响应报文。

    4. 下图是该问题的示例。本例中 51 个重复 ACK 之后发生了快速重传:

    5. 以下是如何解决该问题:

    • 如果重复 ACK 和重传数量较少(少于 1 个百分比),是可以接受的。
    • 如果重复 ACK 发生在无线网络环境,或是 Internet 之上的连接,延时或是延时的改变对于这类网络来说很常见,所以也没有什么可做的。
    • 如果发生在组织内的网络,则可能有问题。如果发生在 LAN 之上,检查严重的问题,例如缓存和 CPU 负载,慢速服务器,等等。如果发生在 WAN 之上,查看延时,负载以及线路不稳定。

    工作原理

    当发现有丢失报文时(期望的序列号没有收到),或者收到了预期之外的序列号。这种情况下,接收端生成一个 ACK ,声明自己希望收到的下一个序列号。接收方持续生成丢失片段的 ACK 请求,直到实际收到。

    在发送方,当它收到三个相同的 ACK (初始 ACK 和两个重复 ACK ),就会假设有报文丢失并重传该报文,无论重传计时器是否过期。再次发送的报文称为快速重传。

    重复 ACK 也减少了发往网络的吞吐量。减少了多少吞吐量取决于 TCP 版本。比较早期的 TCP 版本中出现了重复 ACK ,发送方将吞吐量减少为之前的一半。在多个DupACK 的情况下,吞吐量减到最小。

    下图显示了重复 ACK 和重传的典型例子,本图中第一次重复 ACK 将吞吐量降低至大约 40% ,之后重传将吞吐量减至最小。

    乱序报文 :

    在两端抓包,乱序情况下需要关注三种现象:

    • 先前片段丢失 :当前收到报文的序列号高于该连接的下一个期望序列号时,表明之前的一个或多个报文未能到达
    • 乱序报文 :当前报文的序列号低于该连接先前收到的报文
    • 先前片段未能捕捉 :( Wireshark 1.8.x 及以上版本):同先前报文丢失。

    何时发生?

    用户可能在以下情况看到乱序报文:

    • 连接开始时抓包 :当建立连接时抓包,这时,看到连接上的报文没有 SYN/SYN-ACK/ACK ,因此, Wireshark 认为连接有问题。
    • 确实有报文丢失 :这时会看到丢失报文重传和 / 或重复 ACK 告知发送方重传丢失报文。

    上图是报文丢失的典型示例。从图中可见, 10.0.0.6 尝试浏览站点 62.90.90.210 。这一过程中, TCP 片段每个 1420 字节发送到 web 服务器, 334 到 336 之间 3 个报文丢失, 338 到 340 之间 2 个报文丢失。两者 Wireshark 都有提示: TCP’s previous segment is not captured.

    • 延时变化 :这可能是由于报文从源地址到目的地址经由不同的路由。检查这一点可以使用 Tracert ,在源和目的地址之间查找路由改变。如果在公司内部网络上是可以做到的,例如,在路由器上配置 trap 
    • 数据捕捉问题 :可能报文正常收发,但 Wireshark 没有捕捉到。可能有以下几种原因:
      • 数据量比较大时, Wireshark 在高比特率的情况下可能会丢失报文(高于 150-180 Mbps )。要避免这一问题,使用其他工具(大多数需要付费)。
      • 台式机不够强大,内存或 CPU 无法让 Wireshark 工作的足够快。这一点很好发现。
      • 当 LAN 交换机的端口缓存太小,报文可能被丢弃。连接到交换机(用控制台或telnet 连接)使用交换机命令行来检查该问题。
      • 无线网络抓包,由于某种原因没有看到所有发送报文。

    总结

    乱序报文的原理很简单。 TCP 发送以其字节数为编号的报文到接收方。当一个报文没有按照顺序到达时, Wireshark 就会注意到。原因有两点:

    • 确实有问题 :这时会看到重传和重复 ACK ,这是 TCP 对于收到乱序报文的响应。
    • 抓包问题 :这时仅看到乱序报文,但没有看到对可能丢失及乱序报文的响应,可能实际上并没有问题。

    参考

    Network Analysis Using Wireshark Cookbook

    这个神经病来自七院,又哭又笑的像一只老鬼
  • 相关阅读:
    今天遇到的报错Babel noteThe code generator has deoptimised the styling of ...as it exceeds the max of 500KB.
    轻松理解Promise.all 、Promise.then、Promise.race有什么区别以及使用方法
    JS循环类数组对象,获得页面所有的某个ClssaName,处理它的属性
    Angular在用户登录后设置授权请求头headers.append('Authorization', 'token');
    webpack配置less以及js中引入的图片问题
    超级容易理解的Three.js中的物体rotation
    新下载了一个框架,然后npm install时候报错npm ERR! Maximum call stack size exceeded
    webpack打包后发现有一部分代码还携带注释,如何解决?/webpack打包删除注释以及console.log--快快点进来看一看吧~~
    composer 下载扩展包
    postman 模拟登录状态
  • 原文地址:https://www.cnblogs.com/commanderzhu/p/4866801.html
Copyright © 2011-2022 走看看