配色: 字号:
一站式学习Wireshark 4 网络性能排查之TCP重传与重复ACK
2014-09-01 | 阅:  转:  |  分享 
  
2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=01/7

一站式学习Wireshark(四):网络性能排查之TCP重传与重复ACK

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

介绍

作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端。但用户感到网络运行缓慢并不意味着就是网

络问题。

解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重复ACK)和流控功能说起。之后阐述如何发现网络慢

速之源。最后,对网络各组成部分上的数据流进行概况分析。这几张内容将会帮助读者识别,诊断,以及排查慢速

网络。

更多信息

接下来的内容,较多是黑白图片了。虽然看起来有点不爽,但还是很值得一看。

TCP错误恢复功能:

TCP的错误恢复功能是定位,诊断及修复网络延时的最佳工具。

延时可以在单程也可以往返方向测量。高延时是网络管理员的头号大敌。本节我们讨论TCP高延时是如何导致序列

号和确认号乱序的。

TCP重传:

主机报文重传是TCP最基本的错误恢复功能,它的目的是防止报文丢失。

报文丢失的可能因素有很多种,包括应用故障,路由设备过载,或暂时的服务宕机。报文级别速度是很高的,而通

常报文丢失是暂时的,因此TCP能够发现和恢复报文丢失显得尤为重要。

决定报文是否有必要重传的主要机制是重传计时器(retransmissiontimer),它的主要功能是维护重传超时

(RTO)值。当报文使用TCP传输时,重传计时器启动,收到ACK时计时器停止。报文发送至接收到ACK的时间称

为往返时间(RTT)。对若干次时间取平均值,该值用于确定最终RTO值。在最终RTO值确定之前,确定每一次报

文传输是否有丢包发生使用重传计时器,下图说明了TCP重传过程。

当报文发送之后,但接收方尚未发送TCPACK报文,发送方假设源报文丢失并将其重传。重传之后,RTO值加倍;

如果在2倍RTO值到达之前还是没有收到ACK报文,就再次重传。如果仍然没有收到ACK,那么RTO值再次加倍。

如此持续下去,每次重传RTO都翻倍,直到收到ACK报文或发送方达到配置的最大重传次数。



2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=02/7

最大重传次数取决于发送操作系统的配置值。默认情况下,Windows主机默认重传5次。大多数Linux系统默认最

大15次。两种操作系统都可配置。

示例如下图:

TCP重传过程发送的第一个报文如下图所示(图片不很清楚,已经尽力了):

2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=03/7

这是一个TCPPSH/ACK报文①,包含648字节数据②,从10.3.30.1发送至10.3.71.7。这是一个典型的数据报文。

在通常情况下,第一个报文发送之后很快会收到TCPACK报文。然而,在这个case里,第二个是重传报文。可以

在Packetlist面板里看到。Info栏清楚的标明“TCPRetransmission”,报文以黑色背景红色字体标出。下图

是PacketList面板中的重传示例(仍然不清楚,但可参见上图):

也可以在PacketDetails和PacketBytes面板中查看来确定是否是重传报文,如下图所示:

注意此报文与源报文相同(除了IP标识和checksum字段)。要验证这一点,比较两个报文的PacketBytes①。

在PacketDetails面板,注意到重传报文在SEQ/ACKAnalysis下面有些额外的信息②。这些信息是由Wireshark提

供的而并非报文本身。SEQ/ACKAnalysis告诉我们这确实是一个重传报文,RTO值是0.206秒,此时的RTO是基于

报文1的时间增量。

检查剩下的报文会得到类似的结果,不同之处只有IP标识和checksum,以及RTO值。要使报文之间的时间间隔形

象化,在PacketList面板中查看Time栏,如下图所示。这里可以看到RTO值的翻倍增长关系。

2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=04/7

TCP重复ACK以及快速重传:

重复ACK是指在接收方收到乱序报文时,所发出的一类TCP报文。TCP使用报文头的序列号和确认号以有效保证数

据按照发送的顺序接收和重组。

当TCP连接建立以后,握手过程中交换的一个最重要的信息是初始序列号(ISN)。一旦连接双方设定了ISN之后,

接下来发送的报文所包含的序列号增加一个数据载荷值。

假设有个主机ISN是5000,发送500字节报文至接收方。一旦报文接收之后,接收端回复一个ACK号为5500的TCP

ACK报文,基于以下公式:

SequenceNumberIn+BytesofDataReceived=AcknowledgmentNumberOut

按照上述计算结果,返回发送端的确认编号实际上是接收端希望收到的序列号。示例如下图:

数据接收方通过序列号来检查报文丢失。接收方通过追踪接收到的序列号,能够确认序列号是否乱序。当接收方收

到一个不正常的序列号,它会假设传输过程中有报文丢失。为了正确重传数据,接收方必须拥有丢失报文,所以它

发送包含有丢失报文正确序列号的ACK报文,以便发送方重传此报文。

当重传主机从发送端接收到3个重复ACK时,它会假设此报文确实在传送中丢失,并且立即发送一个快速重传。一

旦触发了快速重传,所有正在传输的其他报文都被放入队列中,直到快速重传报文发送为止。过程如下图所示:

2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=05/7

承接上文的彩图:



本例中第一个报文如下图:

2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=06/7

这是一个TCPACK报文,从数据接收端(172.31.136.85)发给发送端(195.81.202.68)①,确认前一个报文所

发送的数据。

此报文中的确认编号是1310973186②,应当是下一个接收报文的序列号,如下图所示:



不幸的是接收端的序列号是1310984130①,并不是所期望的值。这意味着报文在传送中丢失。接收端注意到报文

乱序,并且在第三个报文中发送重复ACK,如下图所示:



可以通过以下两种方式之一来确认这是一个重复ACK:

在PacketDetaisl面板中的Info栏。报文呈现黑色背景红色字体。

SEQ/ACKAnalysis下的PacketDeatails面板。扩展这一栏会发现报文显示为duplicateACK。接下来几个报文重复

此过程。如下图所示:

2014年9月1日EMCCommunityNetwork-ECN:如果看了这个你还是不会用Wireshark,那就来找我吧(8月6日完结)

https://community.emc.com/thread/194901?start=0&tstart=07/7

此文件中的第四个报文是发送端所发出具有错误序列号①的另一个数据块。因此,接收端发送第二个重复ACK②。

接收端又收到一个乱序报文③。从而触发了第三以及最后一个重复ACK④.

一旦发送方接收到接收方所发来的第三个重复ACK,它就会暂停所有传输报文并且重传丢失报文,下图显示了快速

重传过程:

重传报文同样可以通过PacketList面板的Info栏观察到。报文呈现黑色背景红色字体。这个报文的SEQ/ACK

Analysis截面告诉我们这可能是一个快速重传帧。(标识报文为快速重传的信息不是报文本身所包含的内容,而

是Wireshark的功能)。最后一个报文是接收到快速重传的ACK。



献花(0)
+1
(本文系icecity0079...首藏)