Wireshark实验——ICMP
ICMP
因特网控制报文协议
ICMP,即因特网控制报文协议,在主机和路由器之间起到沟通网络层信息的作用。最典型的用途就是差错报告,例如网络通不通、主机是否可达、路由是否可用等网络本身的消息,这些控制消息虽对于数据的传递起着重要的作用。ICMP 报文作为 IP 有效载荷承载的,因此虽然 ICMP 被认为是 IP 的一部分,但在体系结构上 ICMP 位于 IP 之上。当主机接收到指明上层协议为 ICMP 的 IP 数据报时,该数据报分解的内容应当交给 ICMP。
ICMP 报文格式
ICMP 报文包括 IP 头部、ICMP 头部和 ICMP 报文,这是可以理解的,因为 ICMP 报文作为 IP 有效载荷承载的。
Type:ICMP 的类型,标识生成的错误报文;
Code:进一步划分 ICMP 的类型,该字段用来查找产生错误的原因;
Checksum:校验码,字段包含有从 ICMP 报头和数据部分计算得来的,用于检查错误的数据;
ID:ID 值,在 Echo Reply 类型的消息中要返回这个字段;
Sequence:这个字段包含一个序号,在 Echo Reply 类型的消息中要返回这个字段。
ICMP 报文类型
ICMP 有 2 类报文:
- 差错报告报文(5 种)
- 目的不可达
- 源抑制
- 超时或超期
- 参数有问题
- 重定向
- 网络探询报文(2 组)
- 回声请求与应答
- 时间戳请求与应答
- 不再使用的报文
- 信息请求与应答
- 子网掩码请求与应答
- 路由器询问和通报
常用报文类型如下:
我们留意 3 个报文。首先是回显应答 (Echo Reply) 报文,我们知道 Ping 程序是会发送一个回显请求(类型 8 编码 0)报文给目的主机,目的主机收到之后就发送回显应答(类型 0 编码 0)报文进行回显。接着是TTL 报文(类型 11 编码 0),这个是在 Traceroute 程序中,路由器检查到 Traceroute 发出的 IP 数据报中 TTL 正好过期,因此路由器就需要丢包并且发送该警告报文返回源主机。源主机就可以得到路由器的 IP 地址,以此达到路由追踪的目的。
还有一个是源抑制**报文,这个报文是为了执行拥塞控制,令拥塞的路由器可以通过发送该报文令主机发送速率降低,不过 TCP 在运输层有自己的拥塞控制手法,因此源抑制报文在实践中很少使用。
ICMP 协议和 Ping 程序
Ping
Ping 程序允许我们验证某主机是否存在,通过将数据包发送到目标 IP 地址, 如果目标主机在线则目标主机中的 Ping 程序将会发送响应数据包进行响应,这两个 Ping 数据包都是 ICMP 数据包。例如 Ping 一下集美大学官网:
实验步骤
- 打开 windows 的命令提示符。
2. 启动 Wireshark 数据包嗅探器,并开始 Wireshark 数据包捕获。
3. Ping 程序在 c:\windows\system32 目录中,输入“ping –n 10 hostname” 或 “c:\windows\system32\ping –n 10 hostname”,其中 hostname 最好是另一个大陆的主机名,参数 -n 10 代表发送 10 个 Ping 消息,然后执行命令。
那就选择麻省理工学院官网 “www.mit.edu”来测试。
我主机上的 ping 程序发送了10 个查询包并收到了 9 个响应,有 1 个包丢失,对于每个响应,源计算往返时间(RTT),数据包平均为 200 毫秒。
4. Ping 程序终止时,停止在 Wireshark 中捕获数据包。
数据包列表显示 19 个数据包,说明源发送的 10 个 Ping 查询和源接收的 9 个 Ping 响应。数据包内容区域可以查看此数据包的信息,该数据包中的 IP 数据报的协议号ICMP 的协议号 01,这表示 IP 数据报的有效载荷是 ICMP 数据包。
查看该 ICMP 包的详情信息,数据包包含校验和,标识符和序列号,该 ICMP 数据包是类型 8 和代码 0,也就是“回应请求”数据包。
问题解答
- 源主机的 IP 地址是多少?目标主机的 IP 地址是多少?
源主机:192.168.67.249
目标主机:104.86.239.32
2. 为什么 ICMP 数据包没有源端口号和目的端口号?
因为 ICMP 报文作为 IP 有效载荷承载的,不需要像 TCP 或 UDP 那样需要端口号。
3. 查看任意的请求 ICMP 数据包,ICMP 类型和代码是什么?该 ICMP 数据包还有哪些其他字段?校验和,序列号和标识符字段有多少字节?
类型 8 和代码 0,也就是回应请求报文,还有校验和,序列号和标识符字段,都是 4 字节。
4. 查看任意的响应 ICMP 数据包,ICMP 类型和代码是什么?该 ICMP 数据包还有哪些其他字段?校验和,序列号和标识符字段有多少字节?
类型 0 编码 0 是回显应答报文,还有校验和,序列号和标识符字段,都是 4 字节。
ICMP 协议和 Traceroute 命令
Traceroute
Traceroute 程序可用于确定数据包从源到目的地的路径,发送 TTL 增加的数据包,当 TTL = 1 的包达到路由器,该路由器会将该包丢弃,并且发送 ICMP 错误给请求的机器。
实验步骤
- 打开 windows 的命令提示符。
2. 启动 Wireshark 数据包嗅探器,并开始 Wireshark 数据包捕获。
3. tracert 程序在 c:\windows\system32 目录中,在命令提示符中输入“tracert hostname” 或 “c:\windows\system32\ tracert hostname”。其中 hostname 是另一个大陆的主机名,访问法国 INRIA(计算机科学研究所)“www.inria.fr”。
需要等上一段时间。
- tracert 程序终止时,停止在 Wireshark 中捕获数据包。
对于每个 TTL 值,源程序发送三个探测包。 Traceroute 显示每个探测包的 RTT,以及返回 ICMP TTL 超出消息的路由器的 IP 地址和名称。
问题解答
- 您的主机的 IP 地址是多少?目标目标主机的 IP 地址是多少?
源主机:192.168.67.249
目标主机:128.93.162.63
6. 如果 ICMP 发送了 UDP 数据包(如在 Unix / Linux 中),那么探测数据包的 IP 协议号仍然是 01 吗? 如果没有,它会是什么?
待解答。
7. 检查屏幕截图中的 ICMP 响应数据包。这与本实验的前半部分中的 ICMP ping 查询数据包不同吗?如果不同,请解释为什么?
不同,这里的 ICMP 报文时 **TTL 报文(类型 11 编码 0),这个是在 Traceroute 程序中,路由器检查到 Traceroute 发出的 IP 数据报中 TTL 正好过期,因此路由器就需要丢包并且发送该警告报文返回源主机。这个与 Ping 程序中所要达成的目的不同,Ping 程序是为了请求响应。
8. 检查屏幕截图中的 ICMP 错误数据包。它具有比 ICMP 响应数据包更多的字段。这个数据包含哪些内容?
比响应数据包多了 ICMP 请求数据包的内容。
9. 检查源主机收到的最后三个 ICMP 数据包。这些数据包与 ICMP 错误数据包有何不同?他们为什么不同?
这个是目的主机返回的回显应答报文,因为 tracert 程序的原理是发送 TTL 增加的数据包,当 TTL = 1 的包达到路由器,该路由器会将该包丢弃,并且发送 ICMP 错误给请求的机器。而最后一组 3 个数据报时可以到达目的主机的,这时由于是被目的主机接收,目的主机不会丢包,而是确确实实收到的这个探测的数据报并进行了响应。
10. 在 tracert 跟踪测量中,是否有一个连接的延迟比其他连接长得多?是否有连接的延迟明显长于其他连接?根据路由器名称,您能猜出这个连接末端的两个路由器的位置吗?
在第 8 个节点和第 9 个节点之间时延突增,之后的节点时延都达到了 250+ ms。之后的路由器名都是英文名,且目的地是法国,那应该是连接到了亚洲转欧洲的分界路由器了。
用 Best trace 做一次路由追踪,看来确实在这两个节点出现了从上海到伦敦的大跳跃!
参考资料
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社
ICMP
互联网控制消息协议