本文引用图片均来自 高军: 计算机网络
报文
ICMP(Internet Control Messages Protocol)
主要用于更有效的转发IP数据报和提高交付成功的机会(不可靠传输),ICMP报文封装在IP数据报
中,主机或路由器使用ICMP发送差错报告报文
或询问报文
差错报告报文
ICMP差错报告报文有以下几种:
- 终点不可达
- 源点抑制
- 时间超过
- 参数问题
- 改变路由(重定向)
终点不可达:
当路由器或主机不能交付数据报时就向源点发送终点不可达报文,终点不可达具体可细分为目的网络不可达、目的协议
不可达等13种
错误
如下例中,主机H1向主机H2发送报文,当报文到达路由器R1时,如果R1的路由表找不到
前往H2的下一跳,也没有
特定主机路由等配置,那么R1就不知道如何转发数据报,此时R1只能丢弃数据报并向H1发送终点不可达报文
源点抑制:
当路由器或主机因拥塞
而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率
放慢
如下例中,主机H1向主机H2发送报文,H2拥塞忙碌处理不过来便丢弃报文并向H1发送源点抑制报文
时间超过:
路由器转发数据报前会将其中的TTL字段
的值减一,如果TTL减为0
则将报文丢弃并向源点发送时间超过报文。另外,如果终点在协议规定的时间内没有接收到分片数据报的全部分片
那么会导致数据报重组失败
,此时也会向源点发送时间超过报文
参数问题:
当路由器或主机收到数据报后根据其首部检验和
字段发现首部在传输过程中发生了误码,那么它将丢弃报文并向源点发生参数问题报文
改变路由(重定向):
路由器将把改变路由报文发送给主机,让主机知道下次应该把报文发给别的路由(更优路径)
如下例中,主机H1向主机H2发送数据报,主机指定路由器R1为默认网关
所以数据报先被R1接收。R1查询路由表后知道选择路径R4-R5
是最优的,当R1将数据报转发给R4时发现报文需要从刚才其被接收的端口
发送出去,此时R1就向H1发送改变路由报文H1,H1收到路由改变报文后就记录
下来并在下次将发往H2的报文直接发给R4
以下情况不应发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发生ICMP差错报告报文
- 对具有多播地址的数据报都不发生ICMP差错报告报文
- 对具有特殊地址(如
127.0.0.0
或0.0.0.0
)的数据报不发送ICMP差错报告报文
询问报文
询问报文有两种:
- 回送请求和回答:ICMP回送请求报文是由主机或路由器向一个
特定
的目的主机发出的询问。收到此报文的主机必须
给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达
及了解有关状态
- 时间戳请求和回答:ICMP时间戳请求报文时请某个主机或路由器回答当前的
日期和时间
。在ICMP时间戳回答报文中由一个32位
的字段,其中写入的整数代表从1900年1月1日
起到当前时刻一共有多少秒
。这种询问报文用来进行时钟同步
和测量时间
应用
分组区间探测 PING(Packet InterNet Groper):
PING大家应该都很熟悉了,经常用来测试和目的主机之间是否畅通
,其实PING就是使用了回送请求和回答报文
跟踪路由 traceroute:
用来测试IP数据报从源主机到目的主机都经过
哪些路由器
路由跟踪是通过时间超过
的差错报告报文
实现的,如下图主机H1最初发送TTL为1
的ICMP报文,路由器R1收到报文后将TTl减1
发现此时TTL为0
,R1丢弃报文并向H1发送时间超过报文
,那么H1就知道
报文要经过R1。然后,H1发送TTl为2
的报文,同理H1会知道报文要经过R2。如此循环往复直到H2向H1发送回应报文,H1便知道了报文经过的所有路由器