ICMP、ping与traceroute的工作原理
因特网控制报文协议ICMP
IP只提供尽力而为的服务,数据报出了问题时,网络需要一种方式把情况告诉源主机。因特网控制报文协议ICMP(Internet Control Message Protocol)就承担这项工作:主机和路由器用它交换网络层的差错报告和控制信息。
ICMP报文作为IP数据报的数据部分来传送,IP首部的协议字段为1。从这个意义上说,ICMP位于IP“之上”,但它通常被看作网络层的一部分。每个ICMP报文都有一个类型(type)字段和一个代码(code)字段;差错报告报文还会附上引起差错的那个数据报的首部和数据部分的前8个字节,使源主机能够判断是哪个协议、哪个端口的数据出了问题。
| 类型 | 代码 | 含义 |
|---|---|---|
| 0 | 0 | 回显应答(ping的回答) |
| 3 | 0 | 目的网络不可达 |
| 3 | 1 | 目的主机不可达 |
| 3 | 3 | 目的端口不可达 |
| 3 | 4 | 需要分片但设置了DF(见4.2节) |
| 8 | 0 | 回显请求(ping) |
| 11 | 0 | TTL超时 |
为了避免差错报文引发更多差错报文,ICMP不会对ICMP差错报文本身、广播或多播数据报以及非第一个分片再产生差错报告。
ping
ping程序向目标主机发送ICMP回显请求(类型8),目标主机收到后返回回显应答(类型0),应答中带回请求里的标识符和序号。ping据此测量每个请求的往返时间RTT,并在结束时给出统计,包括丢包率(loss)和收到的个RTT的平均值:
PING 203.0.113.7: 56 data bytes
64 bytes from 203.0.113.7: icmp_seq=0 ttl=60 time=20.4 ms
64 bytes from 203.0.113.7: icmp_seq=1 ttl=60 time=21.9 ms
Request timeout for icmp_seq 2
64 bytes from 203.0.113.7: icmp_seq=3 ttl=60 time=22.5 ms
--- 203.0.113.7 ping statistics ---
4 packets transmitted, 3 packets received, 25.0% packet loss
round-trip min/avg/max = 20.4/21.6/22.5 msRTT中包含传播时延、处理时延和沿途各队列中的排队时延(见1.3节)。RTT在各次测量之间明显波动,通常说明路径上某处的队列在变化;出现丢包则可能意味着某个队列已经溢出。也有一些主机或防火墙被配置为不回应ping,因此收不到应答并不一定说明主机不可达。
ping一条可以被拥塞的路径
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
traceroute的工作原理
第1章使用traceroute观察了数据报经过的路径,它正是利用TTL和ICMP实现的:
- 源主机发送一系列UDP数据报,目的端口是一个几乎不可能被使用的端口号(通常从33434开始)。第一个数据报的TTL为1,第二个为2,依此类推。
- 第个数据报到达第台路由器时,TTL被减为0。路由器丢弃它,并向源主机返回ICMP TTL超时报文(类型11代码0)。该报文的源地址就是这台路由器的IP地址。
- 源主机记录从发送数据报到收到ICMP报文之间的时间,得到到达这台路由器的RTT。
- 当某个数据报终于到达目的主机时,它不会超时;但目的主机上没有进程使用那个端口,于是返回ICMP端口不可达报文(类型3代码3)。源主机收到它就知道已经到达目的地,停止发送。
traceroute通常对每个TTL发送3个探测分组,所以每一行显示3个RTT。如果在超时时间内没有收到应答,就显示*。这可能是因为分组丢失,也可能是因为该路由器被配置为不发送ICMP报文。只要后面的跳仍有应答,就说明路径并没有中断。Windows的tracert用ICMP回显请求代替UDP数据报,到达目的主机时收到的是回显应答。
亲手实现traceroute:TTL逐跳加一
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
用Python汇总ping结果
七个回显请求的RTT(毫秒)如下,None表示没有收到应答:[21.4, 20.9, None, 27.0, 23.1, None, 22.6]。编写Python程序,按Linux ping的格式打印分组数与丢包率,以及min/avg/max/mdev,其中mdev是收到的RTT的标准差。
读懂带有沉默跳的traceroute输出
一次基于UDP的traceroute输出如下:
1 192.168.1.1 1.2 ms 1.1 ms 1.3 ms 2 100.64.0.1 8.4 ms 8.9 ms 8.1 ms 3 * * * 4 203.0.113.1 35.2 ms 34.8 ms 36.1 ms 5 198.51.100.20 33.9 ms 34.1 ms 33.7 ms
(a)源主机与198.51.100.20之间有几台路由器?(b)每一行分别由哪种ICMP类型和代码产生?(c)第3跳处路径断了吗?(d)为什么第5跳的RTT可以比第4跳小?