ICMP 协议及Wireshark实验
ICMP 协议
因特网控制报文协议
ICMP,即因特网控制报文协议,在主机和路由器之间起到沟通网络层信息的作用。最典型的用途就是差错报告,它允许主机或路由器报告查错情况和提交有关异常情况的报告。例如网络通不通、主机是否可达、路由是否可用等网络本身的消息,这些控制消息虽对于数据的传递起着重要的作用。ICMP 报文作为 IP 有效载荷承载的,因此虽然 ICMP 被认为是 IP 的一部分,但在体系结构上 ICMP 位于 IP 之上。当主机接收到指明上层协议为 ICMP 的 IP 数据报时,该数据报分解的内容应当交给 ICMP。
ICMP 报文格式
ICMP 报文包括 IP 头部、ICMP 头部和 ICMP 报文 3 个部分,ICMP 报文是作为 IP 有效载荷承载的。
字段 | 说明 |
---|---|
Type | ICMP 的类型,标识生成的错误报文; |
Code | 进一步划分 ICMP 的类型,该字段用来查找产生错误的原因; |
Checksum | 校验码,字段包含有从 ICMP 报头和数据部分计算得来的,用于检查错误的数据; |
ID | ID 值,在 Echo Reply 类型的消息中要返回这个字段; |
Sequence | 这个字段包含一个序号,在 Echo Reply 类型的消息中要返回这个字段。 |
ICMP 报文类型
ICMP 有 2 类报文,第一类是差错报告报文,分别是以下 5 种:
差错报告报文 | 说明 |
---|---|
目的不可达 | 路由器或主机不能交付数据报 |
超时或超期 | 路由器收到生存时间为 0 的数据报 |
参数有问题 | 路由器或主机收到数据报中,首部有字段的值不正确 |
重定向 | 改变主机下一次发生数据报所选的路由 |
源抑制 | 发送给源主机,令其降低发送数据的速率(现在不用了) |
第二类是网络探询报文,有以下 2 组:
网络探询报文 | 说明 |
---|---|
回声请求与应答 | 主机或路由器向特定主机发送询问 |
时间戳请求与应答 | 请求某台主机或路由器应答当前日期和时间 |
除此之外还有 3 个不再使用的报文,分别是:信息请求与应答、子网掩码请求与应答、路由器询问和通报。常用报文类型如下:
我们留意 3 个报文。首先是回显应答 (Echo Reply) 报文,我们知道 Ping 程序是会发送一个回显请求(类型 8 编码 0)报文给目的主机,目的主机收到之后就发送回显应答(类型 0 编码 0)报文进行回显。一般来说,第一个回显请求之前要先发送一个 ARP 请求并接收应答,会消耗一定的时间。
接着是TTL 报文(类型 11 编码 0),这个是在 Traceroute 程序中,路由器检查到 Traceroute 发出的 IP 数据报中 TTL 正好过期,因此路由器就需要丢包并且发送该警告报文返回源主机。源主机就可以得到路由器的 IP 地址,以此达到路由追踪的目的。
还有一个是源抑制报文,这个报文是为了执行拥塞控制,令拥塞的路由器可以通过发送该报文令主机发送速率降低,不过 TCP 在运输层有自己的拥塞控制手法,因此源抑制报文在实践中很少使用。
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,也就是回应请求报文,还有校验和,序列号和标识符字段,都是 2 字节。
4. 查看任意的响应 ICMP 数据包,ICMP 类型和代码是什么?该 ICMP 数据包还有哪些其他字段?校验和,序列号和标识符字段有多少字节?
类型 0 编码 0 是回显应答报文,还有校验和,序列号和标识符字段,都是 4 字节。
Traceroute 命令
Traceroute 简介
Traceroute 程序可用于确定数据包从源到目的地的路径,原理是发送 TTL 增加的数据包,当 TTL = 1 的包达到路由器,该路由器会将该包丢弃,并且发送 ICMP 错误给请求的机器。
traceroute 通过首先发送一个或多个带有生存时间 (TTL) 字段设置为 1 的数据报;然后发送一个或多个带有 TTL 字段设置为 2 的数据报到同一个目的地;然后发送一个或多个带有 TTL 字段设置为 3 的数据报到同一个目的地,以此类推,直到目的地真正收到此数据报为止。路由器必须将每个接收到的数据报中的 TTL 减 1,如果 TTL 达到 0,路由器会向来源主机发送 ICMP 消息。由于这种行为,TTL 为 1 的数据报将导致距发送方一次跳跃的路由器,将 ICMP TTL 超出的消息发送回发送方主机;以TTL 为 2 发送的数据报将导致距离为两次跳跃的路由器,将 ICMP 消息发送回发送方主机等等。以这种方式,执行 traceroute 的主机可以通过查看包含ICMP TTL 超出消息的数据报中的来源 IP 地址来获知其自身与目的地之间的路由器的身份。
实验步骤
- 打开 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
互联网控制消息协议