网络基本功(二十五):Wireshark抓包实例分析TCP重复ACK与乱序web
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 缓存
TCP的一大常见问题在于重复ACK与快速重传。这一现象的发生也是因为性能问题,本章讨论如何发现这一问题以及他们意味着什么。服务器
另外一个常见问题是前一片断丢失以及乱序片断。某些状况下,这一现象喻示着故障发生,多是因为网络问题或是抓包中断。网络
重复ACK与快速重传:ide
当网速变慢时,重复ACK是可能的缘由之一。大多数状况下,重复ACK的发生是因为高延时,延迟的变化,或没法响应ACK请求的慢速终端。工具
当重复ACK的数量保持在合理范围时,即1或2个百分比,则可能不是本机问题。性能
当有大量的重复ACK时(假设有10个),则可能:spa
通讯链路繁忙引发延迟改变命令行
服务器或客户端无响应blog
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对于收到乱序报文的响应。
抓包问题:这时仅看到乱序报文,但没有看到对可能丢失及乱序报文的响应,可能实际上并无问题。