计算机网络实验报告

实验1.1   Wireshark软件使用与ARP协议分析

实验时间∶  2024 4 25

学习Wireshark的基本操作,抓取和分析有线局域网的数据包;掌握以太网 MAC 帧的基本结构,掌握ARP协议的特点及工作过程。

使用Wireshark抓取局域网的数据包并进行分析:

 1. 学习Wireshark基本操作:重点掌握捕获过滤器和显示过滤器。

 2. 观察MAC地址:了解MAC地址的组成,辨识MAC地址类型。

 3. 分析以太网帧结构:观察以太网帧的首部和尾部,了解数据封装成帧的原理。

 4. 分析ARP协议:抓取ARP请求和应答报文,分析其工作过程。

3.1 Wireshark 简介

Wireshark软件是目前全球使用最广泛的开源网络数据包分析工具(前身为 Ethereal),由Gerald Combs编写并于1988年获开源许可发布。网络数据包分析是指进入网络通信系统、捕获和解码网络上实时传输数据以及搜集统计信息的过程。 通过Wireshark对网络数据进行分析,我们能够了解网络是如何运行的、数据包是如何被转发的、应用是如何被访问的;能够分析各层网络协议的性能、掌握通信主体的运行情况,确认带宽分配和时延大小、查看应用的快慢并改进优化,识别网络中存在的攻击或恶意行为、解决网络异常和故障.Wireshark可以在Windows、Linux和macOS操作系统中运行,具备友好的图形界面、丰富的统计及图表分析功能。

3.2以太网MAC帧格式

本实验基于使用最广泛的有线局域网(以太网Ethernet II),以太网的帧结构如表1.1-1所示。其中,MAC地址(Media Access Control Address,媒体存取控制位址)或称物理地址(Physical Address),用于在网络中标识网卡。MAC地址的长度为48位(6 个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C40。其中前3个字节的16进制数00-16-EA代表网络硬件制造商的编号、即组织唯一标志符(OUI),它由IEEE分 配;而后3个字节的16进制数AE-3C-40代表该制造商所生产的某个网络产品(如网卡) 的系列号。

 3.3 ARP协议及数据报格式

表1.1-1以太网帧格式

地址解析协议(Address Resolution Protocol,ARP)主要作用是将IP地址 解析为MAC地址。当某主机或网络设备要发送数据给目标主机时,必须知道对方的网络层地址(即IP地址),而且在数据链路层封装成帧时,还必须有目标主机(或下一跳路由器)的MAC地址。本实验重点观察最简单的情形:同一个网段内,主机A要向主机B发送信息时,ARP解析的过程(主机A和B不在同一网段的情况请 参阅课本相关内容)。具体如下:

1. 主机A首先查看自己的ARP表。如果找到了主机B的MAC地址,则利用这个地址对IP数据报进行帧封装,并将数据报发送给主机B。

2. 如果主机A在ARP表中找不到主机B的MAC地址,则以广播方式发送一个ARP 请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP 地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC 地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接 收到该请求,但只有被请求的主机B会对该请求进行处理。

3. 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A )的IP地址和MAC地 址存入自己的ARP表中。然后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。

4.主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据报进行封装后发送出去。

ARP报文结构如图1.1-1所示,ARP报文总长度为28字节,MAC地址长度为6字节,IP地址长度为4字节。每个字段的含义如下:

•硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为1。

•协议类型:表示要映射的协议地址类型。IP地址的类型值为0x0800。

•硬件地址长度和协议地址长度:分别指出硬件地址和协议地址的长度,以字节为单位。在以太网中,它们的值分别为6和4。

•操作码(op):用来表示这个报文的类型,ARP请求为1,ARP响应为2, RARP 请求为3, RARP响应为4。

图1.1-1  APR报文结构示意图

3.4实验方法及手段

使用Wireshark软件在有线局域网中捕捉相关网络操作的数据包,运用观察 对比、计算验证、分析统计等方法,掌握以太网MAC帧和IP数据报的结构以及ARP 协议的工作原理。

• PC机一台,连入局域网;

• Wireshark 4.2.4。

5.1 Wireshark基本使用

1. 通过Wireshark官网下载最新版软件,按默认选项安装。

2. 运行Wireshark软件,程序界面会显示当前的网络接口列表,双击要观察的网络接口,开始捕捉数据包,Wireshark软件选择网络接口的界面如图1.1-2所示。

图1.1-2  WireShark软件启动界面

3. 点击工具栏上的红色方块按钮停止捕捉。

4. 菜单、工具栏、状态栏和主窗口如下图所示,可以根据需要通过菜单 “视图” 以及“编辑/首选项/外观”的相关选项对基本设置进行更改。 例如下图中的语言、字体缩放、颜色、布局等项目,如图1.1-4所示。

图1.1-3  WireShark软件主窗口界面

图1.1-4  WireShark的设置界面

5. 使用“显示过滤器”可以方便地从捕获的数据包中筛选出要观察的数据包。显示 过滤器支持若干的过滤选项:源MAC、目的MAC、源IP、目的IP、TCP/UDP传输协议、 应用层协议(HTTP, DHCP)、源端口Port、目的端口Port等。在显示过滤器栏中输 人过滤表达式(更详细的显示过滤语法可以查看WireShark的官方文档),例如下面的命令:

•arp //显示arp协议报文。

•ip.src == a.b.c.d && icmp //显示源地址为 a.b.c.d 的 icmp 报文。

图1.1-5  WireShark过滤条件arp

6. 通过主菜单“文件”/“导出特定分组”,可以保存捕获的网络数据 (也可以先选中某些包,只保存部分数据),如图1.1-6所示。

7. 如果只想捕捉特定的数据包,可以使用菜单“捕获”/“捕获过滤器”选定想要的类型。例如,选择“IPv4 only”,Wireshark只抓取ipv4类型的数据包,如图1.1-7所示。

8. Wireshark还提供了丰富的统计功能供用户选用,如图1.1-8所示。

图1.1-6  WireShark软件导出功能

图1.1-7  WireShark捕获过滤器功能

图1.1-8  WireShark统计功能

5.2 观察MAC地址

启动Wireshark捕捉数据包,在命令行窗口分别ping网关和ping同网段的一台主机,分析本机发出的数据包。重点观察以太网帧的Destination和Source的MAC地址,辨识MAC地址类型,解读OUI信息、I/G和G/L位。

首先Ping 网关,使用ipconfig查看当前ip信息:结果如图1.1-9所示:

图1.1-9  连接HFUT校园网(10.8.187.17)

可以在上图中查看到WLAN的默认网关为10.8.128.1。

图1.1-10  Ping默认网关(10.8.128.1)

图1.1-11  WireShark抓包分析

1、Source的MAC地址: (e0:0a:f6:ae:1a:25)(主机的MAC地址)

(1)OUI(组织唯一标识符):OUI是MAC地址中的前三个字节,通常由IEEE分配给各个网络设备制造商或组织。本机的OUI是“e0:0a:f6”。

(2)I/G位(Individual/Group bit):这一位用于标识MAC地址是单播还是多播地址。单播地址是指数据包只发送给一个特定的目标设备,而多播地址则发送给一组设备。I/G位在第一个字节中的最低位,在本机设备中“IG bit”设置为0,表示这是一个单播地址。
(3)G/L位(Global/Local bit):G/L位在第一个字节中的次低位,这一位用于标识MAC地址的全局唯一性。全局唯一地址是由设备制造商分配的,保证在整个网络中唯一。而本地地址通常是由设备本地生成,可能在同一网络中不唯一。在此帧中,“LG bit”被设置为0,表示这是一个全局唯一地址。

2、Destination的MAC地址: (00:de:fb:83:fd:41)(校园网默认网关的MAC)

(1)OUI(组织唯一标识符):本机的OUI是“00:de:fb”。

(2)I/G位(Individual/Group bit): I/G位在第一个字节中的最低位 ,在本机设备中“IG bit”被设置为0,表示这是一个单播地址。
(3)G/L位(Global/Local bit):G/L位在第一个字节中的次低位, “LG bit”被设置为0,表示这是一个全局唯一地址。

其次Ping同网段主机

图1.1-12  连接宿舍路由器后主机IP(192.168.31.242)

图1.1-13  查看手机IP(192.168.31.30)

图1.1-14  Ping在同一网段下的手机

图1.1-15  Ping通并进行抓包

报文:

Ethernet II, Src: LiteonTechno_ae:1a:25 (e0:0a:f6:ae:1a:25), Dst: 26:3b:f8:14:d7:99 (26:3b:f8:14:d7:99)

    Destination: 26:3b:f8:14:d7:99 (26:3b:f8:14:d7:99)

        Address: 26:3b:f8:14:d7:99 (26:3b:f8:14:d7:99)

        .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)

        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)

    Source: LiteonTechno_ae:1a:25 (e0:0a:f6:ae:1a:25)

        Address: LiteonTechno_ae:1a:25 (e0:0a:f6:ae:1a:25)

        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)

        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)

    Type: IPv4 (0x0800)

1、Source的MAC地址: (e0:0a:f6:ae:1a:25) (主机的MAC地址)

仍然是我电脑主机设备信息,硬件分析同上。

2、Destination的MAC地址: (26:3b:f8:14:d7:99)(手机的MAC地址)

(1)OUI(组织唯一标识符):OUI是MAC地址中的前三个字节,通常由IEEE分配给各个网络设备制造商或组织。本机的OUI是“26:3b:f8”。

(2)I/G位(Individual/Group bit): I/G位在第一个字节中的最低位 ,在本机设备中“IG bit”被设置为0,表示这是一个单播地址。
(3)G/L位(Global/Local bit):G/L位在第一个字节中的次低位, “LG bit”被设置为1,表示这是一个本地管理地址。

5.3分析以太网的帧结构

 选择其中一个数据包,点击Ethernet II展开,查看MAC帧的各个字段。
 

图1.1-16  Ethernet II展开

以太网头部:

目标地址(Destination): 26:3b:f8:14:d7:99 (26:3b:f8:14:d7:99),表示数据包应该传送到的目标设备的MAC地址。
源地址(Source):LiteonTechno_ae:1a:25 (e0:0a:f6:ae:1a:25),表示数据包的发送者的MAC地址。
类型(Type):IPv4 (0x0800),表示数据包中的上层协议类型为IPv4。

5.4 ARP协议分析

 1. 使用arp -d命令,清空本机的ARP缓存,开启 Wireshark, ping本机的同网段地址,在显示过滤器条框中输入“arp”, 观察捕获的ARP报文的各个字段,分析请求/响应的过程。

2. 使用arp -d命令,清空本机的ARP缓存。开启Wireshark, ping与本机网段不同的IP地址或域名,观察捕获的ARP报文的各个字段,分析请求/响应的过程。

arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]] [-d InetA ddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]]

-a 显示所有接口/特定接口的当前ARP缓存表

-g 同-a

-d 删除所有/指定的IP地址项

-s 在ARP缓存中添加对应InetAddr地址的EtherAddr地址静态项

图1.1-16  执行arp -d命令

执行arp -d命令清除本机ARP缓存后,本机将不会保留任何之前学习到的IP与MAC地址对应关系,所以需要重新建立IP 地址和 MAC 地址之间的映射关系。

1、Ping本机同网段地址(Ping手机):

图1.1-17  ARP协议的工作流程

分析请求/响应的过程

本机会首先发出一个ARP请求,这个请求是一个广播报文,询问目标IP地址对应的MAC地址是什么。

手机设备收到ARP请求后,如果该IP地址与它自己的IP地址匹配,就会回复一个ARP响应,这个响应包含其MAC地址。这个响应是单播的,直接发送给请求的源地址。这两步如图1.1-17所示。

并且可以看到info中显示如下:

在广播时,主机问:Who has 192.168.31.30?(问手机IP的MAC地址)Tell 192.168.31.242(主机IP问的)

回复时,手机(MAC地址2b:3b:f8:14:d7:99)回复主机 192.168.31.30 at 2b:3b:f8:14:d7:99(我就在2b:3b:f8:14:d7:99)

主机根据回复信息建立IP 地址和 MAC 地址之间的映射关系。

下面的图1.1-18图1.1-19是对上面两个报文的详细展开:

图1.1-18  本机广播询问手机的MAC地址

第一个报文前六个字节为FF FF FF FF FF FF,这是一个广播信号,以广播方式发送一个ARP 请求报文。

图1.1-19  手机回复自己的MAC地址

第二个报文前六个字节为e0:0a:f6:ae:1a:25,目的地址是我的主机的MAC地址。

  1. Ping本机不同网段地址:

分析请求/响应的过程

本机首先检查目标IP地址是否在同一子网。因为百度地址属于不同子网,本机需要将数据包发送到自己这边配置的默认网关。

本机将发出ARP请求,询问默认网关的MAC地址。

一旦网关的MAC地址被确定(通过ARP响应获得),本机将IP数据包封装到以太网帧中,并设置目标MAC地址为网关的MAC地址。数据包被发送到网关,网关再负责将数据包路由到目标网络。

图1.1-20  Ping百度官网(不同子网)

图1.1-21  本机广播询问默认网关的MAC地址(HFUT校园网)

图1.1-22  默认网关回复自己的MAC地址(HFUT校园网)

‍‍思考题∶

1、MAC帧的长度和IP数据报的长度有怎样的关系?请用你的数据记录进行验证。

答:MAC帧 = 6字节目标mac地址 + 6字节源mac地址 + 2字节类型(ipv4或ipv6) + ip数据报(46~1500字节)+ 4字节帧检验序列FCS。

数据记录验证:

图1.1-23  捕获的以太网帧

目标MAC地址:00:de:fb:83:fd:41 (6字节)

源MAC地址:e0:0a:f6:ae:1a:25 (6字节)

类型字段:IPv4 (0x0800) (2字节)

IP数据报:(60字节)

帧检验序列FCS: (4字节) 在上图未显示

2、假设本机IP地址是192.168.0.38,在本机上运行Wireshark捕获报文,使用 “ip.addr == 192.168.0.38”作为过滤条件,能否过滤出本机发出/收到的ARP报文?为什么?

答:不能过滤。虽然ARP 实现了IP到MAC的转换,但是过滤条件 ip.addr是用于过滤基于IP协议的数据包,并不能过滤出ARP报文,ARP 报文在OSI模型的数据链路层上进行操作,要过滤出ARP报文,需要使用过滤条件“arp”。

3、ping同一局域网内的主机和局域网外的主机,都会产生ARP报文么?所产生的 ARP报文有何不同,为什么?

答:我的见解是ping局域网内和局域网外主机都可能会产生ARP报文。在局域网内ping操作,如果目标主机的IP地址已知,ARP报文将不会被发送,因为本地主机已经知道目标主机的MAC地址,而ARP协议的作用就是将IP地址解析为MAC地址,而在局域网内,本地主机通常已经知道其他主机的MAC地址,因此不需要发送ARP请求。但是,如果目标主机的IP地址在本地主机的ARP缓存中不存在(比如首次通信、ARP缓存过期或是arp -d清除缓存),那么本地主机会发送ARP请求,请求目标主机的MAC地址,以便将IP数据包发送到目标主机。就像之前图1.1-17所展示的一样,在清除缓存后,ping手机时会发送ARP报文询问手机的MAC地址。
    ping局域网外主机,本地主机通常会发送ARP请求,但这与局域网内的ARP请求有所不同。在这种情况下,本地主机发送ARP请求是为了找到自己这边默认网关的MAC地址,如图1.1-21所示,而不是直接发送给目标主机的MAC地址。这是因为要将数据包发送到局域网外,本地主机需要知道默认网关的MAC地址,默认网关再负责将数据包路由到目标网络,以便将数据包发送到正确的目的地。

我在做实验时发现即使还没有ping本机不同网段地址,询问默认网关MAC地址的ARP报文也会立即发送出去,说明主机一旦发现映射表里没有默认网关的MAC地址(ARP缓存被清除),会立马主动去发送ARP报文询问默认网关地址的。

实验总结和体会

在本次实验中,我首先学习并掌握了WireShark工具的基本操作,包括抓包、设置过滤条件、导出、统计等功能。

随后在此基础上分别Ping默认网关和同网段设备,抓取数据包观察以太网帧的Destination和Source的MAC地址,学习如何辨识MAC地址类型,如何解读OUI信息、I/G和G/L位,给出针对硬件设备的分析。

最后还探讨了ARP协议的基本工作流程,分析其请求和响应的过程,我抓取了 ARP 请求和应答报文,看到了主机是如何一步步记录IP 地址和 MAC 地址之间的映射关系,Ping同网段地址时,会进行广播询问,然后对应设备进行回答,从而建立映射,Ping不在同一个网段的地址时,会先找自己默认网关的MAC地址,目的是交由网关来把数据包路由到目标网络,我觉得这样的设计十分符合常理,局域网内的设备通常只知道如何在本地网络内部发送数据包,并不直接了解如何将数据包送达外部网络。,交给网关后,对另一个自治系统的网络传输就是采取一些可达性协议比如BGP,实现一种尽力而为的传输。另外如果SDN大规模应用,则可以在此基础上更智能地选择最佳路径或在网络拥塞时重新配置路径。

实验1.2    IP ICMP 分析

实验时间∶  2024 4 25

一、实验目的∶

IP和ICMP协议是TCP/IP协议簇中的网络层协议,在网络寻址定位、数据分组转发和路由选择等任务中发挥了重要作用。本实验要求熟练使用 Wireshark 软件,观察IP数据报的基本结构,分析数据报的分片;掌握基于ICMP协议的ping和traceroute命令及其工作原理。

二、实验内容∶

启动 Wireshark,捕捉网络命令执行过程中本机接受和发送的数据报。

  1. 执行ping命令,观察IP数据报和ICMP询问报文的结构:通过Wireshark监视器观察捕获流量中的ICMP询问报文和IP数据报的结构。注意比较ICMP请求帧与回应帧,及其IP头部数据字段的异同。
  2. 改变ping命令的参数,观察IP数据报分片:更改ping命令参数MTU,使其发出长报文以触发IP数据报分片,再观察IP数据报的结构变化。
  3. 执行Traceroute命令,观察ICMP差错报文的结构,并分析其工作原理:使用Linux操作系统提供的traceroute命令(或者Windows系统提供的tracert命令),捕获和分析该命令所产生的IP数据报,特别注意相关的ICMP差错报文。结合捕获的具体数据,画出命令执行过程中数据交互的示意图,掌握traceroute 的工作原理。

三、实验原理∶

3.1 IP 协议及数据报格式

网际互连协议(Internet Protocol,IP)是TCP/IP体系中的网络层协议,可实现大规模的异构网络互联互通,为主机提供无连接的、尽力而为的数据包传输服务。在网际协议第4版(IPv4)中,IP 数据报是一个可变长分组,包括首部和数据两部分(如图 1.2-1)。首部由20〜60字节组成,包含与路由选择和传输有关的重要信息,其各字段意义如下:、

1. 版本(4 位):该字段定义 IP 协议版本,所有字段都要按照此版本的协议来解释。

图1.2-1  IP 数据报结构示意图

2. 首部长度(4位):该字段定义数据报协议头长度,表示协议首部具有32位字长的数量,最小值为5,最大值为15。

3. 服务(8 位):该字段定义上层协议对处理当前数据报所期望的服务质量,并对数据报按照重要性级别进行分配。前3位为优先位,后面4位为服务类型,最后1位没有定义。这8位可用于分配优先级、延迟、吞吐量以及可靠性。

4.总长度(16位):该字段定义整个IP数据报的字节长度,包括协议首部和数据,其最大值为 65535 字节。

5.标识(16位):该字段包含一个整数,用于标识当前数据报。当数据报分片时,标识字段的值被复制到所有的分片中。

6.标记(3位):该字段由3位字段构成,其中最低位(MF)控制分片:若存在下一个分片则值为1;否则置0代表该分片是最后一个。中间位(DF) 指出数据报是否可进行分片,若置1则不允许该数据报进行分片。第三位即最高位保留不使用,值为0。

7.分片偏移(13位):该字段指出数据分片在源数据报中的相对位置,以8字节为长度单位。

8.生存时间(8位):该字段是计数器,转发该数据报的路由器依次减1直至减少为 0。

9.协议(8 位):该字段指出在IP层处理后,由哪种上层协议接收该数据报。

10.头部校验和(16位):该字段帮助确保IP协议头的正确性。计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分,并将各部分相加,其计算结果取反码,填入校验和字段中。

11.源地址(32位):源主机的IP地址。

12. 目的地址(32 位):目标主机的 IP 地址。

一个IP包从源主机传输到目标主机可能需要经过多个传输媒介不同的网络。每种网络对数据帧都设置了一个最大传输单元(MTU)的限制(例如以太网的MTU 是1500 字节)。因此,当路由器在转发IP包时,如果数据包的大小超过了出口链路网络的MTU时,需将对IP数据报进行分片,才能在目标链路上顺利传输。每个IP分片将独立传输,直到所有分片都到达目的地后,目标主机才会把他们重组成一个完整的IP数据报。在IP 数据报的分片与重组过程中,以下三个首部字段发挥了重要作用:

  1. 标记的后两位:最低位记为 MF (More Fragment), MF=1代表还有后续分片,MF=0表示此为原始数据报的最后分片。次低位DF(Don’t Fragment),用来控制数据报是否允许分片。DF=1表示该数据报不允许分片;DF=0 允许分片。
  2. 标识符:用于目的主机将 IP 数据报的各个分片重装成原来的数据报。
  3. 片偏移:以 8 字节为单位,目的主机在重装 IP 数据报时需要根据该字 段提供偏移量进行排序。这是因为数据分片的独立传输使各分片的到达 顺序难以确定。

3.2 ICMP 协议及报文格式

因特网控制报文协议(Internet Control Message Protocol, ICMP )用于IP主机、 路由器之间传递控制消息。控制消息是指网络是否连通、主机是否可达、路由是否可用等网络本身的控制管理消息,对网络正常运行起着重要的作用。 ICMP报文的类型可以分为ICMP差错报文和ICMP询问报文两种(其结构如图1.2-2)。ICMP 差错报告报文主要有终点不可达、源站抑制、超时、参数问题和路由重定向5种。ICMP 询问报文有回送请求和应答、时间戳请求和应答、 地址掩码请求和应答以及路由器询问和通4种。其常见的类型与代码如表1.2-1所示。

图1.2-2  ICMP 报文结构示意图

表1.2-1  ICMP 各类型报文的格式

  1. ping命令,是测试网络最有效的工具之一。它是由主机或路由器执行ping命令向一个特定的目的主机发送一份ICMP回显请求(Echo request)报文,并等待其返回 ICMP 回显应答(Echo Reply)。ping 命令可以检测网 络的连通性,简单估测数据报的往返时间(Round Trip Time),确定是否 有数据包丢失或损坏,从而帮助分析网络故障。ping 命令格式和常用参数罗列如下:
  1. traceroute/tracert命令,利用TTL字段和ICMP差错类型报文,查找IP数据报的路由转发路径(含路由器信息)。源主机执行该命令向目的主机,发送生存时间 (TTL)不同的 ICMP 回送请求报文,直至收到目的主机应 答,并通过分析应答报文获得转发路径和时延信息。

首先源主机发起一个TTL=1的ICMP报文。第一个路由器收到该报文后, TTL 减 1 变为 0 并丢弃此报文,返回一个[ICMP time exceeded]的消息。 源主机通过这个消息获知 IP 数据报转发路径上的第一个路由器信息。然 后,依次增加发送 ICMP 报文的 TTL 值,可以获取路径上的后续路由器 的信息。当到达目的地时,目标主机返回一个[ICMP port unreachable]的 消息,使发起者确认 IP 数据报已经正常到达。至此,traceroute 命令发起 者已经获得了通向目标主机路径上的所有路由信息。tracert 命令(Linux) 格式和常用参数罗列如下:

3.3 实验方法和手段

  1. 使用 Wireshark 软件,捕获本机在 ping 和 traceroute 网络命令执行过 程中接收和发出的全部数据流量。
  2. 合理设置过滤条件,观察 IP 数据报和 ICMP 报文,着重分析报文首部 和内容变化,从而掌握协议的工作原理。
  3. 调整 ping 命令的参数,观察并分析 IP 数据报分片情况。
  4. 结合所捕获的数据报,画出 traceroute 命令过程中数据交互示意图。

四、实验条件

装有 Wireshark 软件的 PC 机一台,处于局域网环境。

参考资料:

• J.F Kurose and K.W. Ross, Wireshark Lab: ICMP v8.0

• Wireshark 官方过滤器语法指导书

• IP 协议的 RFC

五、实验步骤

5.1 ping 命令

本机(IP为10.8.187.17 )启动 Wireshark 软件,选择要监听的网络接口;然后在终端发起网络命令:ping IP 地址/域名

执行命令:ping mail.sina.com.cn

1、在 Wireshark 监视器中设置过滤条件。捕获ICMP数据包,如图1.2-3

图1.2-3  WireShark监视器画面

2、点击Internet Protocol Version 4 展开,查看 IP 数据报,特别观察IP数据报的首部字段及其内容,其呈现的IP数据报结构正如图1.2-1所示

图1.2-4  查看IP数据报

3、点击 Internet Control Message Protocol 展开,查看ICMP报文,并解释回显(Echo Request和Echo Reply )报文的首部字段。

图1.2-4  Echo Request示例

图1.2-4所示在这个ICMP回显请求报文中,可以看到这些首部字段:
Type字段的值为8,代表这是一个回显请求。这是因为我们ping了新浪邮箱,向目标发送一个消息,期望得到一个回显回复。

Code字段的值为0,对于回显请求和回显回复,此字段总是设置为0。

Checksum是一个错误检查的字段,用来确保报文在传输过程中的完整性没有被破坏。图1.2-4中校验和的值是0x4da5,且状态示为[correct],说明校验和正确。

Identifier(BE)字段是一个标识符,用于帮助发送方识别应答。这里的值是0xae01。

Identifier(LE)字段是以小端序显示的标识符。
Sequence Number(BE)字段是序列号(大端序),这里为0x0001。序列号用于标识每个回显请求的唯一性,以便在收到回显应答时可以正确匹配到对应的请求。
Sequence Number(LE)字段是序列号的小端序表示。
Response frame表示对应的响应帧编号,这里是10721,用于追踪响应数据包。

图1.2-4  Echo Reply示例

Type字段的值为0,表示这是一个回显回复。在ping操作中,发送方首先发送回显请求,收到目标回应的就是这种类型的报文。

其余部分基本相同,比起Echo RequestEcho Reply多出一个Response time字段,是从发送请求到收到回复的时间,这里显示为23.680ms。这个时间用于评估网络延迟。

4、清空 Wireshark 监控器,重新发起网络命令:ping IP 地址/ 域名-1 #length,并解释对比前后两次执行ping 命令的结果。其中,-1 #length 确定echo数据报的长度为#length,其默认值为32字节,且小于65,527字节。

由于ping mail.sina.com.cn如果设置#length超过2000会请求超时(推测可能是这个网站防止DDoS攻击的一种方式,所以我们改Ping校园网默认网关)如图1.2-5所示。这前后两次Ping的区别主要在于:

第一次Ping是默认发送几个小尺寸(通常是64字节)的ICMP回显请求数据包到指定的目标地址。
第二次Ping使用-l选项,指定了每个ICMP数据包的数据部分大小。

5、可以多次改变#length的大小(例如1000字节、2000字节和4000字节),观察IP数据报何时会分片?请解释IP数据报分片的原因和具体情况。提示:请先确认该网络的 MTU,可在 Wireshark 记录中查找“IPv4fragments”项目。

图1.2-5  设置Ping发送缓冲区大小(1000、2000、4000)

图1.2-6  IP分段信息

通过上述IP分段信息可知,由于第一片段长度为1480字节,我们可以初步推断,这可能是在不超过网络MTU的情况下的最大分片大小。通常IPv4的头部长度为20字节,因此网络路径的MTU应该是1480+20=1500字节。另外这1480字节的分片大小减ICMP头部8字节后,数据部分最多可以传输1472字节

图1.2-7  length设置1000未分片

图1.2-8  length设置2000分片2个

图1.2-9  length设置4000分片3个

5.2 traceroute 命令

本机(示例IP为10.8.187.17)启动Wireshark软件,选择要监听的网络 接口;然后在终端发起网络命令:traceroute IP 地址/域名。

  1. 启动Wireshark软件,选择要监听的网络接口,设置过滤条件 icmp。

2、 在终端中使用traceroute命令,目的主机是外网的一台设备(如图1.2-10,示例IP为223.5.5.5)。

图1.2-10  在终端中执行 traceroute 命令

  1. 点击Internet Control Message Protocol展开,查看ICMP差错报文,观察并解释ICMP报文结构和字段内容。

图1.2-11  ICMP差错报文[ICMP port unreachable]

在traceroute命令中涉及三种ICMP报文,分别是TTL逐渐+1的ICMP报文[ICMP time exceeded]报文、[ICMP port unreachable]报文。

[ICMP port unreachable]为例ICMP差错报文结构Type值为3,代表Destination Unreachable。这是ICMP协议中用来通知发送方,由于某种原因,数据包无法正常到达目标。Code值为3,代表具体的不可达原因是“端口不可达”(Port Unreachable)。这通常意味着在目的地地址上没有找到任何应用或服务在监听指定的端口,因此数据包无法被目的端处理。Unused字段在某些ICMP消息类型中未被使用,其值通常为0。在“目的地不可达”消息中,这部分通常用于填充,确保ICMP消息的整体格式正确。Internet Protocol Version 4显示了原始IP数据包的部分头信息,包括源地址(Src:10.8.187.17)和目的地址(Dst:203.208.41.100)。这个信息帮助发送方识别哪个具体的数据包触发了ICMP差错消息。User Datagram Protocol(UDP)显示了原始数据包中UDP协议的相关信息,包括源端口(Src Port:50369)和目的端口(Dst Port:443)。

Tracert发送一个 UDP 信息给目的主机,并且选择一个很大的值作为 UDP 的端口,使主机的任何一个应用程序都不使用这个端口。所以,当达到目的主机的时候,UDP 模块就产生 一个“端口不可到达”的错误。

  1. 结合ICMP报文记录画出数据交互示意图,并描述tracert工作原理

图1.2-12   ICMP Echo Request报文TTL在增加

图1.2-12  数据交互示意图

tracert命令通过发送一系列ICMP回显请求数据包来确定数据包到达目标的路径。每个数据包的生存时间逐渐增加从1开始。每当数据包通过一个路由器,其TTL值减少1。当TTL值减至0时,路由器将丢弃该数据包,并发送一个[ICMP time exceeded]消息回到原始发送者。最后达到目的主机的时候,UDP 模块产生 一个[ICMP port unreachable]的错误。通过记录发送数据包的时间和接收到ICMP消息的时间,tracert能够计算出到达每一跳的RTT。

图1.2-12时序图plantUML代码:

@startuml
actor "源主机" as Source
entity "路由器1" as Router1
entity "路由器2" as Router2
actor "目标主机" as Destination
Source -> Router1 : ICMP Echo Request (TTL=1)
Router1 -> Source : ICMP Time Exceeded
Source -> Router2 : ICMP Echo Request (TTL=2)
Router2 -> Source : ICMP Time Exceeded
Source -> Destination : ICMP Echo Request (TTL=3)
Destination -> Source : ICMP Echo Reply
@enduml

六、思考题∶

1、发送方要怎样决定 IP 数据报分组大小,才能避免因为不同网络 MTU 不 一致而引起分片呢?

答:1、可以通过使用路径MTU发现协议确定数据包从源主机到目标主机经过的路径上的最小MTU值。这个协议是发送将DF位设置为1的IP数据包来工作。如果任何中间路由器发现数据包太大而无法传输,则它会丢弃该数据包并发送一个ICMP目的地不可达消息,指示消息太大。源主机接收到这个ICMP消息后,会减小数据包大小,再次尝试,直到找到可接受的最大大小。2、或者可以尽量使用较小的默认的MTU。

2、从 PC1 给 PC2 (其地址为#IP)发送三个 ping 命令,请比较命令的结果, 并用 Wireshark 软件进行观察分析。

(a) ping #IP-1 1472 -f -n 1

(b) ping #IP-1 1473 -f -n 1

(c) ping #IP-1 1473 -n 1

答:由图1.2-13可以看到(b)没有发送成功,所以WireShark只捕捉到了(a)(c)的ICMP问答Echo报文,而且(a)没有分片,(c)分片了,我的见解是(a)的1472字节的数据包大小加上20字节的IP头和8字节的ICMP头共1500字节是在路径上的MTU范围内的,(c)数据包的大小超出MTU但没有设置DF标志,数据包会被分片以适应网络路径的MTU,从而成功传输。至于(b),因为不允许分片,数据包大小又超过了MTU,所以发送失败了。

图1.2-13  发送三个Ping命令

图1.2-14  ping #IP -1 1472 -f -n 1未分片

图1.2-15  ping #IP -1 1473 -n 1分片

实验总结和体会

在本次网络实验中,我使用了Wireshark软件对ping命令和traceroute 命令的网络交互进行了监控和分析。实验过程中我查看了IP数据报和ICMP询问报文的结构,并观察到了不同参数下ping命令的网络行为差异。

首先我启动Wireshark软件并选择了正确的网络接口进行监听后。在终端中执行ping mail.sina.com.cn命令。在Wireshark监视器中设置了过滤条件,只捕获ICMP数据包,从而观察到了ICMP回显请求和回显回复的报文结构。

在IP数据报的部分,我注意到IP首部字段如总长度和标识等信息,这些都是控制数据包传输特性的重要信息。而在ICMP部分,报文类型字段明确显示了其功能,如类型8代表回显请求,同时校验和字段确保了数据在传输过程中的完整性和正确性。

这次实验让我体验到了理论与实际应用的结合。特别是在修改ping命令参数以触发IP数据报的分片过程中,我能直观地看到数据包如何因为超过MTU限制而被分成多个片段。这不仅加深了我的网络协议栈理解,还让我了解到网络设备如何处理超大数据包。不过当我设置-l参数Ping新浪邮箱客户端的时候,客户端不回复我。我的见解是这是新浪防止分布式网络请求攻击的方式,他会限制或不响应大尺寸的ICMP请求。

除此之外,通过观察traceroute命令产生的ICMP差错报文,我进一步理解了网络中数据传输的复杂性及网络路由器如何处理数据包的生存时间TTL。每个跳数的增加都清晰地展示了数据包是如何从源头通过多个节点,最终到达目的地或被丢弃的。

这次实验不仅提升了我的实操能力,也增强了我对网络工作机制的理解。

实验2   套接字基础与UDP通信

实验时间∶  2024 4 29

  • 实验目的∶

熟悉UDP套接字编程(Python、C++、Java等)的基础知识,掌握使用UDP套接字发送和接收数据包,以及设置正确的套接字超时,了解Ping应用程序的基本概念,并理解其在简单判断网络状态,例如 计算数据包丢失率等统计数据方面的意义。

  • 实验内容∶

1. 本实验要求学生编程实现一个简单的、非标准的、基于UDP进行通信的ping程序。学生需要编写一个ping客户端。客户端程序发送一个ping报文,然后接收一个从已经提供的服务器上返回的对应ping报文,并计算出从该客户发送ping报文到接收到ping报文为止的往返时延(Round-Trip Time, RTT)

2. 在客户端程序一次执行过程中,学生编写的的ping客户端程序需经UDP向服务器发送10ping报文。对于每个报文,当对应的ping报文返回时,客户端程序要确认并打印输出RTT 值:在整个执行过程中,客户端程序需要考虑分组丢失情况,客户端最多等待1秒,超过该时长则打印丢失报文。

  • 实验原理∶

UDP作为一种传输层协议,只提供了无连接通信,且不对传送的数据包进行可靠性保证,因此只适合于一次传输少量数据的应用场景,如果在传输过程中需要保证可靠性,则这种可靠性应该由应用层负责。本实验创建的ping程序正是一种不需要保证可靠性的程序,并需要利用这种不可靠性来测量网络的联通情况。

虽然UDP不保证通信的可靠性,包到达的顺序,也不提供流量控制。但正是因为UDP的控制选项较少,所以在数据传输过程中延迟小、数据传输效率高,一些对可靠性要求不高,但对性能等开销更敏感的应用层协议会选择基于UDP进行实现,常见的使用UDP的应用层协议包括TFTP、SNM P、NFS、DNS、B00TP 等,通常占用 53 (DNS)、69 (TFTP)、161 (SNMP)等端口。基于UDP的无连接客户/服务器在Python实现中的工作流程如下:

1. 首先在服务器端通过调用socketO创建套接字来启动一个服务器;

2. 服务器调用bind()指定服务器的套接字地址,然后调用recvfromO等待接收数据。

3. 在客户端调用socketO创建套接字,然后调用sendtoO向服务器发送数据。

4. 服务器接收到客户端发来的数据后,调用sendtoO向客户发送应答数据,

5. 客户调用recvfromO接收服务器发来的应答数据。

6. —旦数据传输结束,服务器和客户通过调用closeO来关闭套接字。

注意在不同的计算机语言实现中,上述调用的名字和具体工作流程可能略有不同。基于Python 的UDP程序工作详细流程如图1所示。

图2-1  无连接客户/服务器流程图

基于Python进行UDP消息的接收操作时,Python程序将工作在阻塞状态,即未收到数据包时,Python程序将挂起等待而不会继续执行。如果程序运行中网络连接出现了问题,导致数据包无法及时到达,这种阻塞式的工作模式将会严重的干扰程序的执行。为了解决这个问题,Python的套接字通信库提供了一种“超时”机制来防止程序卡死。在Python套接字程序中,套接字对象提供了一个 settimeout()方法来限制recvfrom()函数的等待时间,当recvfrom()函数阻塞等待超过这个时间(一般称为“超时时间”)后仍然没有收到数据时,程序将会抛出一个异常来说明发生了等待数据接收超时事件。在编写Python网络通信程序时,可以利用这个机制来判断是否接收数据超时。

  • 实验环境∶

• PC机一台,连入局域网;

• 服务器程序。

• Python语言参考手册。

  • 实验步骤∶

本实验附件一节中展示了一段Python代码,实现了一个UDP服务器,该服务器还会模拟丢失30%的客户端数据包。请参考该代码,基于Python按照实验任务要求完成ping程序的客户端。注意:在运行客户端程序前,需要先运行服务器端代码。

编写成功后,使用客户端ping程序经UDP向目标服务器发送10个ping报文。要求:

1. 使用UDP发送ping消息(注意:因为UDP是无连接协议,不需要建立连接。);

2. 如果服务器在1秒内响应,则打印该响应消息;计算并打印每个数据包的往返时间RTT (以秒为单位);

3. 否则,打印“请求超时”(中英文皆可)。

在开发过程中,可以将客户端程序和服务器程序放在同一台电脑上进行测试。在完成代码调试后,可以尝试将客户端和服务器代码运行在不同网络环境,记录并分析结果。

服务器 server.py

from socket import *
import random

# 创建一个 UDP 套接字
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind((
'', 12000))

while True:
    rand = random.randint(
0, 10)
    message, address = serverSocket.recvfrom(
1024)
    message = message.upper()
   
# 模拟 30% 的消息丢失
   
if rand < 4:
       
continue
   
serverSocket.sendto(message, address)

客户端 client.py

import time
from socket import *
# 服务器的IP和端口号配置
serverIP = 'localhost'
serverPort = 12000
# 设置发送10个Ping报文
ping_count = 10
# 创建UDP套接字
clientSocket = socket(AF_INET, SOCK_DGRAM)
# 设置服务器的地址和端口
serverAddress = (serverIP, serverPort)
# 发送ping消息
for i in range(ping_count):
   
try:
        start_time = time.time()
        message =
f'Ping {i+1}'
       
# 发送消息
       
clientSocket.sendto(message.encode(), serverAddress)
       
# 设置接收超时
       
clientSocket.settimeout(1)
       
# 接收服务器的响应
       
modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
       
# 记录接收时间
       
end_time = time.time()
       
# 计算往返时间(RTT)
       
rtt = end_time - start_time
       
# 打印服务器响应及RTT
       
print(f'回复来自 {serverAddress[0]}: {modifiedMessage.decode()} RTT: {rtt:.6f} seconds')
   
except timeout:
       
# 如果接收超时,则打印超时信息
       
print('请求超时')
# 关闭套接字
clientSocket.close()

运行结果如下图2-2所示:

图2-2  实验结果

  • 进阶任务

尝试修改代码,在程序运行结束时,计算所有ping消息的最小、最大和平均RTT,并计算丢包率(丢失数据包在总数据包中所占有的百分比)。即构造出一个符合标准Windows版Ping程序工作模式的基于UDP版Ping程序。

客户端 client_plus.py

import time
from socket import *
# 服务器的IP和端口号配置
serverIP = 'localhost’#Ping同网段主机时设置为‘192.168.31.132’
serverPort = 12000
# 设置要发送的ping消息的数量
ping_count = 10
# 创建UDP套接字
clientSocket = socket(AF_INET, SOCK_DGRAM)
# 设置服务器的地址和端口
serverAddress = (serverIP, serverPort)
# 初始化RTT列表和丢包计数器
rtts = []
lost_packets =
0
# 发送ping消息
for i in range(ping_count):
   
try:
       
# 记录发送时间
       
start_time = time.time()
        message = f'Ping {i+1} {start_time}'
       
# 发送消息
       
clientSocket.sendto(message.encode(), serverAddress)
       
# 设置接收超时
       
clientSocket.settimeout(1)
       
# 接收服务器的响应
       
modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
       
# 记录接收时间
       
end_time = time.time()
       
# 计算往返时间(RTT)
       
rtt = end_time - start_time
        rtts.append(rtt)
       
# 打印服务器响应及RTT
       
print(f'回复来自 {serverAddress[0]}: {modifiedMessage.decode()} RTT: {rtt:.6f} seconds')
   
except timeout:
       
# 如果接收超时,则打印超时信息,并增加丢包计数
       
print('请求超时')
        lost_packets +=
1
# 计算RTT的最小值、最大值和平均值
if rtts:
    min_rtt =
min(rtts)
    max_rtt =
max(rtts)
    avg_rtt =
sum(rtts) / len(rtts)
   
print(f"最小 RTT: {min_rtt:.6f} seconds")
   
print(f"最大 RTT: {max_rtt:.6f} seconds")
   
print(f"平均 RTT: {avg_rtt:.6f} seconds")
# 计算丢包率
loss_percentage = (lost_packets / ping_count) * 100
print(f"丢包率: {loss_percentage:.2f}%")
# 关闭套接字
clientSocket.close()

增加数组rtts记录RTT值计算ping消息的最小、最大和平均 RTT 以及丢包率,Ping本机得出实验结果如图2-3所示:

图2-3  localhost回环主机测试结果

关闭另一台同网段主机的防火墙,并运行服务器程序,在本主机上运行客户端_plus程序,实验结果如图2-4所示。

图2-4  同网段主机测试结果(本机IP为192.168.31.242)

通过对比可知服务器运行在本机和同网段主机上时,客户端Ping同网段主机时RTT相对来说更大一点,推测这是因为网络距离更远一点造成的传播时延,属于是预期内的实验结果。

实验总结和体会

本次实验中,我编写Python程序实现了一个简单的基于UDP协议的ping客户端。通过这个实验,我不仅加深了对UDP套接字编程的理解,还掌握了如何通过UDP套接字发送和接收数据包。此外,通过实际编写并测试代码,我对套接字超时设置、网络状态监测、数据包丢失率的计算等方面有了更直接的体验和理解。

在实验的进阶部分,我修改客户端程序,进一步增加了功能来计算所有ping消息的最小、最大和平均RTT,以及计算丢包率。这些指标非常重要,它们帮助我们评估当前网络环境的稳定性和性能。

通过这次实验观察不同网络条件下的ping程序运行结果,我对网络延迟、丢包等现象有了更直观的感受。这不仅仅是数字的游戏,它直接关系到网络应用的用户体验。

实际上设置超时机制也是非常重要的,尤其是在不稳定的网络环境下。我一开始忘记了设置请求超时的异常出现了点小问题,这次实验让我认识到了超时机制在实际应用中的重要性,它能有效防止程序在等待响应时无限制地阻塞。

另外对于编写的代码还有很多优化空间,我的见解是服务器端随机数的生成在每个循环中都执行,尽管它的成本不高,但如果消息量很大时,可以考虑优化。比如可以预先生成一系列随机数或使用其他方法来决定是否发送回复,还有当服务器需要关闭时,确保套接字被正确关闭。可以通过捕获特定的信号或在异常处理中添加关闭套接字的代码。客户端的话填写IP和端口这些尽量不要使用硬编码,不过这次只是个简单的UDP测试实验,这些问题都可以选择性的忽略。

总之这次实验不仅增强了我的编程能力,也让我对网络编程和网络通信的底层机制有了更深入的了解。我期待在未来的学习和研究中,能够继续探索更多网络技术,并将这些知识应用到实际的项目和研究中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值