网络延迟及故障分析方法指南汇总!

电子说

1.3w人已加入

描述

前言

大家好,这里是浩道linux,主要给大家分享linux、python、网络通信相关的IT知识平台。

今天浩道跟大家分享关于网络延迟及故障分析方法相关的硬核干货!

一、Wireshark中的辅助工具

我们在安装完Wireshark时,会发现系统中还多了一些程序,例如Tshark等。这些程序都采用了命令行的工作方式,虽然体积都很小,但是功能却十分强大。

1、Wireshark命令行工具

开Wireshark的安装目录,然后按照类型对文件进行排序,就可以看到除了Wireshark.exe之外还有如图所示的一些命令行工具。

python

首先我们先来简单地看一下这些工具的功能:

Tshark.exe:这个工具可以看作是Wireshark的命令行版本,可以用来捕获数据包,也可以读取保存好的数据包捕获文件。 

editcap.exe:主要用来转换捕获数据包捕获文件的格式。

dumpcap.exe:和tshark.exe一样用来捕获数据包,保存为libpcap格式文件。

mergecap .exe:用来将多个数据包捕获文件合并成一个。

capinfos.exe:用来将显示数据包捕获文件的信息。

text2pcap.exe:将十六进制转储文件转换为数据包捕获文件。

2、使用Tshark和Dumpcap进行数据包的捕获

1. Tshark.exe使用方法

Tshark.exe是Wireshark的一个组件,可以用来捕获数据包,也可以用来查看之前保存的数据包捕获文件。

Tshark.exe也提供了对数据包的解析和保存功能。虽然没有图形化的工作界面,但是Tshark.exe的功能却十分强大。如果你希望查看Tshark.exe的全部功能,可以在命令行中输入“tshark–h”就可以查看帮助文件,这个帮助文件很大,下图只显示了其中与网络接口(网卡)有关的部分。

python

我们首先来看一个使用Tshark.exe捕获数据包的简单示例,这里至少需要指定捕获数据包所使用的网卡,在Linux下很容易查看到网卡的名称和编号。

但是查看Windows下网卡的编号则要困难很多,不过在Tshark中,可以使用如下的命令查看每个网卡的编号:

 

tshark -D

 

接下来我们使用第4块网卡来捕获数据,为了加快捕获的速度,这里使用-s参数来表示只捕获数据包的前512个字节数据:

 

tshark -s 512 -i 4

 

和Wireshark一样,Tshark还支持捕获过滤器和显示过滤器的使用,这两种过滤器的语法也和Wireshark中规定的一样,例如下面就使用了目标端口为80的过滤器:

 

tshark -s 512 -i 4 -f 'tcp dst port 80'

 

捕获到的数据包如图17-3所示:

python

需要停止捕获数据包时,可以使用“Ctrl+C”组合键。

Tshark中还提供了强大的统计功能,这个功能通过参数-z来实现,这个参数后面需要使用Tshark所指定的值,可以使用如下命令:

 

tshark -z -h

 

Tshark所有可以使用的值如图所示:

python

这里面我们选择使用“io,phs”作为-z参数的值,这里面我们添加了-q来指定不显示捕获的数据包信息:

 

tshark -i 4 -f “port 80” -q -z io,phs

 

执行该命令的结果如图所示:

python

Tshark功能详情,请参考:tshark(1)

2. Dumpcap的用法

Dumpcap也是Wireshark中自带的一个命令行工具,这种工具的优势就在于对资源的消耗较小。

你可以使用dumpcap.exe -h来查看它的帮助文件:

python

这里首先来介绍几个最为常用的选项。

-D:列出当前可以的网卡设备。

-i<>:指定要使用的网卡名字或者序号。

-f<capture filter>:使用BPF语法完成的过滤器表达式。

-b filesize:指定文件的大小。

-w<outfile>:指定用来保存文件的名称。

这个工具的使用与Tshark很相似,dumpcap详情功能,请参考:dumpcap(1)

3、使用Editcap对数据包进行修改

使用Wireshark在捕获数据包时得到的文件可能会很大,Editcap就可以将这种大文件分割成较小的文件。另外,Editcap也可以通过开始时间和停止时间来获取捕获数据包文件的子集,删除捕获数据包文件中重复数据等。

同样我们了解这个工具最好的办法还是查看它的帮助文件,使用Editcap -h可以看到:

python

同样这个帮助文件也很长,这里只显示了其中的一部分。

下面我们以实例的方式来介绍一下它的应用:

 

editcap[options]…<infile><outfile>[<packet

 

这里面的infile和outfile是必要参数,其中infile表示要处理的捕获数据包文件,outfile表示经过处理的文件。例如,我们已经将Wireshark中捕获的数据包文件保存为Traces.pcapng,现在需要将里面的前2000个数据包单独保存成另一个文件,可以执行如下所示的命令:

 

editcap –r Traces.pcapng packetrange.pcapng 1-2000

 

这里面使用了一个参数r,它的作用是保留要处理的文件Traces.pcapng,如果不使用这个参数的话,这个文件就会被删除掉。

将一个文件拆分成多个文件时,需要指定拆分的条件,例如一个捕获了100000个数据包的文件,我们就可以按照每2000个数据包为一个新文件的方式作为条件。

拆分时使用的参数为c:

 

editcap –c 2000 Traces.pcapng SplitTrace.pcapng

 

当一个文件中包含了重复的数据包时,可以使用参数d或者D来将重复的数据包去掉,其中-d在检测一个数据包是否重复的时候,只会和当前数据包的前5个进行比较,而参数-D则可以指定范围(有效值可以是0~100000)。

 

editcap –d Traces.pcapng nodupes.pcapng 

 

4、使用Mergecap对数据包进行合并

相比起其他工具,Mergecap的功能比较单一,它主要的功能就是将多个文件合并成一个文件,最基本的语法为

 

mergecap –w  infile1.pcapng infile2.pcapng…

 

也就是mergecap后面跟多个文件名,其中的第一个是其他文件合并生成的。

主要参数的作用如下:

-a:将多个文件拼接成一个文件,默认为按照数据包的时间戳进行合并。

-s<snaplen>:将文件中的数据包均截断为<snaplen>字节。

-w<outfile>:设置保存为文件名。

-F<capture type>:设置保存的文件类型,默认为pcapng。

-T<encap type>:设置保存文件的封装类型,默认和原始文件类型一致。

下面的例子中就将source1.pcapng、source2.pcapng、source3.pcapng这3个文件合并成了一个merged.pacap文件。

 

mergecap –w merged.pacap source1.pcapng source2.pcapng source3.pcapng

 

另外,我们也可以只截取目标数据包的一部分来进行合并,例如截取每个数据包的前128个字节,使用的命令如下所示:

 

mergecap –w merged.pacap -s 128 source1.pcapng source2.pcapng source3.pcapng

 

5、Capinfos的使用方法

capinfos是一个显示数据包捕获文件信息的程序。

这个程序最常见的参数如下所示:

-t输出包文件的类型

-E输出包文件的封装类型

-c输出包的个数

-s输出包文件的大小(单位:byte)

-d输出包所有包的总字节长度(单位:byte)

-u输出包文件中包的时间周期(单位:second)

-a输出包文件中包的起始时间

-e输出包文件中包的结束时间

-y输出包文件中包的平均速率(单位:byte/s)

-i输出包文件中包的平均速率(单位:bit/s)

-z输出包文件中包的平均字节长度(单位:byte)

-x输出包文件中包的平均速率(单位:packet/s)

如果需要查看这个包的所有信息:

 

capinfos caps.pcap

 

执行的结果如图所示:

python

6、USBPcapCMD的使用方法

USB技术的应用越来越广泛,我们常用的U盘、鼠标、键盘都是USB设备。我们有时也会遇见要对这种设备进行调试的情形,但是很少有人知道其实Wireshark也是可以胜任这一任务的。

Wireshark可以像处理网络中的通信一样来捕获和解析USB设备的通信。

Wireshark2.0之后就加入了对USB协议的支持,USB协议版本有USB1.0、USB1.1、USB2.0、USB3.1等,目前USB2.0比较常用。这里,我们介绍如何使用Wireshark来捕获和分析USB协议。

使用Wireshark对USB进行调试的时候需要考虑所使用的操作系统,默认情况下,Windows环境中需要安装专门的软件才能完成这个工作。不过Wireshark2.0以上的版本提供了一个名为USBPcap的工具。这个工具需要管理员的工作权限,这个工具没有提供图形化的操作界面,所以我们需要在命令行下完成这些工作。

首先我们将工作目录切换到USBPcap的安装目录:

 

cd c:program FilesUSBPcap

 

使用-h作为参数来查看这个工具的帮助:

 

C:Program FilesUSBPcap>USBPcapCMD.exe -h

 

python

如果现在需要列出当前连接设备的话,我们只需要输入这个工具的名称即可,无需任何参数。执行之后你就可以看到一个USB设备里列表,在这个列表可以找到所需要调试的设备。

下图演示了一个在我的工作环境(Windows 7)下的USB设备列表,这里面我的计算机连接了一个无线网卡,一个USB鼠标,一个USB键盘和一个USB2.0集线器,它们都连接到了\.USBPcap1上。

python

最后一行会显示“Select filter to monitor(q to quit):”,在这里面输入要捕获信息的控制设备。这里只有一个设备\.USBPcap1,所以我们输入数字1。

之后我们还要再输入一个文件的名称,你可以按照自己的习惯来命名。这个文件将用来保存捕获到的USB设备信息。

我们可以使用Enter键来开始捕获USB流量,当开始捕获之后,这个控制台不会有任何的显示。 

python

当捕获结束的时候,可以使用Ctrl+C组合键。然后USBPcap控制台就会关闭,所有捕获的数据将会保存在C:Program FilesUSBPcap下。

然后我们就可以使用Wireshark来查看这个捕获文件:

python

二、Wireshark过滤器

Wireshark的世界里有2种过滤器,分别是采集过滤器和显示过滤器,采用恰当的过滤器,不但能提高数据分析的灵活性,而且能让分析者更快看到自己想要的分析对象。

1、Wireshark采集过滤器

使用Wireshark采集数据包时,可能有诸多原因会使用到采集过滤器,比如减少采集的数据包大小来节省磁盘空间,加速问题和目标分析,提高软件自身工作速率等等。

1. 为什么要使用抓包过滤器

当网络中数据流的规模相当庞大时,只抓取满足某些条件的流量就显得十分重要了。如果用户需要在生产环境中进行流量分析,那他一定迟早会需要使用到抓包过器。用户要在开始抓包之前使用抓包过滤器。总之,Wireshark抓取的每个数据包都会提交给抓包引擎,再由抓包引擎将抓取的数据包转换成人类可以读懂的格式。但是,如果用户应用了抓包过滤器,那么Wireshark就会丢弃与用户需求不符的那些数据包。Wireshark不会将这些丢弃的数据包交给抓包引擎进行转换。相比之下,显示过器就要具体和强大得多了。在使用抓包过滤器时,用户一定要谨慎,因为如果有些数据包因为与用户定义的规则不符可能被丢弃,这些丢弃的数据包是无法恢复的。

创建过源器时要使用伯克利数据包过器(BPF)语法,还有很多协议分析软件使用的也是这种语法,因为这种语法是行业标准。这种语法很容易学习和使用,使用基本的格式来构建用户的过滤标准就行了。

2. 如何使用抓包过滤器

最简单直接的使用方式如下图,在Wireshark主体界面,直接输入抓捕过滤器表达即可。

python

也可以选择已有的过滤器名称,直接使用。

如下图:

python

3. 如何管理过滤器

管理过滤器的目的是提前定义常用的过滤器,在使用的使用直接使用,以避免再去查找语法或书写规范等操作。

选择捕获——捕获过滤器,即可打开捕获过滤器管理窗口。

python

在捕获过滤器窗口,你可以定义自己想要的过滤器并保存,下次使用的使用,直接从下拉菜单选择就行。

在定义捕获过滤器时,有个小技巧,就是多用复制功能,这种先通过复制形似的过滤器,然后再调整修改的方式能够加快过滤器的定义速度,提高定义过滤器的准确性。

python

4. 抓包过滤器语法规则

捕获过滤器应用于Winpcap,并使用 Berkeley Packet Filter(BPF)语法。这个语法被广泛用于多种数据包抓包软件,主要因为大部分数据包抓包软件都依赖于使用BPF的libpcap/Winpcap库。

掌握BPF语法对你在数据包层级更深入地探索网络来说是非常关键的。使用BPF语法创建的过滤器被称为表达式,并且每个表达式包含一个或多个原语。每个原语包含一个或多个限定词,然后跟着一个ID名字或者数字,如下图是对限定词的介绍。

python

下图是一个完整的抓包过滤器示例: 

python

在这个给定表达式的组成部分中,一个src限定词和192.168.0.10组成了一个原语。这个原语本身就是表达式,可以用它只捕获那些源IP地址是192.168.0.10的流量。

你可以使用以下3种逻辑运算符,对原语进行组合,从而创建更高级的表达式。

连接运算符与(&&)

选择运算符或(II)

否定运算符非(!)

举例来说,下面的这个表达式只对源地址是192.168.0.10和源端口或目标端口是80的流量进行捕获。

 

src 1921680.108 && port 80

 

5. 常见抓包过滤器列表

以下是常见的抓包过滤器,供参考。

过滤器 过滤器
host 192.168.1.1 所有与主机192.168.1.1相关的流量
port 8080 所有与8080端口相关的流量
src host 192.168.1.1 所有从主机192.168.1.1始发的流量
dst host 192. 168.1.1 所有去往主机192.168.1.1的流量
src port 53 所有由53端口发出的流量
dst port 21  所有去往21端口的流量
src 192.168.1.1 and tcp port21 所有从19216811且与tcp端口21相关的流量
dst 192.168.1.1 or dst 192.168.1.2 所有去往192.168.1.1或者去往192.168.1.2的流量
not port 80 所有与80端口不相关的流量
not src host 192.168.1.1  所有非主机192.168.1.1发出的流量
not port 21 and not port 22 所有既与21端口无关,也与22端口无关的流量
tcp 所有tcp流量

2、Wireshark显示过滤器

和抓包过滤器不同,显示过滤器是在现有的数据包中通过过滤条件,筛选查看想要的对象,不需要显示的内容被“隐藏”,而执行了抓包过滤器,不需要的数据包则会直接被丢弃,无法挽回。

1. 显示过滤器简介

显示过滤器远比抓包过滤器更加灵活和强大。显示过滤器不会丢失数据包,只是为了增强用户阅读而将一部分数据包隐藏起来。丢弃数据包有时并非明智选择,因为一旦数据包被丢弃,这些数据包也就无法再恢复回来了。

在分组列表面板上面的输入框,你可以输入显示过滤器,或者通过下拉显示近期使用的过滤器记录,来选择使用显示过滤器。

python

在用户配置了显示过滤器之后,只有那些满足用户过滤器设置条件的数据包才会被显示出来。使用应用了显示过滤器之后,就会在Wireshark状态栏的第二列看到使用显示过滤器后的相关信息。

python

2. 如何快速创建显示过滤器

显示过滤器可以在Packet List(数据包列表面板)上面右键,从作为过滤器、准备过滤器和对话过滤器中快速生成,如下图所示。显示过滤器使用的语法很容易理解并使用。对于新手来说,显示过滤器是一种超级强大的功能,它会让你分析起数据包游刃有余。

python

显示过滤器可以用很多不同的参数作为匹配标准,比如IP地址协议、端口号、某些协议头部的参数。此外,用户也用一些条件工具和组合运算符创建出更加复杂的表达式。用户可以将不同的表达式组合起来,让软件显示的数据包范围更加精确。在数据包列表面板中显示的所有数据包都可以用数据包中包含的字段进行过滤显示。 

3. 显示过滤器语法结构

每条显示过滤器通常都是由若干原词构成,原词之间通过连接符(如and或or等)连接,原词之前还可以添加not表示相反的意思,其语法如下所列。

 

[not] 表达式 [and or] [not] 表达式

 

下图是显示过滤器表达式中条件运算符的解释。

python

下图是逻辑运算符的说明解释: 

python

4. 常用显示过滤器参考

以下是常见显示过滤器,供参考。

python

5. 如何保存过滤器

当你创建了很多捕获和显示过滤器之后,会发现其中有一些使用得格外频繁。为了每次使用它们的时候都不重新输入,可以让Wireshark把常用的过滤器规则保存下来,供以后使用。

选择分析——显示过滤器,打开显示过滤器窗口,就能看到系统默认自带的部分显示过滤器。

python

根据自己的需求,在显示过滤器窗口,使用新增和删除功能,进行过滤器创建和删除,你也可以使用复制这一快捷的方法,先复制类似形式的已有过滤器,再通过修改名称和过滤器内容,形成新的过滤器。 

三、使用Wireshark分析数据包技巧

在进行数据包分析过程,一定会遇到成千上万的数据包需要分析的常见。如何在如此大量数据的环境中快速得到你想要的对象,提高分析效率和精准度呢?采用常见的分析技巧,也许能给你带来极大的帮助。

1、使用查找数据包

如果要快速查找到分析想要的数据,按ctr+f快捷键,打开查找输入框,输入框中可输入显示过滤器、十六进制值、字符串和正则表达式内容。

python

以下是搜索类型和例子,关于正则表达式,这里不再展开。

python

当你选好选项并在文本框中输入搜索关键词之后,单击查找,就会找到满足该关键词的第一个数据包。如果想要找到下一个匹配的数据包,按Ctrl-N,想要找前一个,按Ctrl-B。

2、标记数据包

在找到那些符合搜索条件的数据包之后,就可以根据需要进行标记。举例来说,可能你希望将那些需要分开保存的数据包标记出来,或者根据颜色快速查找它们。被标记的数据包会以黑底白字显示(你也可以单独将标记了的数据包选择出来,然后作为数据包捕获保存下来)。

被标记的数据包将在你的屏幕上以高亮显示。在下面这个例子中,数据包50被标记并且显示为深色。

python

如果你想要标记一个数据包,右击Packet List面板,并在弹出菜单中选择 Mark Packet,或者在Packet List面板中选中一个数据包,然后按Ctrl-M。

如果想取消对一个数据包的标记,再按一次Ctrl-M就可以将其取消。在一次捕获中,你想标记多少个数据包都可以。如果你想要在标记的数据包间前后切换,分别按SHIFT-CTRL-N和SHIFT-CTRL-B切换即可。

3、打印数据包

尽管大多数情况下分析都会在电脑前进行,但你仍然可能需要将捕获结果打印出来。我经常将数据包打印出来,并贴在显眼的位置,这样在做其他分析的时候,就可以快速地参考这些内容。特别是在做报告的时候,能够将数据包打印成一个PDF文件将是非常方便的。

如果需要打印捕获的数据包,在主菜单中选择文件——打印,打开打印对话框。

你可将选中的数据以文本或者Post Script的格式打印或者输出到一个文件。与 另存为对话框相似,你也可以按一定范围打印数据包,比如被标记的数据包,或者作为过滤器筛选结果显示出来的数据包。对于每一个数据包,你也可以在主面板中选择打印对象。在你做好了这些选择之后,单击打印。

python

4、设定数据包相对时间参考

时间在数据包分析中非常重要。所有在网络上发生的事情都是与时间息息相关的,并且你几乎需要在每个捕获文件中检查时间规律以及网络延迟。Wireshark意识到时间的重要性,并提供了一些相关的选项以供设定。下面介绍相对时间参考。

数据包的相对时间参考,可以让你以一个数据包作为基准,而之后的数据包都以此计算相对时间戳。当一系列的顺序事件不是在捕获开始时被触发,而是在中间某个地方被触发,这个功能会变得非常好用。

如果希望将某一个数据包设定为时间参考,在 Packet Listi面板中选择作为相对参考的数据包,然后右键,选择设置/取消设置时间参考。同样,如果要取消一个数据包的相对时间参考,还是在这个地方操作。

python

当你将一个数据包设定为时间参考之后,Packet List面板中这个数据包的Time列就会显示为REF*,如下图所示。只有当捕获的时间显示格式设定为相对于捕获开始的时间,设定数据包时间参考才有用处。使用其他设定都不会生成有用的结果,并且其产生的一堆时间会很令人迷惑。 

python

数据包相对时间参考在分析网络性能问题,网络延时,应用性能问题及最终用户体验时都极为重要,熟练掌握相对时间参考设置,能够让分析事半功倍。

下图为网深科技NetInside企业级应用性能管理系统自动分析出网络数据包中的各种延时及最终用户体验,企业级系统能够针对任意一个用户、任意一个IP、任意一个网段或任意一个应用系统做这样的分析输出,而这样的分析只需动动手指就能够完成。

python

5、汇总分析一个抓包文件 

抓包汇总功能在生成数据包分析报告时常常用到。

1. 如何打开汇总分析

要打开汇总分析,首先要打开一个抓包文件。

打开菜单——捕获文件属性,弹出的窗口就是汇总分析界面。

python

2. 汇总分析功能解读

下图是汇总分析界面,详细显示了该抓包文件的相关信息,下面我们将详细解读汇总分析中各个条目的内容。

捕获文件属性对话框可以分为下面几部分。

文件:显示的是一些总体的信息,比如文件名、文件所在位、长度、哈希、使用的格式、封装等。

时间:这一部分显示抓取第一个数据包和最后一个数据包的时间,以及之间经历的时间(也就是总的抓包时长)。

捕获:这一部分会显示捕获报文的网卡信息、操作系统信息及当前使用的Wireshark系统版本信息。

接口:这里会显示所有抓取流量接口的详细信息

统计:这里会显示与所有显示过滤器有关的统计数据,以及应用过滤器之后遭忽略数据包的百分比。

捕获文件描述:用户可以在这里写入备注信息。

python

下图是统计部分的内容,它们提供了各种详细的数据,包括以表格形式提供的汇总数据,其中包含了各类基本信息,如数据包的平均大小、抓取到的数据包总数,第一次抓到数据包和最后一次抓到数据包之间经历的时间等。

比如,我们在应用显示过滤器之后生成了一个抓包文件。在此之后,我们再次打开捕获文件属性窗口。可以看到统计部分显示了捕获文件和使用了显示过滤器后的结果比较。

python

捕获文件属性窗口所提供的所有信息来源于所有打开的数据包文件,如果使用了显示过滤器,则显示使用了过滤器的数据包。

6、查看数据包中协议信息

网络协议是网络分析的基础信息,网络分析人员拿到一个抓包文件后,往往会快速了解一下。一个抓包文件中都由哪些协议组成,这些协议的占用比例分别是多少,协议层级关系如何等等,这些疑问都可以由Wireshark自带的协议分级功能来回答。

1. 打开协议分级

要打开协议分析,意味着你已经打开了一个抓包文件。

打开菜单——协议分级,弹出的窗口就是协议分级统计界面。

python

协议分级统计可以给用户提供通信中使用到的各个协议的分布信息,同时也可以向用户展示出那些不符合网络基准的异常操作。所谓各个协议的分布信息,是指这个界面可以显示某种协议在两台主机间通信数据中所占的百分比以及相关的统计数据,比如显示每种协议分別发送和接收了多少比特、多少个数据包。用户网络当前的流量状态与网络正常状态下建立的流量基线相比较,就很容易发现网络中的异常操作。

2. 协议分级统计详细解读

协议分级统计以直观的树形图展开显示,第一列分级显示了协议信息,以及协议之间的层级关系。

后面分别列举多个指标信息,下面详细解读一下。

python

按分组百分比:显示了抓包文件中所含数据包在每一种协议类型中的占比情況(按数据包的个数来统计)。

分组:显示了每一种协议类型的数据包的个数。

按字节百分比:显示了抓包文件中所含数据包在每一种协议类型中的占比情況(按数据包的字节数来统计)。

字节:显示了每一种协议类型的数据包的字节数

比特/秒:显示了某种协议类型的数据包在抓包时段内的传输速率。

结束 分组:显示了隶属于该协议类型的数据包的净数量。

结束 字节:显示了隶属于该协议类型的数据包的净字节数。

结束 位/秒:显示了隶属于该协议类型的数据包在抓包时段内的净传输速率。

3. 如何知道某人在干什么

如果要快速查看某个人在网络上干了什么,只需要先做个显示过滤器,过滤器的内容是这个人的IP地址,例如ip.addr==10.66.2.100。然后在打开协议分析统计查看,查看到的就是这个人相关的所有协议信息。

python

协议分级统计窗口能够提供当前网络中活动的协议信息,是分析者经常使用的功能之一,因为它是当前网络的直观写照。 

7、数据包会话分析

在网络分析中,经常会有这样一个需求,就是想知道当前网络谁最活跃,谁和谁之间的流量传输最大,即占用的带宽最多,以及最活跃的对象占用了多大的带宽。

1. 什么是会话

网络中的一个会话(conversation),就如同现实中两个人在接打电话,举例来说,张三和李四会话可能是这样子的:“你好吗?”,“我很好,你呢?”,“非常好!”。

而在网络中的会话,描述的是两台主机(端点)之间进行的通信。192.168.1.2和192.168.0.10之间的一个会话可能就是这样的“SYN”” SYN/ACK””ACK”。

会话可以说基于数据链路层MAC之间的,也可以是基于网络层IP之间的,如下图举例说明这2类会话。

python

2. 如何打开会话分析

要打开会话分析,点击菜单统计——会话。

在打开的窗口,用户就会看到下图所示内容,这个窗口显示出很多列信息,包括网络中正在传输的数据包、网络中传输的比特数量、数据流量、设备的MAC地址,以及很多其他的详细信息。在窗口的最上方,用户可以看到很多标签,每个标签显示关于一种协议的信息在标签中除了协议名称之外,用户还可以看到个数字,这个数字表示的是当前独立会话的数量。

python

3. 如何查看流量最大的会话

想要找出网络中谁的流量最大,看看这些流量是从哪里传输过来的,那么用户就可以在打开的会话分析窗口,点击Pv4标签,然后按照降序来排列数据包。在这里,窗口中显示的第一行信息就是这位用户正在寻找的答案。如下图,该图显示了这里所说的信息。

python

在第一行中,用户可以看到各个端点收发了多少数据包字节,以及设备抓包的总时长。如果用户想要创建个过器,也可以用同样的方法右键点击第一行信息,然后就可以创建出用户想要设置的表达式了。选择第一个可选项A<>B,这里只会显示与地址A( Address A)和地址B( Address B)有关的数据包。

4. 会话分析常用技巧

在会话分析过程中,最常用的是针对网络第二、三、四层内容进行分析。通过点击会话分析窗口中不同标签,找到分析答案。

Ethernet标签:来观察具有不同MAC地址的主机间发生过什么样的“沟通”。

IPv4标签:来观察具有不同IPv4地址的主机间有过什么样的“交流”。

TCP或UDP标签:来观察具有不同IPv4地址的主机间所建立的各种TCP(或UDP)会话。

在现实网络分析中,使用这些常用分析标签,不但能够分析二层的广播风暴、MAC地址冲突等故障,而且能够分析网络中存在的扫描现象,感染病毒的主机定位,异常服务器发现,或者异常的应用连接行为。

遗憾的是,Wireshark无法通过图形方式直观展现这些内容,只能是一行行的表格信息。

8、数据包终端分析

和会话分析类似,会话分析告诉我们,网络中谁与谁之间的表现最活跃,占用的流量最大。终端分析,能够告诉我们,每个终端的不同表现和数据。终端可以是一个MAC地址,也可以是一个IP地址,还可以是一个IP地址+端口(TCP或UDP应用)。

1. 如何使用终端分析

终端即网络会话中的一侧。要打开终端分析,点击菜单统计——终端。即可打开终端分析窗口。

python

每台主机都可以借助网络接口卡(NIC)中的物理地址(常常称为MAC地址)进行通信,设备会使用这个地址在一个本地网络中实现通信。

比如说,在我们观察到一个网络中的流量异常繁忙时,就会发现这个流量与网络中日常传输的流量模式不同。接下来,我们就希望能够找出到底是哪台设备创建流量的模式与过去不一样。对于网络管理员来说,这时就应该使用终端分析,在打开终端分析窗口之前,可以从数据包列表面板中随便点击一个TCP数据包。此时,用户会在顶部看到很多标签,每个标签分别显示一种不同的协议。其中有些协议是激活的,有些则是非激活的。当流量中包含了与某种协议有关的数据包时,这个标签中显示的协议就是激活的;否则,这个协议就是非激活的。

首次打开终端分析界面,默认显示二层网络的终端分析信息。在窗口中,用户可以看到很多关于各个端点的详细信息,比如传输的数据包总数、传输的总字节数,以及一个端点接收和传输的字节总数与数据包总数。

python

如果想要分析网络三次信息,只需点IPv4标签。就可以轻而易举的查看到网络中IP地址信息,通过排序,就能找到数据量最大的终端地址。 

python

2. 终端分析技巧

在终端分析窗口,显示了大量的标签和密密麻麻的数据排列,可能有让人摸不着头脑。下面介绍部分终端分析的技巧,用来识别和分析常见的网络故障。

Ethernet端点(MAC地址)少,IP端点(IP地址)多:对于这种现象,可能的原因是有一台路由器来负责转发所有进、出本地LAN(IP子网)的IP流量。也就是说,对于源或目的IP地址不隶属于本地IP子网的所有数据包,其源或目的MAC地址都会是那台路由器内网LAN口的MAC地址,这属于正常情况。

IP端点(IP地址)少,TCP端点(TCP端口号)多:就是每个IP端点都试图建立或已经建立了多条TCP连接。对于

这种现象,可能正常也可能不正常。若建立或试图建立多条TCP连接的IP端点为服务器,这就属于正常情況;否则,极有可能是有人在发动网络攻击(比如, TCP SYN攻击),或开启了基于P2P的程序而导致的。

终端分析通常与会话分析结合使用,可以快速发现网络中占用流量最大的节点或会话,也可以配合显示过滤器使用。通过终端分析,也能够发现部分常见网络或应用故障,协助管理员快速解决问题。

9、HTTP协议分析工具

Web应用作为全球使用最多的应用,HTTP协议可谓功不可没。无论是个人博客、电子交易平台或是新闻资讯,Web站点随处可见,而后台默默无闻支撑其运行的则是HTTP协议,因此,如果要运维和优化好关键的基于Web应用的核心业务系统,掌握HTTP协议基础和工作原理,常见故障分析和性能优化等技能必不可少。

Wireshark内置了强大的HTTP协议分析功能。

点击菜单统计——HTTP,就可以看到Wireshark内置的针对HTTP的分析功能列表,一共4个,分别是分组计数器、请求、负载分配和请求序列(Request Sequences)。

如下图:

python

分组计数器:用来了解抓包文件中HTTP数据包的总数,以及其中HTTP请求数据包和HTTP响应数据包分别为多少。 

python

请求:用来了解(主机)请求访问的Web站点的分布情况,以及所访问的Web站点上的具体资源(指向资源的URL)。

python

负载分配:用来了解抓包文件中HTTP数据包(包括HTTP请求和HTTP响应数据包)在各Web站点间的分布情况(即访问过哪些web站点)。

python

请求序列:HTTP请求序列使用HTTP的Referer和Location头部信息,将捕获的HTTP请求排序以树状显示。该功能可以让分析人员能够看到一个HTTP请求与下一个HTTP请求的关系。 

python

10、让Wireshark图形说话

Wireshark内置了强大的数据流图形,通过图形可以直观的分析和定位故障原因。使用者想要精准的分析出问题原因,熟练掌握和使用图形功能是必备要求之一。

Wireshark自带了I/O图表、流量图、TCP流图形、UDP多播流以及对语音流量分析中的部分图形,由于UDP多播流正在开发,语音流分析使用相对较少,目前重点简单介绍前三种图形功能。

1. I/O图表

I/O图表,借助于该工具,同时配搭预先定义的显示过滤器,便可以生成各种易于阅读的信息统计图表。比如,可生成单一IP主机吞吐量统计图表、两台或多台主机间流量负载统计图表、应用程序网络吞吐量统计图表,以及TCP现象分布统计图表等。

通过这种方式,我们可以看到流量的波峰和波谷,这个图形可以用来找出网络中的问题,甚至可以用来进行流量监测。在图中x轴的数据表示时间,单位为秒,而y轴的数据表示的则是每单位时间的数据包数量。x轴和y轴的范围可以根据用户的需要而进行调整,X轴的范围是从10到0.001秒,而y轴数值的范围则是数据包/字节比特。

python

2. 流量图

流量图,该工具直观显示了会话节点之间的信息,包括时间、端口及详细的TCP传输控制和数据传输报文信息。

这是Wireshark最强大的特性之ー,当用户需要面对存在大量连接断开、大量数据帧丟失或者大量流量重传等情况的环境时,这种特性就可以协助用户进行排错。数量图可以让我们创建一个很多列的图,这张图会显示两个端点间传输流量的汇总信息,它甚至可以让用户将输出结果导出为一个简单的文本格式文件。这是验证客户端和服务器之间连接状态的最佳方式。

python

3. TCP流图形

TCP流图形,利用该工具,可深入分析单个TCP连接的内部传输和控制细节。因此,该工具能大大帮助网管人员分析和查找TCP故障,定位故障根本原因。

TCP流图形又可以按照功能细分,分别有时间分析、吞吐量分析、往返延时分析及窗口大小变化分析等等。

python

四、基于生成的IP统计分析

在网络分析过程,往往会使用到对某个地址的详细内容进行分析和统计,这个要求使用显示过滤器配合会话及终端分析功能还不足以满足。

1、怎样打开IP统计

基于IP统计分别针对IPv4和IPv6,这里只介绍IPv4的统计功能。点击菜单统计——IPv4 Statistics下拉菜单,能看到Wireshark自带的4个统计IP的功能(分别是所有地址、目标和端口、IP协议类型及源–目标地址)。

如下图:

python

2、IP统计分析详细介绍

以下是对各个IP统计功能的详细介绍。

1. 所有地址

所有地址IP统计,显示抓包文件中每个IP地址的数据包个数,频率,占有百分百和高峰值相关信息。

使用者也可以通过显示过滤器,只查看某一个或几个IP的统计数据,显示过滤器在下方直接输入即可。

python

2. 目标和端口

目标和端口,统计了各个IP传输层端口的数据包个数及相关信息。这个功能能够详细查看任意IP地址都在通过哪些端口传输数据。

python

3. IP协议类型

IP协议类型,统计不同协议的数据包个数,占比及相关信息。

python

4. 源-目标地址

源和目标地址统计,分别查看作为源地址或目的地址的IP统计信息。

python

在一份分析报告中,如果要详细分析并记录某个IP地址的内容和网络活动,采用上述IP统计功能,就能够精确、细致的统计该地址的所有细节信息,该功能也可用于异常分析。 

五、如何定位网络性能问题

定位分析网络性能问题是网络分析中最为常见的需求之一,影响网络性能的因素很多,每一个转发数据包的环节出现了问题,都有可能会造成性能的下降。

幸运的是,如果我们采集到了这些数据传输过程的原始报文,那么则可以通过Wireshark拨茧抽丝,一步步找到问题的可能答案。

1、IO图形分析工具介绍

首先,打开你想要分析的抓包文件。

点击菜单统计——I/O图表。

python

下图是I/O图表信息,在图形窗口中,上半部分区域为图形显示区域,下半部分区域为显示过滤器配置区域。 

python

在下半部分区域,通过“+”或复制按钮,新增一个图形名称,写入过滤器内容,设置颜色,同样可以设置图形的样式,Y轴和X轴的信息,以及图形显示粒度。勾选最前面的enabled列复选框,就能生效。

在Style列,双击对应的行,可以选择图形显示风格,例如line(线)、 Impulse(脉冲)、Fbar(粗线)、Dot(点)等等。

python

在Y Axis列,双击对应的行,可以选择Y轴数据单位,例如Packets(数据包)、 Bytes(字节)、bits(位)等等,还有很多公式可选择,具体内容后续会有详细讲解。 

python

还有很多其它设置,比如Y字段,显示粒度,显示间隔,鼠标行为,显示时间等,相对比较简单,不再一一细述。 

2、使用I/O工具分析

上面讲述了I/O图形分析工具的基本信息,以下看看如何使用该工具分析。

I/O分析工具的精髓在于与显示过滤器的配合使用,所以对使用者来说,对显示过滤器的理解和熟练程度,直接关系到I/O分析工具的功能发挥如何。

例如,如果要分析192.168.30.124这个地址在某段时间的数据传输状况,使用者可以创建过滤器,然后设置该对象的图形显示格式,调整Y轴和X轴的信息,不但能够从整体上查看这个地址的数据传输情况,也能够查看到更细微信息(例如把X轴时间调整为10毫秒的时间传输情况)。

python

3、测试网络吞吐量

网络吞吐量在网络分析中常常遇到,比如分析者想知道某个客户端和服务器的传输速率,或者某台服务器在网络中的带宽大小等。利用数据包分析软件,能够精确分析任何对象的网络吞吐量,这为进一步容量规划、策略调整及应用优化都有重要意义。

1. Wireshark能测试哪些吞吐量

所谓测试网络吞吐量,既可以指测算通信线路上两台设备(客户端和服务器、IP电话-IP电话等)间相互通信的吞吐量,也可以指测算两台设备上运行的某一具体应用程序间相互通信的吞吐量。

一般来说,常规的流量测试方法包括:测算主机到主机的流量、测试发往某指定服务器的所有流量、测试发往某指定服务器运行的某种应用程序的所有流量、统计发生在某指定服务器与TCP性能有关的所有现象。

如下图:

python

测试链路上未端设备之间基于单个连接所发生的流量,并了解流量的来源,是定位网络故障的第一步。

2. 测试两端设备的吞吐量

打开需要测试的抓包文件,点击菜单统计——I/O图表,在选项中,设置所有分组Y轴单位为bits,默认看到的就是该抓包文件中所有对象的吞吐量。

如下图:

python

假如,要测试客户端192.168.30.124与服务器114.112.96.29之间的吞吐量,则可以在I/O图表下部添加过滤器,表达式为 ip.addr==114.112.96.29 && ip.addr==192.168.30.124,再设置显示样式和颜色,Y轴设置为bits,时间间隔使用默认的1秒。这时候新建项目所显示的内容,就是我们想要测试的这2个终端之间的吞吐量。

如下图:

python

3. 测试某个应用程序的吞吐量

测试某个应用程序的吞吐量,方法与测试两端连接吞吐量的类似。只是过滤器内容不同。假如要测试某个抓包文件443端口的所有流量。方法如下。

打开抓包文件,点击菜单统计——I/O图表,设置过滤器,表达式为tcp.port==443,太简单调整显示设置,即可得到443端口应用的流量。如下图。

python

4、使用TCP数据流图形分析窗口大小 

滑动窗口控制机制,是整个TCP协议工作的中控台或核心站。当TCP连接建立时,协议栈会为不同的连接划分出独立的缓冲空间,而在数据传输过程中,则存在复杂的传输控制过程。由于这个过程管理和处理的复杂性,很多性能问题往往就出现在这里。

1. 打开TCP窗口分析界面

打开需要分析的抓包文件。选择想要分析的数据帧。

点击菜单统计——TCP流图形——窗口尺寸。

如下图:

python

窗口大小分析面向单向TCP会话,从打开的窗口可以看到题目信息,窗口尺寸对于某某连接及方向。如下图,显示了114.112.96.29向192.168.30.124流向中,443端口发往54645端口数据的窗口大小及数据传输情况。 

python

2. 分析TCP滑动窗口

在TCP窗口分析界面,默认显示2类线条。最上面浅绿色的是接收方宣告的窗口大小(Windows Size),代表接收方还有多大缓冲空间可接收数据。下方深色黑点则代表数据发送方的实际数据传输大小。

python

在滑动窗口分析过程,分析人员可以使用鼠标放缩功能,定位到具体的某一个细节,详细分析。如下图,通过鼠标放缩,查看数据发送方在某一时刻具体的数据发送大小和数量。 

python

3. 常见TCP窗口故障分析技巧

TCP滑动窗口分析是网络性能分析中关键的分析对象之一。针对TCP窗口可能出现的相关信息或错误,Wireshark通过内置专家系统会自动提示,或者以不同的颜色区分显示。分析人员也可以根据自己的喜好或分析习惯,自定义显示样式。

下面简要列举一下在Wireshark专家系统中,可能会看到的关于TCP窗口的相关信息,这其中可能是错误,也可能是告警或记录。

Zero Window:如果TCP接收方窗口已满,这时接收方会通知发送方,让发送方暂停一段时间,不要继续发送消息。这时,在Wireshark专家系统中就会查看到这类消息。

Zero Window Probe:如果从客户端那里接收数据包的服务器不能以客户端发送数据包的相同速率来处理数据包,就会导致丢包的情况。在这种情况下,服务器就会向客户端发送零窗口探测包。让客户端暂停一段时间不要发送数据包,同时保持这条连接不会断开。

Zero Window Probe ACK:和Zero Window Probe消息的例子有关。Zero Window Probe ACK消息是客户端发送的消息,其作用是对服务器的请求做出响应。

Window is full:这种消息的作用是通知发送方主机,TCP接收窗口当前已满。

Windows Update:这类消息可以让发送方意识到TCP接收窗口的大小已更新。

当然,与TCP窗口相关的分析信息不仅限于上述列举出来的。总之,滑动窗口分析在数据包分析过程占有较高的比重和分量,是分析人员不能忽视的对象。只有详细了解了在Wireshark中显示的这些关于TCP窗口的信息的意义和产生原因,才能在实战中得心应手,精准分析出问题根本原因。

5、服务器响应延时分析

下面这台关键主机,服务器的响应延时竟然有1秒多。

python

因为表单中看到的数据是个平均值,所以时延分布情况,需要时一步确认。在单个IP最终用户体验分析中,搜索43的主机,情况如下: 

python

发现这台主机的服务器响应延时都在秒级波动,最高值达到4秒,基于采样时间原因,我们有理由相信真实延时肯定会更大,且在同时间段,几乎没有流量,那么这个现象就比较奇怪了。

没有连接失败请求,没有多大流量,但服务器响应延时较大,因为生产网都是千M网络,看上去根本不存在影响时延的因素,所以什么原因导致此情况,值得探究。

为了进一步分析,我们在netinside系统里面,把这台主机在时间点13:36前后的数据包下载下来(按时间点下载主要是为了减少数据包的大小,更精准分析问题),导入wireshark,一探究竟。

因为服务器的响应时间,本质上就是RTT(RoundTrip Time),即往返时间。测量方法是发送一个特定序号的字节,并记录时间。

当收到确认的ACK之后,把ACK的时间,减掉之前记录的发送时间,就可以得到RTT值,该值比较大时,通常会被专家系统诊断为“网络或服务器繁忙“。    

1. 配置wireshark

数据包导入wireshark后,分析RTT需要先进行简单配置,如下:

python

该步骤是开启TCP会话时间戳计算,默认可能已经开启,如果没有开启的话,手动按上面方法开启即可,然后按以下方法,把RTT应用为列: 

python

列的名字,可以自行修改。需要注意的是,这个时间戳是由发送端系统依据自己的时钟打上去的,如果系统时间本身有误,则会给分析带来困扰,所以分析之前,先要确认各系统,包括抓包系统的时间没有问题。

2. RTT分析

经过上个步骤的配置,在wireshark中分析RTT就很简单了,只要在“应用显示过滤器”中,输入“tcp.analysis.ack_rtt > 4”,然后回车就可以了。

里面的“4”,就是我们在netinside系统中看到的4秒延迟,因为我们确定实际延迟比会比这个大,所以我们只要”>4″即可,结果如下图:

python

通过过滤,我们可以快速找到RTT>4数据包,因为我们之前是精确定位下载,所以可以看到有一个数据包的RTT值是9秒多,这与我们推测符合。

很显然,光看一个数据看不出什么情况,此时我们就需要把绿色框中“86”记下,并通过这个流ID,把这个数据包相关的流过滤出来进行分析,如下图:

python

把TCP流过滤出来后,发现个奇怪地方,即>4的RTT好像有三个(红框),而我们刚才过滤时,只看到了9.99的这个,那么为什么10秒的就不算RTT呢?

这个是不是wireshark有问题?请注意绿框,数据长度为0的ACK,我们先把TCP流图打开看下,如下图:

python

通过上图,我们可以看到两个间隔10秒,都是由43产生的,并非是一个有效的交互,上下两个报文的seq及ACK都相同。

这种现象原因是,上面playload长度为0的ACK仅仅是通知对端滑窗,因为没有传数据,所以对端不再响应,处于等待状态。

而后43开始正常发送数据时,接着使用相同的SEQ与ACK,这样就把TCP的交互继续流动起来。所以,这个10秒是由43本身等待造成,不算是RTT,而真正算RTT的就是绿框标注的,即9秒的那个交互。

由此产生的一个疑问就是,43到底在干什么,在一个TCP的交互中,总是会停下来休息一伙?我们接着查看触码内容,如下图:

python

基于解码内容,基本可以推断,这可能是一个操作mongoDB的定时任务,这样话,前面的间隔10秒与第三条间隔9秒的,本质上没有太大区别,都属于43向170的请求。

也就是说43主机每间隔差不多10秒左右就会发一个请求给170。因为是请求间隔,所以我们基本认为,这种延迟理论上不影响实际业务。

不过需要注意的是,netinsdie系统里面看到是43这台服务器的响应延时,而我们分析的实际情况是43服务器的请求延时,这明明就是两个概念,这两种不同的延时对是否存在问题的判断是有显著区别的,那这是什么问题呢?

实际上,在一个TCP流里面,其实是无法区别应用请求方向的,TCP的主动打开还是被动打开,并不能决定应用层哪个是请求,哪个是响应,所以站点TCP层的角度,方向是可以切换分析,如下图:

python

从43往170这个方向看,服务器延时(RTT)在0.3MS左右,所以很显然,170的响应延时挺正常。而如果我们切换方向,则会如下: 

python

从上可以看到,切换方向后,就有一个近10秒的延迟,而从TCP层看,这个延迟是由43来响应产生的,而我们通过上面的分析也就知道,这其实是43的请求间隔,而非响应延迟。

所以,如果站在43是台服务器的角度,把这个10秒延迟归到服务器响应延迟里面,从TCP的角度是完全没有问题的。

从刚才的分析中,我们在wireshark里面对问题抽丝剥茧,进行了透视,得出明确的结论。 

 一般情况下,不带业务请求的,通常是在三次握的时候,所以也被叫做IRTT,这个时间,基本只包含网络与服务器内核响应延时,所以会当做业务分析延时的一个基准。

在wireshark里面,如果你抓包有抓到三次握手,那么它会聪明的把这两个时间放在一起,供我们分析,如下图:

python

所以,基于这两个数值的对比,我们就可以大概率确定,问题所在方向,是应用还是网络或服务器本身。而且通过服务器响应延时的方向,即服务端或者客户端,我们也可以看到与wireshark中切换方向看到的同一效果。

到这阶段,我们基本上可以预见,应用可能存在问题,只不过,这种问题,对于业务来讲,是正常还是不正常,我们就得看业务逻辑了,而这个时候,就只能导到wireshark中去解个码。

对于内部不同业务场景下,对TCP的使用建立模型,标定基线,是后续进一步高效运维,快速发现并排除潜在业务影响的关键基础。

九、网络延迟排查实战

1、建立一个访问远程服务器的仿真网络

我们在生活和工作中经常会遇到应用程序可以使用,但是速度却变得十分缓慢的情况。例如,在使用浏览器查看某个网页的时候,可能会等待很长时间才能查看到页面的内容。对于大多数人来说,这是一个非常棘手的问题,因为在这个过程中有很多设备参与其中,而这些设备又分布在不同的位置,使用者不可能对它们逐一进行排查,所以也很难找到问题所在。

为了能够更好地了解整个网络的状况,我们首先来构建一个模拟的仿真网络,在这个网络中存在着客户端、服务器以及连接它们的各种设备。

构建完成的仿真网络如图所示:

python

这个网络主要由以下3个部分组成:

客户端所在网络,包括“客户端”“内部交换机”“网关”“DNS服务器”。

互联网,包括“互联网路由器”。

服务器所在网络,包括“目标网关”“交换机”“HTTP服务器”。

下面我们给出这个网络的具体设计过程,步骤如下所示。

(1)设计中的两个主要网络的IP地址分配为:客户端所在网络IP地址为192.168.1.0/24,目标网络所在网络IP地址为192.168.4.0/24。

(2)打开ENSP,按照图7-1中所示向网络拓扑中添加两个Server,一个Client,一个交换机S3700,3台路由器AR1220。

(3)其中client的设置如图所示。

python

(4)DNS服务器的基础设置如图所示。

python

如下图所示,在服务器信息中的“DNSServer”中添加一条DNS记录,主机域名为“www.a.com”,IP地址为“192.168.4.100”,单击“增加”按钮之后将其添加到DNS记录之后,再单击“启动”按钮。 

python

(5)两台交换机不进行任何配置,3台路由器的左侧均为GE0/0/0接口,右侧为GE0/0/1接口。

(6)3个路由器使用了动态路由协议rip,其中网关路由器的配置如下:

 


 

[Huawei]interface GigabitEthernet0/0/0

[Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0

[Huawei-GigabitEthernet0/0/0]quit

[Huawei]interface GigabitEthernet0/0/1

[Huawei-GigabitEthernet0/0/1]ip address 192.168.2.1 255.255.255.0

[Huawei-GigabitEthernet0/0/1]quit

[Huawei-rip-1]network 192.168.1.0

[Huawei-rip-1]network 192.168.2.0

(7)互联网路由器的配置如下:

 


 

[Huawei]interface GigabitEthernet0/0/0

[Huawei-GigabitEthernet0/0/0]ip address 192.168.2.2 255.255.255.0

[Huawei-GigabitEthernet0/0/0]quit

[Huawei]interface GigabitEthernet0/0/1

[Huawei-GigabitEthernet0/0/1]ip address 192.168.3.1 255.255.255.0

[Huawei-GigabitEthernet0/0/1]quit

[Huawei-rip-1]network 192.168.2.0

[Huawei-rip-1]network 192.168.3.0

(8)HTTP路由器的配置如下:

 


 

[Huawei]interface GigabitEthernet0/0/0

[Huawei-GigabitEthernet0/0/0]ip address 192.168.3.2 255.255.255.0

[Huawei-GigabitEthernet0/0/0]quit

[Huawei]interface GigabitEthernet0/0/1

[Huawei-GigabitEthernet0/0/1]ip address 192.168.4.1 255.255.255.0

[Huawei-GigabitEthernet0/0/1]quit

[Huawei-rip-1]network 192.168.3.0

[Huawei-rip-1]network 192.168.4.0

(9)HTTP服务器的基础配置,如图所示。

python

在其中的服务器信息中设置HttpServer,这里需要建立一个网页。如果你手头没有专门用来设计网页的工具,可以使用最常见的Word来完成,在C盘下建立一个名为net的文件夹。然后新建一个Word文档,在文档中输入“Hello word”。

然后在菜单栏中依次单击“另存为”→“其他格式”,起名为“default.htm”。将其保存到C盘net文件夹中(该文件更需要读者自行创建),如图所示。 

python

接下来我们在HTTP服务器中将net文件夹作为网站发布出去,这个网站只包含了一个名为“default.htm”的页面,如图所示。 

python

好了,到现在为止,我们已经完成了整个仿真环境的模拟,不妨使用client来访问HTTP服务器以验证它是否能正常工作。我们在客户端中打开“客户端信息”选项卡,左侧首先选择HttpClient,然后在右侧的地址栏中输入“http://192.168.4.100/default.htm”。

可以看到当在地址栏中输入地址之后单击获取按钮时,就会显示一个“File download”的文件保存对话框,这就表示已经成功地打开了目标页面。这里需要注意的是,模拟的浏览器并没有IE或者Firefox那么强大的功能,它无法真正地从数据包中解析并显示网页的内容。 

python

2、在Wireshark中观察远程访问的过程

现在我们已经建立好了一个仿真网络,它虽然简化了很多,但是运行原理和真实网络是完全一样的。刚刚我们使用客户端的浏览器访问了HTTP服务器,这个过程一共只用了几秒(甚至更短)。但是在这个过程中都发生了什么呢,我们对此一无所知。那么现在我们就在Wireshark的帮助下来解读刚刚所经历的一切。

在仿真网络中,我们可以使用Wireshark在任何一个节点查看数据包,这也是它的优势所在。但是在实际工作中,我们是不可能做到这一点的。因此在这个示例中,我们仅考虑在上图网络中的内部进行数据包的观察,实验过程如下所示。

(1)如下图所示,在client的端口上启动Wireshark,在实际工作中,你可以选择使用TAP来分流client的数据。

python

(2)在client的客户端中输入“http://www.a.com/default.htm”,按下“获取”按钮,如图所示。 

python

(3)返回Wireshark,查看捕获到的数据包,如图所示。 

python

下面我们就以捕获到的数据包文件为例来详细地了解刚刚都发生了什么?

按照最简单的思路来说,客户端会产生一个请求发送给服务器,然后服务器再将资源发回给客户端。 

python

不过实际的情形要远远比这复杂得多,该如何做才能将请求数据包发送到目标服务器呢?

首先我们需要明确的一点是在这个过程中客户端的工作是由“操作系统”和“应用程序”两个部分共同完成的。而客户端上网的这个过程就是先从“操作系统”开始的。

(1)首先我们使用的客户端计算机位于一个局域网内部,它所有的通信要分为局域网内部通信和局域网外部通信两种。当我们在尝试使用浏览器去访问HTTP服务器的时候,第一个步骤就是要判断这个访问的服务器与我们所使用的主机是否在同一个局域网中。这个判断需要由操作系统完成,本例中我们要访问HTTP服务器的IP地址为192.168.4.100。

操作系统要先将自己的IP地址和子网掩码转换成二进制,然后进行“与”运算。例如当前主机的IP地址为192.168.1.10,子网掩码为255.255.255.0。

计算的过程如下表所示:

python

将转换为二进制的11000000.10101000.00000001.00001010与11111111.11111111.11111111.00000000进行与运算之后,11000000.10101000.00000001.00000000就是客户端所在的子网,转换成十进制就是192.168.1.0。

同样的方法计算目标地址192.168.4.100所在的子网为192.168.4.0,二者不在同一子网。因此这个访问的服务器与我们所使用的主机不在同一个局域网中。

(2)同一局域网的通信可以直接发送给目标,但是发往不同局域网的通信则要先交给网关。因为HTTP服务器位于局域网的外部,所以现在客户端计算机的第一个工作就是要找到网关。之前客户端的设置中已经将网关设置为“192.168.1.1”。在这次通信中所有的数据包都应该由这个网关转发。 但是在局域网内部是无法使用IP地址进行通信的,因为局域网中的交换机只能识别MAC地址。

如果你仅仅告诉交换机IP地址,交换机是不能将其转发到网关的。所以现在我们需要一种可以将IP地址转换成MAC地址的机制,在网络协议中就提供了一个专门完成这个任务的协议:ARP。

ARP是通过一个查找表(ARP缓存)来执行这种转换的。当在ARP缓存中没有找到地址时,则向网络发送一个广播请求,网络上所有的主机和路由器都接收和处理这个ARP请求,但是只有相同IP地址的接收到广播请求的主机或路由器,发回一个ARP应答分组,应答中包含它的IP地址和物理地址,并保存在请求主机的ARP缓存中。其他主机或路由器都丢弃此分组。

(3)当我们成功地找到网络出口之后,接下来要做的就是客户端和服务器建立一个连接。这个连接也正是通过TCP协议的三次握手实现的。

(4)当连接成功建立之后,操作系统的工作就完成了,此时将会由应用程序来构造HTTP请求数据包。那么需要注意的是,TCP 3次握手的最后一个数据包是由客户端的操作系统发出的,而HTTP请求数据包是由客户端上的应用程序所完成的。

一般情况下,操作系统在完成TCP操作时所消耗的时间可以忽略不计。但是应用程序在构造请求或者回应时却可能造成明显的延迟。在这个阶段,客户端所发送的TCP数据包和HTTP之间的间隔就是应用程序产生所花费的时间。

(5)当客户端上应用程序产生的请求发送出去之后,经过路径到达服务器之后,服务器会给出回应,这两个数据包之间的时间就是数据包传送的时间加上服务器上应用程序的响应时间。 

3、Wireshark中时间显示

在对数据包进行分析的时候,时间是一个很重要的参考值。Wireshark会根据系统的时钟来为捕获到的每个数据包加上一个时间戳。Wireshark在保存文件的时候,也会将捕获数据包的时间保存起来。当你使用另外一台设备来打开这个文件的时候,Wireshark会根据新设备所处的时区对时间进行调整。我们在分析一些Wireshark官方的数据包时,就会遇到这种情况。因为这些数据包往往是在美国产生的,而我们位于中国,看到数据包的时间会与当时捕获的时间有所不同。

我们平时使用的时间格式有两种,一种是常用的某年某月某日,称为绝对格式。另一种就是形如秒表上的显示,这个示数表示的是经过了多久,例如2分21秒,称为相对格式。

默认情况下,Wireshark中提供了一个显示捕获数据包时刻的“Time”列,如下图所示。

python

这个列中显示的是相对值,捕获到第一个数据包的时间定义为零点,之后捕获到数据包的时间值都是距离这个零点的时间间隔,单位为微秒。

Wireshark为了能够更好地对数据包进行分析,还提供了多种时间的显示方式。如果要修改这些显示方式的话,可以在菜单栏上依次单击“视图”→“时间显示格式”,Wireshark中提供的包括如图所示的选项。

python

默认情况下,Wireshark使用的“自捕获开始经过秒数”,那么第一个捕获到数据包的时间值就是0.000000,所有其他的数据包都是参照第一个数据包定的,这样就是显示了从捕获开始所经过的时间。我们也可以使用其他的格式,从Wireshark这个菜单中提供的名称上可以很清楚地了解到这些格式的意义。例如“自上一个捕获分组经过的秒数”就表示显示当前数据包和它前面时间数据包的间隔。而“自上一个显示分组经过的秒数”则表示在使用了显示过滤器的情况下,当前数据包和它前面数据包的间隔。

这个菜单的下半部分显示了时间的精度,默认为自动。这里我们同样可以对其进行调整,这些精度可以设置为秒、十分之一秒、百分之一秒、毫秒、微秒、纳秒等。大部分的设备都可以精确到毫秒级,但是如果要精确到纳秒级别的话,就需要考虑网卡是否支持。如果使用一个不支持纳秒的设备捕获数据包的话,而我们又在这里设置了精度为纳秒的话,最后面的3位就会显示全部为0。 只使用某一种时间格式的话不太容易看出数据包之间的关联,但是来回切换时间格式又过于烦琐。这时我们就可以选择在原有时间列的基础上再添加新的列,这个列用来显示当前包与前面包的时间间隔,具体的步骤如下。

(1)首先单击菜单栏上的“编辑”→“首选项”,或者直接单击工具栏上的“首选项”按钮。

(2)然后在如下图所示的首选项窗口左侧选择“外观”→“列”。 

python

(3)这时首选项窗口的右侧就会显示出当前数据包列表中的全部列,点击左下方的“+”号就可以添加新的一列。

(4)这时在首选项窗口的右侧就会添加新的一行,这一行分成两个标题和类型两个部分,我们单击标题处为新添加的列起一个名字,这里我们为其起名为tcp.time_delta。

(5)在类型下面的Number下拉列表框处,选中我们需要的列内容。

其中和时间有关的选项如图所示:

python

“Absolute date,as YYYY-MM-DD,and time”:这个选项用来显示捕获设备所处时区的日期和时间,例如“2018-04-25 12:53:06.775724”。

“Absolute date,as YYYY/DOY,and time”:这个选项同样是用来显示捕获设备所处时区的日期和时间。但是不显示月和日,而是一年中的第多少天。例如2018年4月25日就是这一年的第115天,按照这个格式显示就是“2018/115 12:53:06.775724”。

Relative time:这个选项用来显示当前数据包距离捕获第一个数据包的时间间隔。

Delta time:这个选项用来显示当前数据包距离上一个数据包的时间间隔。

Delta time displayed:这个选项用来显示当前数据包距离上一个数据包(在使用了显示过滤的情况下)的时间间隔。

Custom:虽然上面提供了很多可以使用的时间格式,但是我们可能还会需要进行一些自定义的操作。例如在计算同一个会话中这些数据包之间的时间间隔,这时前面的格式就无法满足这个需求了,于是Wireshark还提供了一个Custom(自定义)功能。

如图所示,我们在类型里选择使用Custom类型,在字段处输入“tcp.time_delta”,最后在字段发生处添加一个“0”。 

python

(6)单击“OK”按钮即可将这个列添加到数据包列表面板中。

在数据包列表面板中已经多了一个名为“tcp.time_delta”的列,但是现在该列还不能正常工作。我们还需要完成如下的步骤。

在Wireshark首选项窗口中依次选择“Protocols”→“TCP”。 

勾选“Calculate conversation timestamps”,默认这个选项是不被选中的。选中之后Wireshark会为TCP会话中的数据包再加上一个新的时间戳,用来表示该数据包在当前会话的产生时间。

python

单击“OK”按钮。这时再查看数据包列表面板就可以看到新的一列已经起作用了。

Wireshark提供了这么多的时间格式,那么我们又该如何对它们进行选择呢?这个问题的答案其实很简单,首先我们需要明确Wireshark分析的目的是什么,然后才能确定要使用的时间格式。比如我们需要知道捕获数据包的具体日期和时间,或者需要找出与系统日志相关的数据包时,就可以采用“Absolute date,as YYYY-MM-DD,and time”这种绝对时间格式。如果我们要研究在开始捕获之后的一段特定时间内发生的事件,就可以使用”“Relative time”这种相对时间格式。如果你希望对特定数据包(例如客户端和服务器之间的请求和应答)之间的时间间隔进行研究,“Delta time”这种时间格式则是很好的选择。

这里还必须提到一点,在默认情况下,Wireshark会以捕获第一个数据包的时间作为原点。但是我们也可以自行将某一个数据包定义为原点,具体的方法是在一个数据包上单击鼠标右键,在弹出的菜单上选中“设置/取消设置时间参考”,此时这个数据包的时间列就会显示为“*REF*”。如果我们使用了相对时间格式的话,它之后的所有数据包都会将这个数据包的捕获时间作为原点。 

4、各位置延迟时间的计算

在整个上网过程中,一共可以分成4个阶段,但是由于其中的ARP阶段位于内网,而且速度非常快,因此通常不会引起网络延迟,这里只考虑后面的3个阶段,分别是网络传输延迟、客户端应用程序引起的延迟和服务器应用程序引起的延迟。需要注意的一点是,这种延迟分类的方法是基于Wireshark捕获数据包得出的。

下图显示了上网过程中捕获到的数据包:

python

这5个数据包的含义如下图所示,其中①②③④⑤分别对应着上图中的第9、10、11、12、13这几个数据包。 

网络拓扑图:

python

1. 网络传输延迟的计算

当发生网络延迟时,我们首先需要考虑的就是传输线路导致的延迟。如图所示,我们首先来查看捕获到的TCP 3次握手中的第2个数据包。

python

它的tcp.time_delta值为0.062,这个值是由3个时间共同组成的:

从客户端到服务端的时间;

服务端操作系统接收TCP 3次握手的syn请求,并回应一个(syn,ack)回应;

从服务端到客户端的时间。

考虑操作系统在处理TCP握手时的时间很短,这个值可以看作是由第一个和第3个时间组成的,也就是数据包在线路上传输所花费的时间。如果这个值较大的话,则说明线路传输时出现了延时,这个原因可能是由服务端和客户端之间的设备造成的。 

2. 客户端延迟的计算

第2个网络延迟的位置就位于客户端,这是由于客户端上的应用程序造成的。我们平时所使用的浏览器就是一个典型的例子,当你使用浏览器打开了太多的窗口时,速度就会变得十分缓慢。另外,很多用来完成网络操作的客户端由于设计的缺陷也会消耗大量的时间。

这部分延迟时间的值可以通过查看第12个数据包的time_delta值得到。其中第11个数据包是由操作系统产生并发送出去的,这是因为客户端操作系统在处理TCP连接时的时间很短,例如图中这个值为0(实验环境,实际情况中要比这大一些)。

在客户端操作系统向目标发送了TCP 3次握手的最后一次握手包之后,客户端的应用程序还会继续向目标发送一个HTTP请求。这个请求所花费的时间就是客户端延迟的时间。

python

3. 服务端延迟的计算

如果排除了前面两个网络延迟的可能性,那么延迟的位置就只能位于服务器。由于我们现在的观察点位于客户端,所以并不能直接获得服务器产生HTTP回应的时间。我们可以观察第12个数据包(客户端发出的HTTP请求)和第13个数据包(服务端发出的HTTP回应)之间的时间来计算这个时间。

如图所示,这个0.109秒是由网络传输和服务端产生回应共同构成的,所以我们可以大致估计服务端用来生成回应的时间为0.109−0.062=0.047。 

python

如果网络发生延迟的话,我们可以根据下面的方法来确定延迟发生的位置。 

如果上面网络拓扑图中的②处数据包的延时较大的话,则可以确定延迟发生在传输的路径上。

如果上面图网络拓扑图中的④处数据包的延时较大的话,则可以确定延迟发生在客户端处。

如果上面图网络拓扑图中的⑤处数据包的延时较大的话,则可以确定延迟发生在服务器处。

十、网络故障排查实战

1、建立一个用于测试的仿真网络

为了能够更好地了解整个网络的状况,我们首先来构建一个模拟的仿真网络,在这个网络中存在着客户端、服务器以及连接它们的各种设备。

构建完成的仿真网络如图所示:

python

这个网络结构的配置和延迟的网络拓扑图基本一样,只是在内部网络中多添加了PC1和PC2,其中PC1的配置如图所示。 

python

而PC2的IPv4配置中采用了DHCP方式,如图所示。 

python

另外由于这个实验中我们还需要一台DHCP服务器,这里为了精简网络结构,所以我们在原来的网关路由器上开启了DHCP功能,开启的命令如下所示:

 


 

interface GigabitEthernet0/0/0

ip address 192.168.1.1 255.255.255.0

2、导致不能上网的原因

在实际生活中导致计算机不能上网的原因有很多,正常情况下我们可以按照如下的步骤来进行故障排除。

检查用户所用设备的网卡是否正常启动。

检查用户所用设备上每个网卡的IP地址、子网掩码、默认网关配置是否正确。

检查用户所在网络的ARP协议是否正常工作,例如网关的MAC地址是否正确。

检查用户所在网络的DNS协议是否正常工作。

检查用户所使用的具体网络服务是否正常工作。

下面我们就按照这个顺序来分别研究一下这些故障,其中前两个故障的排除都属于计算机的基本配置。

3、检查计算机的网络设置

1. 确保网卡正常启动

虽然在正常情况下设备的网卡都是启用的,但是也有很多情况网络故障确实是由于网卡没有启动所造成的。在Windows操作系统中我们可以使用命令行中的ipconfig命令来查看网卡的状态和基本信息(IP地址、子网掩码、网关等信息)。如果在Linux系统中的话,可以使用ifconfig命令。

如图所示,这里面的①部分的“本地连接4”就是一个没有启动的网卡,而②部分的“本地连接2”则是一个正常工作的网卡,我们需要确保当前要使用的网卡已经启动。

python

2. 检查IP配置的正确性

一台计算机如果需要正常上网的话,那么就需要配置如下信息:

IP地址;

子网掩码;

网关地址;

DNS服务器地址。

通常一台计算机的IP配置有两种方法,一是手动配置,二是使用DHCP分配的方式。这里面的网络配置包括IP地址、子网掩码、网关和DNS服务器地址。当你使用ipconfig命令查看之后,发现网卡虽然启用,但是没有显示IP地址时,就需要询问网络管理员,或者参考同一单位其他人的计算机来确定IP配置所使用的方法。如果该计算机所处网络采用手动配置的方法,那么就需要根据网络的部署对其进行配置。

下图给出了Windows环境下对IP配置的方法:

python

如果这个网络要求采用DHCP动态分配IP方法的话,那么我们就需要对其进行分析了。

如图所示,以内部网络的PC2为例,该主机采用DHCP动态分配IP地址的方式。但是在工作中却发现该主机无法上网。 

python

我们对这个主机进行检查,使用“ipconfig”命令查看这台主机的网络设置,发现并没有得到IP地址等信息。 

python

现在我们可以确定该计算机不能上网的原因在于没有通过DHCP协议获得IP地址等信息,但是究竟是由于本机受到病毒感染从而造成DHCP协议不能正常工作,还是DHCP服务器没有正常工作,这还需要我们进一步分析。

首先我们可以在PC2处使用Wireshark进行抓包分析:

python

在Wireshark中使用“bootp”作为显示过滤器,可以看到如下图所示的数据包。

python

这里可以看到PC2在网络中持续发送“DHCP Discover”数据包,这些数据包的目的地址为“255.255.255.255”,表示这是一个广播数据包。而源IP地址为“0.0.0.0”则是因为该计算机现在还没有得到IP地址,不过由于它本身具有MAC地址,所以可以在局域网内部通信。

我们打开这个数据包的Ethernet部分可以看到它的MAC地址为“54:89:98:1c:67:fb”,如图所示,这也正表明了该数据包来自于PC2。 

python

继续向下移动到Bootstrap位置,我们可以看到这个信息的类型为Boot Request (1)。 

python

DHCP的消息一共有8种,下表给出了DHCP协议中的8种类型。 

python

python

按照DHCP协议的要求,客户端会在网络中广播“DHCP Discover”请求,用来寻找DHCP服务器,而当服务器收到这个请求之后,会用DHCP Offer来响应DHCP DISCOVER报文,此报文携带了各种配置信息。但是在我们刚刚捕获到的数据包中,却没有发现“DHCP Offer”报文,这说明在DHCP服务器端出现了问题。

通过排查,我们发现DHCP服务器已经被关闭。我们随后启动DHCP服务器,然后继续使用Wireshark查看捕获到的数据包。

python

如果一台机器正常启动的话,最先捕获到的两个数据包分别为DHCP Discover和DHCP Offer数据包,然后是DHCP Request和DHCP Acknowledgment数据包。

在DHCP Offer数据包中包含如下数据:

你(客户端)的IP地址:这是DHCP服务器提供可以使用的IP地址。

子网掩码:这是DHCP服务器提供的可以在网络上使用的子网掩码。

域名服务器:这是DNS服务器的IP地址。

网关:这是网关的IP地址。

这些信息是保证网络通信最基本的内容,正常情况下,用户的设备会收到一个这样的DHCP Offer数据包回应。

下面我们给出了一个完整的DHCP Offer数据包的详细内容,如图所示。 

python

当网络比较繁忙时,我们也可以使用过滤器来只显示出指定类型的DHCP数据包,例如只显示DHCP Acknowledgement类型的数据包,这个过滤器表达式为:

 

bootp.option.dhcp==5

 

如果方便的话,可以将这个过滤器作为一个按钮。另外我们也可以将显示异常的DHCP过滤器字符串作为一个按钮,例如当网络中出现第4类型、第6类型、第7类型的DHCP数据包都会导致用户设备不能上网,这个过滤器如下所示:

 

bootp.option.dhcp==4||bootp.option.dhcp==6||bootp.option.dhcp==7

 

可以单击过滤表达式右侧的“+”,然后在标签里输入名称DHCP Error,在过滤器中输入上面的表达式,然后单击“OK”按钮。 

python

以后如果你需要使用这个过滤器,只需要单击右侧的“DHCP Error”。 

python

4、检查与网关的连接

当客户端获得了IP地址、网关和DNS服务器信息之后,接下来要检查的就是网关。因为网关充当着整个网络的出入口,所以客户端必须要能够连接到它。

如图所示,我们可以使用“ping”命令来测试与网关的连接情形。

python

如果ping不通的话,则说明与网关的连接出现了问题。如果线路没有问题的话,则可能考虑两种情况,一是网关已经关闭,二是ARP协议出现了问题。 

计算机需要使用ARP协议来解析位于同一网络的网关的MAC地址。如果希望更好地对ARP数据包进行观察的话,可以使用过滤器来完成对ARP数据包的过滤,显示过滤器的写法为“arp”。

另外你也可以在用户的设备上使用“arp-a”命令来查看系统缓存中的IP与MAC地址的对应关系,如下图所示。

python

如果ARP缓存中网关的IP地址与MAC地址对应没有问题,就可以判断ARP协议能够正常工作。

5、检查DNS协议

当我们需要连接到互联网的某个网站的时候,使用的往往是一个域名而不是IP地址,这个过程中需要连接到DNS服务器对其进行查询。

一个正常的DNS应答数据包的格式如图所示:

python

如果一个客户机不能获取Web服务器或者应用服务器的IP地址,那么我们可以通过数据包分析的方法来分析这个故障,分析的目标就是来自DNS服务器的响应。

通过对比对失败的DNS响应与正常的DNS响应之间的区别可以找出故障的根源。这种失败可能由于DNS服务器配置的故障,或者由于你查询时使用了错误的URL和主机名。

6、检查网络传输路径

好了,如果之前的检查都没有问题的话,那么从现在开始起,发出的数据包将远离我们,踏上去往目标服务器的路上,虽然不到一秒,但是这个数据包可能已经穿越了半个世界。

这里我们会使用Wireshark协议来分析离开网关之后的数据包。在这个分析过程中需要用到traceroute工具,它将显示出一条从我们主机到目标主机的通路。在Windows系统中,启动traceroute工具的命令为tracert。

下图显示了从本机到百度官方网站的路径:

python

这个工具利用了数据包中TTL值的特性,这个值就是数据包的生存时间。虽然称之为生存时间,但是这和我们平时所讲到的时间并不相同,它的值只有在经过一个路由器之后才会减少。当一个路由器收到TTL值为0的数据包就会将其丢弃掉,并向这个数据包的源地址发回一个ICMP报文。

利用这个TTL的这个特性,traceroute程序会先向目标发送一个数据包,但是这个数据包永远不会到达目标。因为它的TTL值被设置为1,所以它仅仅到达了第一个中转站(路由器)就被丢弃,但是这个路由器需要向源地址发送一个ICMP数据包。这样源主机就知道数据所经过的第一个路由器了。

接着向目标发送TTL值为2的数据包,收到应答之后,再发送TTL值为3的数据包。这样一直到数据包到达目标为止,利用traceroute程序,我们就可以知道从源地址到达目标地址之间所经过的路由器。

这里推荐使用一个更好的工具PingPlotter,这个工具要远远比系统自带的工具要强大,你可以从PingPlotter官网下载一个免费的版本。这个工具相对traceroute最大的优势在于可以指定发送数据包的大小。 

python

首先我们启动Wireshark,然后PingPlotter中的对话框中输入要目标地址“www.baidu.com”。 

python

按下右侧的三角形按钮,这时就会开始向目标发送数据包了。等数据包到达www.baidu.com时,就可以在Wireshark中停止数据包的捕获了,在此期间数据包经过的路径如图所示。 

python

在Wireshark找到并选中PingPlotter发出的第一个数据包,然后在数据包详细信息面板中选中IP协议部分。 

python

利用这个工具我们就可以查看在到达目标网站之前,数据包都经过了哪些路由器以及在哪个路由器出现了问题。 

7、检查目标服务器

如果一个用户到达目标服务器的故障是功能性的,也就是说两者的连接没有问题,但是用户却不能正常使用目标服务器上的应用。

可能导致故障的原因如下:

用户提供的URL或者端口是错误的;

这个端口被防火墙所屏蔽;

应用程序不再正常工作。

第一个原因往往是用户错误输入造成的,另外两个因素往往会导致所有人都无法访问。我们还需要确定到底是目标主机整体都无法访问,还是仅仅是一个程序无法访问。如果服务器无法访问,那么显示ICMP信息应该为Destination Host is Unreachable或者Destination Port is Unreachable,如果目标防火墙启用了屏蔽,那么所有的ICMP数据包都得不到回应。

如果服务器正常工作,但是应用程序却是无法访问的,仅仅在客户端进行数据包捕获获取的信息可能并不足以找到故障的原因。但是通过查看TCP会话连接建立的数据包可以找到很多有用的信息。
如果用户可以与目标程序建立TCP连接,但是应用程序却不能正常工作。这时我们需要考虑的因素很多,最简单的方法就是比较用户与其他用户连接目标的数据包有什么不同。

如果排除了上面提到的这些可能性,下面列出的这些因素也可能会导致出现一个功能性的故障。

(1)用户认证:这种故障出现的主要原因是用户缺少适当的认证、授权、权限等。这是我们检查用户是否正常工作的第一个步骤。

(2)用户自己计算机上的配置:很多应用程序需要特定的配置,例如将特定文件放置在特定目录中。还有一些应用程序需要考虑特殊插件例如java、net framework等。通常,应用程序会提供应用程序配置的错误故障。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分