第五章
ICMP协议
RFC792
TCP/IP详解卷 1,CH6,CH7,CH8
主要内容
? 5.1 因特网控制报文协议 ICMP
? 5.2 Ping程序
? 5.3 Traceroute( Tracert)
? 课下作业
5.1 因特网控制报文协议 ICMP
Internet Control Message Protocol
应用层
传输层
网络层 t
数据链路层
物理层
目的不可达
Echo (Ping)
其它
ICMP
1
ICMP的目的
为了减少 IP数据报的丢失
ICMP的类型
差错报文
询问报文
改变路由报文
源站抑制报文
Echo请求报文
ICMP时间戳请求报文
ICMP地址掩码请求报文
ICMP数据报的格式
类型 代码 检验和
长度可变部分
取决于 ICMP的类型
位 0 8 16 31
ICMP报文
首部 数 据
类型值 ICMP报文的类型
0 回送( echo)回答
3 目的站不可达
4 源站抑制
5 改变路由
8 回送( echo)请求
11 数据报的时间超过
12 数据报的参数有问题
13 时间戳请求
14 时间戳回答
17 地址掩码请求
18 地址掩码回答
IP数据报
对 I C M P差错报文有时需要作特殊处理
? 在对 I C M P差错报文进行响应时,永远不会生
成另一份 I C M P差错报文
? 如果没有这个限制规则,可能会遇到一个差错产
生另一个差错的情况,而差错再产生差错,这样
会无休止地循环下去。
下面情况都不会导致产生 I C M P差错报文
? ICMP差错报文(但是,I C M P查询报文可能会产生 I C
M P差错报文)。
? 目的地址是广播地址或多播地址的 I P数据报。
? 作为链路层广播的数据报
? 不是 I P分片的第一片
? 源地址不是单个主机的数据报。这就是说,源地址不能为
零地址、环回地址、广播地址或多播地址。
ICMP地址掩码请求与应答
? 用于无盘系统在引导过程中获取自己的子网掩码
? 无盘系统获取子网掩码的另一个方法是 B O O T P
协议
ICMP地址掩码请求和应答报文
ICMP时间戳请求与应答
? I C M P时间戳请求允许系统向另一个系统查询当前的时
间。
? 返回的建议值是自午夜开始计算的毫秒数,协调的统一时
间( Coordinated Universal Time,UTC)。
? 这种 I C M P报文的好处是它提供了毫秒级的分辨率,而
利用其他方法从别的主机获取的时间(如某些 U n i x系
统提供的 r d a t e命令)只能提供秒级的分辨率。
ICMP时间戳请求和应答报文
? 请求端填写发起时间戳,然后发送报文。
? 应答系统收到请求报文时填写接收时间戳
? 在发送应答时填写发送时间戳
? 但是,实际上,大多数的实现把后面两个字段都设成相同
的值
? 提供三个字段的原因是可以让发送方分别计算发送请求的
时间和发送应答的时间
计算出往返时间 RTT
由于时间戳的值是自午夜开始计算的毫秒数,即 U T C,
因此它们的值始终小于 86 400 000
( 2 4× 6 0× 6 0× 1 0 0 0 )。
获得时间和日期的其他方法
? 日期服务程序和时间服务程序
? 网络时间协议( N T P) RFC 1305
? 开放软件基金会( O S F)的分布式计算环境( D C E)
定义了分布式时间服务( D T S)
? 伯克利大学的 U n i x系统提供守护程序 t i m e d( 8 ),
来同步局域网上的系统时钟
ICMP端口不可达差错
? 如果收到一份 U D P数据报而目的端口与某个正在使用的
进程不相符,那么 U D P返回一个 I C M P不可达报文。
? 可以用 T F T P来强制生成一个端口不可达报文
? 一个 I C M P端口不可达差错是立刻返回的
? I C M P差错报文必须包括生成该差错报文的数据报 I P首
部(包含任何选项),还必须至少包括跟在该 I P首部后
面的前 8个字节。
UDP端口不可达时返回的 ICMP报文
ICMP不可达报文的类型
I C M P不可达报文的一般格式
? 尽管在 I C M P报文中的第二个 32 bit字必须为 0
? 但是当代码为 4时(, 需要分片但设置了不分片
比特, ),路径 M T U发现机制却允许路由器把
外出接口的 MTU填在这个 32 bit字的低 16 bit中。
5.2 Ping程序
? Ping程序由 Mike Muuss编写
? 目的是为了测试另一台主机是否可达。
? 该程序发送一份 ICMP回显请求报文给主机,并等待返回
ICMP回显应答。
? Ping程序还能测出到两台主机间的往返时间
? Ping还给我们提供了检测 I P记录路由和时间戳选项的机会
大多数的 T C P / I P实现都在内核中
直接支持 P i n g服务器
? 这种服务器不是一个用户进程
? 是直接在内核中进行处理的
I C M P回显请求和回显应答报文
? 标识符 U n i x系统在实现 p i n g程序时是把
I C M P报文中的标识符字段置成发送进程的 I D
号。
? 序列号 序列号从 0开始,每发送一次新的回显请
求就加 1。
IP记录路由选项
? p i n g程序为我们提供了查看 I P记录路由( R R)选项的机会。
? 大多数不同版本的 p i n g程序都提供 -R选项,以提供记录路由的功
能。
? 它使得 p i n g程序在发送出去的 I P数据报中设置 I PR R选项(该 I P
数据报包含 I C M P回显请求报文)。
? 这样,每个处理该数据报的路由器都把它的 I P地址放入选项字段中。
? 当数据报到达目的端时,I P地址清单应该复制到 I C M P回显应答
中,这样返回途中所经过的路由器地址也被加入清单中。
? 现在的大多数系统都支持这些选项功能,
只是有一些系统不把 I C M P请求中的 I P
清单复制到 I C M P应答中。
? 但是,最大的问题是 I P首部选项中只有有
限的空间来存放 I P地址。
I P数据报中的 R R选项的一般格式
? c o d e 指明 I P选项的类型。对于 R R选项来说,它的值
为 7。
? l e n 是 R R选项总字节长度,最大为 3 9。
? p t r 指针字段,是一个基于 1的指针,指向存放下一个 I
P地址的位置。它的最小值为 4,指向存放第一个 I P地址
的位置。随着每个 I P地址存入清单,p t r的值分别为 8,
1 2,1 6,最大到 3 6。当记录下 9个 I P地址后,p t r的
值为 4 0,表示清单已满。
? 当路由器在清单中记录 I P地址时,它应该记录哪
个地址呢?是入口地址还是出口地址?
? RFC 791 [Postel 1981a]指定路由器记录出口
I P地址。
? 有时会看到,当原始主机(运行 p i n g程序的主
机)收到带有 R R选项的 I C M P回显应答时,它
也要把它的入口 I P地址放入清单中。
? 做实验并分析,IP记录路由
IP时间戳选项
?时间戳选项的代码为 0 x 4 4
?l e n 选项的总长度,一般为 3 6或 4 0。
?p t r指向下一个可用空间的指针( 5,9,1 3等)
?O F表示溢出字段
? F L表示标志字段。
时间戳选项的操作根据标志字段来进行
如果路由器由于没有空间而不能增加时间戳选项,那么
它将增加溢出字段的值。
Ping命令
ping命令是测试连接的一个非常有用的工具,可以在各
种协议中用来检查同远程主机之间的连接,合理利用
ping可以对 95%以上的网络故障进行定位。
影响 Ping的因素
? 主机忙引起超时
? 路径长引起超时
? 访问列表引起超时
主机忙引起超时
? 如果有足够的时间和资源来进行响应, 主机会
立即响应的 。
? 如果没有足够的时间或资源来响应, ping请求将
被放在队列中, 并在能够响应的时候再响应 。
? Ping请求的缺省超时时间为 2秒
? 也许当主机有能力响应 ping命令已经超时, 虽然
两站之间是可达的, 但 ping的反馈结果是不可达 。
路径长引起超时
? 缺省情况下, ping将 TTL设为 32
? ping每经过一个路由器 TTL减 1
? 如果路径特别长, 还没有到达目的地时 TTL已
经变为 0,
? 这时, 最后一台路由器将发送回 ICMP超时消息 。
访问列表引起超时
? 在 IP连接可用的情况下, ping总是显示连接不可用, 最常见的原
因是访问列表 。 假定访问列表中有下列行, 并且在路由器的入站
串行端口上已经激活:
? Deny icmp any any echo-reply
? Permit icmp any any echo-request
? 这时, 请求能发送出去, 但不允许应答发送进来, 最终 ping 将超
时 。
? 这种情况下, 其他网络中的主机也许可以 ping到你的主机, 但你
的主机将永远无法成功地 ping到经过该接口的主机 。
Ping命令的格式
? ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r
count] [-s count] [[-j computer-list] | [-k computer-list]]
[-w timeout] destination-list
? -t 不停地 Ping指定的计算机直到按 Ctrl+C中断。
? -n count 发送 count 指定的 ECHO 数据包数和目标主机
连接。默认值为 4。
? -l length 发送包含由 length 指定的数据量的 ECHO 数据
包。默认为 32 字节;最大值是 65,527。
? -w timeout 指定超时间隔,单位为毫秒,缺省值为
1000。
? -a 将地址解析为计算机名。
? -f 在数据包中发送, 不要分段, 标志。数据包就不会被路
由上的网关分段。
? -i ttl将, 生存时间, 字段设置为 ttl 指定的值。
? -v tos 将, 服务类型, 字段设置为 tos 指定的值。
? -r count 在, 记录路由, 字段中记录传出和返回数据包
的路由。 count 可以指定最少 1 台,最多 9 台计算机。
? -s count 指定 count 指定的跃点数的时间戳。
? -j computer-list 利用 computer-list 指定的计算机列
表路由数据包。连续计算机可以被中间网关分隔(宽松源
站选路) IP 允许的最大数量为 9。
? -k computer-list 利用 computer-list 指定的计算机列
表路由数据包。连续计算机不能被中间网关分隔(严格站
选路) IP 允许的最大数量为 9。
? destination-list 指定要 ping 的远程计算机。
使用 Ping排除故障的顺序
? 使用 winipcfg,ipconfig,show run等命令查看当前的 IP
地址, 子网掩码和缺省网关, 保证这些设置都正确 。
? ping本机 IP地址检查网卡, 如果连接超时, 说明网卡有问
题, 检查网卡本身, 配置和驱动程序 。
? ping 127.0.0.1, 测试本设备上的网络接口 。 若连接超时,
很可能是 IP协议没有正确安装, 在 Windows系统中, 可能是
IP协议栈出现了问题, 重新安装协议即可解决问题 。
? ping缺省网关, 如果超时, ping本地子网上的其他主机,
如果连接正常, 则说明问题肯定出现在缺省网关上;如果
连接超时, 进行下一个步骤 。
? 到本网内的另一个工作站上, 并尝试通过网关进行 ping。
如果该工作站正常, 则问题出在开始的工作站上, 检查连
接到开始工作站的网线和接口;如果这个工作站也不正常,
则说明问题出在缺省网关上 。
5.3 Traceroute( Tracert)
? 由 Van Jacobson编写的 Traceroute程序是一个能更深入
探索 TCP/IP协议的方便可用的工具。
? 尽管不能保证从源端发往目的端的两份连续的 IP数据报具
有相同的路由,但是大多数情况下是这样的。
? Traceroute 程序可以让我们看到 IP数据报从一台主机传
到另一台主机所经过的路由。
? Traceroute 程序还可以让我们使用 IP源路由选项 。
开发 Traceroute的原因
? 既然已经有 I P记录路由选项( R R),为什么不
使用这个选项而另外开发一个新的应用程序?
? 原因:
? 原先并不是所有的路由器都支持记录路由选项
? 记录路由一般是单向的选项
? IP首部中留给选项的空间有限
Traceroute的用途
? Traceroute同 ping命令一样, 可以用来测
试连接性, 它耗费的时间比 ping命令长,
但它可以提供更多的信息
? 所以, 在用 ping命令无法查出故障时,
traceroute可以帮助我们较好地解决问题 。
Traceroute的工作原理
? Traceroute开始将发送 3个 ICMP echo-request报文,
TTL设置为 1,使得第一台路由器处理这些数据报, 并
发送回 ICMP超时消息 。
? Traceroute查看 ICMP超时消息并在控制屏幕上显示出
该路由器
? 然后, traceroute将发送另外一组 echo-request报文,
且每次将 TTL增加 1。 这种请求传到第二台路由器, TTL
减为 0,第二台路由器将发送回超时消息 。 这个过程一
直持续下去, 直到目的主机响应或者能够确定目的主
机不可达为止 。
? 在远程主机响应时, traceroute将显示出完整路径以
及每两个路由器之间花费的时间 。
? 如果目的主机没有响应, 仍然回报尝试寻找主机所经
历的路径 。 Traceroute命令如下:
Router#traceroute 169.26.3.1
用 traceroute命令检查循环路由举例
Router#traceroute 169.26.3.1
Type escape sequence to abort.
Tracing the route to 169.26.3.1
1 169.22.1.5 4 msec 0 msec 4 msec
2 169.22.1.1 4 msec 0 msec 4 msec
3 169.22.1.5 4 msec 0 msec 4 msec
4 169.22.1.1 4 msec 0 msec 4 msec
任何时候, 只要路由器多次显示同一个接口, 就说明产生了循
环路由 。 静态路由的错误使用和路由的重分布常常会导致这种问题
的发生 。
关于 Traceroute的说明
? 并不能保证现在的路由也是将来所要采用的路由,甚至两
份连续的 I P数据报都可能采用不同的路由。
? 不能保证 I C M P报文的路由与 t r a c e r o u t e程序发
送的 U D P数据报采用同一路由。
? 返回的 I C M P报文中的信源 I P地址是 U D P数据报到达
的路由器接口的 I P地址。 I P记录路由选项不同,记录的
I P地址指的是发送接口地址。
IP源站选路选项
? 通常 I P路由是动态的,即每个路由器都要判断数据报下
面该转发到哪个路由器。应用程序对此不进行控制,而且
通常也并不关心路由。
? 它采用类似 Tr a c e r o u t e程序的工具来发现实际的路
由。
? 源站选路 (source routing)是由发送者指定路由
源站选路的方法
? 严格的源站选路
? 宽松的源站选路
Traceroute程序提供了一个查看源站选路的方法
作业:先用 Traceroute查看路径,再在选项中指明源站选
路,然后检查其运行情况。
注,Traceroute提供了宽松的源站选路和严格的源站选路
Tracert只提供了宽松的源站选路
源站选路选项的格式
?c o d e 对于宽松的源站选路其值为 0 x 8 3,而对于严
格的源站选路,其值为 0 x 8 9。
?l e n和 p t r字段与 I P数据报中的 R R选项的一般格式中
所描述的一样。
Tracert 命令格式
? tracert [-d] [-h maximum_hops] [-j computer-list]
[-w timeout] target_name
? -d 指定不将地址解析为计算机名
? -h maximum_hops 指定搜索目标的最大跳数
? -j computer-list 指定沿 computer-list 的宽松源站选路
? -w timeout 每次应答等待 timeout 指定的微秒数
? target_name 目标计算机的名称
课下作业(必做)
1.查资料:网络时延的测量技术
并做相应的实验
2.Ping和 Traceroute是如何计算往返时延的,它们计算往返时延有什么
不同?
3.查资料,ICMP的安全性及防御策略研究
并做相应的实验
4.用 Ping做实验并分析,IP记录路由 -r 选项
作实验:先用 Tracert查看路径,再在选项中源站选路,然后检查其运
行情况。
5.用 Ping和 Tracert做更多的实验
课下作业(选做)
1.编程序,实现 Ping和 Traceroute( Tracert)
2.编程序,利用 ICMP数据包,发现指定网段中的活动主机。
运行格式,程序名 被搜索网段的开始 IP 被搜索网段的结束 IP
实现方法一:用原始套接字生成 ICMP报文来进行活动主机
的探查
实现方法二:在 Windows下利用 ICMP.DLL发送 Ping消息