转载请在文首保留原文出处: 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

Wireshark抓包实例分析TCP重复ACK与乱序的更多相关文章

  1. Wireshark抓包实例诊断TCP连接问题

    转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese  介绍 前文论述了TCP基础知识,从本节开始,通过TCP抓包实例来诊断TCP常见问 ...

  2. 网络基本功(二十七):Wireshark抓包实例分析HTTP问题

    转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 HTTP的问题可能是由于慢速服务器或客户端,TCP性能问题,本文讨论上述问题 ...

  3. Wireshark抓包介绍和TCP三次握手分析

    wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...

  4. wireshark抓包结果很多[TCP Retransmission]怎么办?

    有一同事问用wireshark抓包时发现很多[TCP Retransmission],这些包极大影响了自己真正想看的http数据包,如下图. 我拿到pcapng后首先看到这些包的来源ip都是固定的两个 ...

  5. wireshark抓包直观图解 TCP三次握手/四次挥手详解

    转http://www.seanyxie.com/category/linux/ 作者:seanyxie |   一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...

  6. 使用Linux的tcpdump命令结合Windows的wireshark抓包和分析

    tcpdump简介 tcpdump是Linux系统下的一款抓包命令集,工作原理是基于网卡抓取流动在网卡上的数据包.在Linux系统中由于tcpdump命令的简单和强大,我们一般直接使用tcpdump命 ...

  7. wireshark 抓包再利用TCP socket发送包里的payload是可以实现登陆的

    用户密码可被批量破解 在用户使用手机端登录时,对数据进行抓包分析. 多次抓包分析后,可得到几个关键TCP数据包. 根据前面逆向编写出的解密算法,使用socket进行数据发包测试: 可以模拟APK进行用 ...

  8. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

    Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...

  9. Wireshark抓包数据:理解与分析

    wireshark是一个非常好用的抓包工具,本文根据平时抓包经验,对之前wireshark抓包的一些常见知识点进行了整理. 有不当之处,欢迎指正 1.SYN,FIN会消耗一个序号,单独的ACK不消耗序 ...

随机推荐

  1. Struts2标签<s:textfield/>

    中的name="",取值顺序是,如不加#,先从root中栈顶取,没有取到(即使栈顶有这个属性但是属性为空还是向下取,这点和el表达式不同)就去actioncontext的map中取 ...

  2. MySQL表的增删改查和列的修改(二)

    一.使用Like模糊查找搜索前缀为以“exam_”开头的表名 show tables like 'exam_%' ; 语句结束符号是:也是用\G来表示 二.MySQL表的CRUD 2.1 创建表: C ...

  3. Listview之优化BaseAdapter中的getView中的contentView

    BaseAdapter中getView中改动的地方: @Override public View getView(int position, View contentView, ViewGroup a ...

  4. UIkit框架之UIimageview

    1.继承链:UIview:UIresponder:NSObject 2.如果你想利用这个类来制作动态图片,你需要遵守以下的原则: (1)所有的图片的大小都要一样 (2)所有的图片要使用同样的比例,同样 ...

  5. Java容器类接口的选择

    我们知道Java容器类实际提供了四类接口:Map,List,Set和Queue,如下图所示,每种接口都有不止一个版本的实现,如果在实际编写程序时需要使用某种接口时该如何选择. 从Oracle的Java ...

  6. 数据结构《9》----Threaded Binary Tree 线索二叉树

    对于任意一棵节点数为 n 的二叉树,NULL 指针的数目为  n+1 , 线索树就是利用这些 "浪费" 了的指针的数据结构. Definition: "A binary ...

  7. scp 在Ubuntu下传文件 基于ssh

    scp是linux下的远程拷贝 命令: (1)将本地文件拷贝到远程:scp  文件名 用户名@计算机IP或者计算机名称:远程路径  (2)从远程将文件拷回本地:scp  用户名@计算机IP或者计算机名 ...

  8. 在windows下安装GIT

    Git是一个免费的.开源的版本控制软件.在Windows上安装git,一般为msysgit,官方下载地址为:http://code.google.com/p/msysgit/downloads/lis ...

  9. yii表单

    yii  的dropdownlist,用yii的session可以记下选中的状态 $form = $this->beginWidget('CActiveForm',array('action'= ...

  10. 用rem来做响应式开发

    强烈推荐这篇文章:<web app 变革之rem> px转rem工具:<px转rem工具> 由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位 ...