实验名称
实验四 网际控制报文协议 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 种:
- 终点不可达 (错误数据报……)
- 源点抑制(Source quench)
- 时间超过 (TTL=0……)
- 参数问题
- 改变路由(重定向)(Redirect)跟踪路由tracert:
- 源主机向目的主机连续发送IP 数据报
- 分别设置TTL=1,2,….
- 未到目的主机的情况:因TTL=0,中间路由器返回给源主机”ICMP 时间超过”差错报文
- 到达目的主机:或者由目的主机返回给源主机”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应答分组。
- 分组46:
编辑
上图分组46是ping www.sina.com发送的首个ICMP询问报文。ICMP报文的前 4个字节是统一的格式,共有三个字段:即类型、代码和检验和。
ICMP类型:8,回送请求;
代码:0,ping ;
检验和:465c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组47:
编辑
上图分组47是对分组46的应答,ping www.sina.com接收的首个ICMP应答报文:
类型:0,应答回复;
代码:0,ping;
检验和:4e5c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组53:
编辑
上图分组53是ping www.sina.com发送的第2个ICMP询问报文。
ICMP类型:8,回送请求;
代码:0,ping ;
检验和:455c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组54:
编辑
上图分组54是对分组53的应答,ping www.sina.com接收的第2个ICMP应答报文:
类型:0,应答回复;
代码:0,ping;
检验和:4d5c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组56:
编辑
上图分组56是ping www.sina.com发送的第3个ICMP询问报文。
ICMP类型:8,回送请求;
代码:0,ping ;
检验和:445c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组57:
编辑
上图分组57是对分组56的应答,ping www.sina.com接收的第3个ICMP应答报文:
类型:0,应答回复;
代码:0,ping;
检验和:4c5c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组60:
编辑
上图分组60是ping www.sina.com发送的第4个ICMP询问报文。
ICMP类型:8,回送请求;
代码:0,ping ;
检验和:435c,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
- 分组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 命令的原理和执行过程:
- DNS 解析:
首先,操作系统会使用 DNS 解析 www.sina.com,获取它的 IP 地址。这里解析得到的IPv4 地址为58.63.236.38。
- 创建 ICMP Echo 请求:
ping 命令会创建一个 ICMP Echo 请求数据包(Ping 数据包)。ICMP Echo 请求的数据包包含以下信息:
Type 和 Code:类型为 8(Echo 请求),代码为 0。
Identifier 和 Sequence Number:用于唯一标识这个 ICMP Echo 请求。它们的值可以由操作系统随机生成或者是按一定规律递增。
Checksum:用于检测数据包在传输过程中是否损坏。
- 发送 ICMP Echo 请求:
操作系统通过网络接口将 ICMP Echo 请求数据包发送到 192.168.1.1(假设这是目标主机的 IPv4 地址)。
数据包通过本地网络设备(如以太网网卡)发送到网络中。
- 目标主机响应:
目标主机接收到 ICMP Echo 请求数据包后,会根据 ICMP 协议规范进行处理。目标主机收到 ICMP Echo 请求后,会生成一个 ICMP Echo 响应(Ping 响应)数据包。ICMP Echo 响应数据包包含以下信息:
Type 和 Code:类型为 0(Echo 回复),代码为 0。
Identifier 和 Sequence Number:与请求中的相同,用于标识这个 ICMP Echo 响应是响应哪个请求的。
Checksum:检验数据包是否在传输过程中被破坏。
- 接收 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的回复。下面仅从每一跳中选择一个分组进行分析。
- 第一跳(以分组99为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:f4ff,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 98)中前 8 字节。
- 第二跳(以分组110为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:f4ff,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 109)中前 8 字节。
- 第三跳(以分组134为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:f5ff,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 133)中前 8 字节。
- 第四跳(以分组145为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:7dbf,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 144)中前 8 字节。
- 第5跳(以分组154为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 153)中前 8 字节。
- 第6跳(以分组165为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 163)中前 8 字节。
- 第7跳(以分组177为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 176)中前 8 字节。
- 第8跳(以分组188为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 187)中前 8 字节。
- 第9跳(以分组199为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:540b,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 197)中前 8 字节。
- 第10跳(以分组208为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 207)中前 8 字节。
- 第11跳(以分组219为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 218)中前 8 字节。
- 第12跳(以分组232为例):
编辑
ICMP类型:11,超时;
代码:0,传输期间生存时间为0;
检验和:506a,检验整个报文正确与否;
其它字段内容:IP 首部、原始 IP 数据报(分组 230)中前 8 字节。
- 第13跳(以分组242为例):
编辑
类型:0,应答回复;
代码:0,ping;
检验和:d0ff,检验整个报文正确与否;
其它字段内容:标识符、序列号、数据内容等。
问题四
4. 结合实例“tracert www.163.com”给出tracert命令的原理。
回答
tracert命令用于确定从源主机到目标主机路径上的每一跳(即每一个路由器或网关)。通过显示每一跳的信息,tracert可以帮助诊断网络路径问题。以执行tracert www.163.com为例,tracert命令的原理和执行过程:
- DNS****解析:
首先,操作系统会使用 DNS 解析 www.163.com,获取它的IP地址。这里解析结果是121.14.35.168。
- 初始化和发送探测数据包:
tracert 命令使用ICMP数据包来进行探测。每个探测数据包的TTL(生存时间)值初始化为1,并逐步递增。TTL字段的作用是限制数据包在网络中的存活时间,每经过一个路由器,TTL值减1。当TTL值减为0时,数据包会被丢弃,并返回一个“超时”消息。
- 第一跳(TTL=1):
tracert命令发送一个TTL为1的ICMP Echo请求到目标IP 121.14.35.168。第一个路由器(第一跳)收到TTL为1的数据包后,TTL减为0,路由器丢弃数据包并返回一个ICMP“超时”消息(Time Exceeded)。tracert收到这个“超时”消息后,记录该路由器的IP地址和响应时间。
- 第二跳(TTL=2):
tracert命令发送一个TTL为2的ICMP Echo请求到目标IP121.14.35.168。第一个路由器将TTL减为1,数据包被转发到下一个路由器(第二跳)。第二个路由器收到TTL为1的数据包后,TTL减为0,路由器丢弃数据包并返回一个ICMP“超时”消息(Time Exceeded)。tracert收到这个“超时”消息后,记录该路由器的IP地址和响应时间。
- 继续逐步递增TTL:
tracert 命令继续发送TTL值逐步递增的数据包,并记录每一跳的路由器信息,直到数据包到达目标主机 121.14.35.168。当数据包到达目标主机时,目标主机不会返回“超时”消息,而是返回一个ICMP Echo回复。
(6)显示路径信息:
tracert 命令将每一跳的路由器IP地址和响应时间显示给用户。每一跳的响应时间通常包括三次探测的时间,以显示路径的稳定性和延迟情况。