【计算机网络】实验四 网际控制报文协议 ICMP 分析

2 阅读1分钟

实验名称

实验四 网际控制报文协议 ICMP 分析

重点难点

重点:ICMP 数据包格式; 难点:探索ICMP 数据包格式各字段具体的物理意义,熟悉ping 、tracert 命令的工作原理

实验目的

1.了解网际控制报文协议ICMP;

2.学习获取网际控制报文协议ICMP 分组,并正确分析其类型。

3.分析ping 、tracert 命令的工作原理。

实验环境

WireShark、IE等软件;实验文件“DHCP-ICMP 数据.cap”.

实验步骤

1、网际控制报文协议 ICMP

为了提高 IP 数据报交付成功的机会,在网际层使用了网际控制报文协议 ICMP(Internet Control Message Protocol)。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP 不是高层协议,而是 IP 层的协议。ICMP 报文作为 IP 层数据报的数据,加上IP 数据报的首部,组成 IP 数据报发送出去。

ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。

ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型、代码和检验和。类型、代码字节的内容表明了 ICMP 的类型,常见的有:类型8、代码0:回显请求;类型0、代码0:回显应答;类型11、代码0:超时。检验和是包括数据在内的整个ICMP 数据包的校验和,其计算方法和IP 头部校验和的计算方法是一样的。

除此之外后面的字段格式针对不同的类型代码内容会有所不同。对于ICMP 回显请求和应答报文来说,接下来是16bits 标识符(Identifier)字段:用于标识本ICMP 进程,区分不同的PING 进程。对于windows 系统来说,具体参考如下:

Microsoft Windows NT - 256

Microsoft Windows 98/98SE - 512

Microsoft Windows 2000 – 512

最后是16bits 序列号字段:用于判断回显应答数据报。实际上windows 系统根据SequenceNumber field 区分ping 进程。

ICMP 差错报告报文共有 5 种:

  1. 终点不可达 (错误数据报……)
  2. 源点抑制(Source quench)
  3. 时间超过 (TTL=0……)
  4. 参数问题
  5. 改变路由(重定向)(Redirect)跟踪路由tracert:
  6. 源主机向目的主机连续发送IP 数据报
  7. 分别设置TTL=1,2,….
  8. 未到目的主机的情况:因TTL=0,中间路由器返回给源主机”ICMP 时间超过”差错报文
  9. 到达目的主机:或者由目的主机返回给源主机”ICMP 终点不可达”差错报文(因UDP端口号非法);或者由目的主机返回给源主机”ICMP 回显回答”报文(类似于ping)。

​编辑

图1 ICMP报文的格式

2、获取ICMP分组,并正确分析其内容

2.1 依次执行以下命令:

ipconfig /release;(释放本地网卡IP地址) arp –d;删除ARP表中所有的内容ipconfig /flushdns ;删除本机上的DNS域名解析列表启动Ethereal,扑获当前网络接口的数据分组。执行以下命令:

ipconfig /renew;重新配置本地网卡IP地址,执行DHCP协议 ping www.sina.com tracert www.163.com结束扑获,并保存该文件,为“DHCP-ICMP数据.cap”,过程见下图:

​编辑

图 2 实验结果

2.2 ICMP数据的分析

上述的ping www.sina.com、tracert www.163.com分别执行了ICMP协议,观察文件可以发现ping www.sina.com对应的是46-61之间的4对ICMP应答分组;tracert www.163.com对应的是98-246之间的ICMP应答分组。

​编辑

图3 分组46是ping www.sina.com发送的首个ICMP询问报文

ICMP报文的前 4个字节是统一的格式,共有三个字段:即类型、代码和检验和。ICMP类型:8,回送请求;代码:0,ping 检验和:465c,检验整个报文正确与否其它字段内容:标识符、序列号、数据内容等。

​编辑

图4 分组47是对分组46的应答,ping www.sina.com接收的首个ICMP应答报文:类型:0,应答回复;代码:0,ping;检验和:4e5c,检验整个报文正确与否;其它字段内容:标识符、序列号、数据内容等。

下面举例分析tracert www.163.com的过程

​编辑

图5 分组99是tracert www.163.com接收的首个ICMP应答报文

类型:11;代码:0,时间超过错误;检验和:f4ff,检验整个报文正确与否;其它字段内容: IP首部、原始IP数据报(分组98)中前8字节。

如果发现如下图6 的对ping报文的标识/序号字段解码显示(BE与LE),是因为wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windows为LE:little-endian byte order,即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。Linux为BE:big-endian)。

​编辑

图6 Wireshark对ping报文的标识/序号字段的解析显示(BE与LE)

问题一

1. 分析实验文件“DHCP-ICMP数据.cap”的相关数据报,回答以下问题:执行“ping www.sina.com”对应的数据报有哪些?并参照4.2.2 的方法分析每个数据报ICMP协议的内容。

回答

执行“ping www.sina.com”对应的数据报是46-61之间的4对ICMP应答分组。

  1. 分组46

​编辑

上图分组46是ping www.sina.com发送的首个ICMP询问报文。ICMP报文的前 4个字节是统一的格式,共有三个字段:即类型、代码和检验和。

ICMP类型:8,回送请求;

代码:0,ping ;

检验和:465c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组47

​编辑

上图分组47是对分组46的应答,ping www.sina.com接收的首个ICMP应答报文:

类型:0,应答回复;

代码:0,ping;

检验和:4e5c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组53

​编辑

上图分组53是ping www.sina.com发送的第2个ICMP询问报文。

ICMP类型:8,回送请求;

代码:0,ping ;

检验和:455c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组54

​编辑

上图分组54是对分组53的应答,ping www.sina.com接收的第2个ICMP应答报文:

类型:0,应答回复;

代码:0,ping;

检验和:4d5c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组56

​编辑

上图分组56是ping www.sina.com发送的第3个ICMP询问报文。

ICMP类型:8,回送请求;

代码:0,ping ;

检验和:445c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组57

​编辑

上图分组57是对分组56的应答,ping www.sina.com接收的第3个ICMP应答报文:

类型:0,应答回复;

代码:0,ping;

检验和:4c5c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组60

​编辑

上图分组60是ping www.sina.com发送的第4个ICMP询问报文。

ICMP类型:8,回送请求;

代码:0,ping ;

检验和:435c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

  1. 分组61

​编辑

上图分组61是对分组60的应答,ping www.sina.com接收的第4个ICMP应答报文:

类型:0,应答回复;

代码:0,ping;

检验和:4b5c,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

问题二

2. 结合实例“ping www.sina.com”给出ping命令的原理。

回答

当执行 ping www.sina.com 这个命令时,实际上是在发起一个 ICMP Echo 请求到目标主机 www.sina.com。ping 命令的原理和执行过程:

  1. DNS 解析:

首先,操作系统会使用 DNS 解析 www.sina.com,获取它的 IP 地址。这里解析得到的IPv4 地址为58.63.236.38。

  1. 创建 ICMP Echo 请求:

ping 命令会创建一个 ICMP Echo 请求数据包(Ping 数据包)。ICMP Echo 请求的数据包包含以下信息:

Type 和 Code:类型为 8(Echo 请求),代码为 0。

Identifier 和 Sequence Number:用于唯一标识这个 ICMP Echo 请求。它们的值可以由操作系统随机生成或者是按一定规律递增。

Checksum:用于检测数据包在传输过程中是否损坏。

  1. 发送 ICMP Echo 请求:

操作系统通过网络接口将 ICMP Echo 请求数据包发送到 192.168.1.1(假设这是目标主机的 IPv4 地址)。

数据包通过本地网络设备(如以太网网卡)发送到网络中。

  1. 目标主机响应:

目标主机接收到 ICMP Echo 请求数据包后,会根据 ICMP 协议规范进行处理。目标主机收到 ICMP Echo 请求后,会生成一个 ICMP Echo 响应(Ping 响应)数据包。ICMP Echo 响应数据包包含以下信息:

Type 和 Code:类型为 0(Echo 回复),代码为 0。

Identifier 和 Sequence Number:与请求中的相同,用于标识这个 ICMP Echo 响应是响应哪个请求的。

Checksum:检验数据包是否在传输过程中被破坏。

  1. 接收 ICMP Echo 响应:

操作系统接收到 ICMP Echo 响应数据包后,会进行处理。如果接收到了响应,ping 命令将 ICMP Echo 请求和响应的时间信息显示给用户。通常会显示每个数据包的往返时间(RTT),以及有关丢包率的统计信息。

问题三

3. 执行“tracert www.163.com”对应的数据报有哪些?并参照4.2.2 的方法分析每个数据报ICMP协议的内容。(注意观察每个数据报的TTL、ICMP类型代码)

回答

tracert www.163.com对应的是98-246之间的ICMP应答分组。

由于每一跳的探测数据包重复发送3次。如分组98、99、100、101、102、103是发送第一跳的探测数据包。分组99是对98的回复,分组101是对100的回复,分组103是对102的回复。下面仅从每一跳中选择一个分组进行分析。

  1. 第一跳(以分组99为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:f4ff,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 98)中前 8 字节。

  1. 第二跳(以分组110为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:f4ff,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 109)中前 8 字节。

  1. 第三跳(以分组134为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:f5ff,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 133)中前 8 字节。

  1. 第四跳(以分组145为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:7dbf,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 144)中前 8 字节。

  1. 第5跳(以分组154为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 153)中前 8 字节。

  1. 第6跳(以分组165为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 163)中前 8 字节。

  1. 第7跳(以分组177为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 176)中前 8 字节。

  1. 第8跳(以分组188为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 187)中前 8 字节。

  1. 第9跳(以分组199为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:540b,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 197)中前 8 字节。

  1. 第10跳(以分组208为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 207)中前 8 字节。

  1. 第11跳(以分组219为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 218)中前 8 字节。

  1. 第12跳(以分组232为例):

​编辑

ICMP类型:11,超时;

代码:0,传输期间生存时间为0;

检验和:506a,检验整个报文正确与否;

其它字段内容:IP 首部、原始 IP 数据报(分组 230)中前 8 字节。

  1. 第13跳(以分组242为例):

​编辑

类型:0,应答回复;

代码:0,ping;

检验和:d0ff,检验整个报文正确与否;

其它字段内容:标识符、序列号、数据内容等。

问题四

4. 结合实例“tracert www.163.com”给出tracert命令的原理。

回答

tracert命令用于确定从源主机到目标主机路径上的每一跳(即每一个路由器或网关)。通过显示每一跳的信息,tracert可以帮助诊断网络路径问题。以执行tracert www.163.com为例,tracert命令的原理和执行过程:

  1. DNS****解析:

首先,操作系统会使用 DNS 解析 www.163.com,获取它的IP地址。这里解析结果是121.14.35.168。

  1. 初始化和发送探测数据包:

tracert 命令使用ICMP数据包来进行探测。每个探测数据包的TTL(生存时间)值初始化为1,并逐步递增。TTL字段的作用是限制数据包在网络中的存活时间,每经过一个路由器,TTL值减1。当TTL值减为0时,数据包会被丢弃,并返回一个“超时”消息。

  1. 第一跳(TTL=1):

tracert命令发送一个TTL为1的ICMP Echo请求到目标IP 121.14.35.168。第一个路由器(第一跳)收到TTL为1的数据包后,TTL减为0,路由器丢弃数据包并返回一个ICMP“超时”消息(Time Exceeded)。tracert收到这个“超时”消息后,记录该路由器的IP地址和响应时间。

  1. 第二跳(TTL=2):

tracert命令发送一个TTL为2的ICMP Echo请求到目标IP121.14.35.168。第一个路由器将TTL减为1,数据包被转发到下一个路由器(第二跳)。第二个路由器收到TTL为1的数据包后,TTL减为0,路由器丢弃数据包并返回一个ICMP“超时”消息(Time Exceeded)。tracert收到这个“超时”消息后,记录该路由器的IP地址和响应时间。

  1. 继续逐步递增TTL

tracert 命令继续发送TTL值逐步递增的数据包,并记录每一跳的路由器信息,直到数据包到达目标主机 121.14.35.168。当数据包到达目标主机时,目标主机不会返回“超时”消息,而是返回一个ICMP Echo回复。

(6)显示路径信息:

tracert 命令将每一跳的路由器IP地址和响应时间显示给用户。每一跳的响应时间通常包括三次探测的时间,以显示路径的稳定性和延迟情况。