为了更有效地转发 IP 数据报和提高交付成功的机会
- 在网际层使用了网际控制报文协议 
ICMP(Internet Control Message Protocol)。 
主机或路由器使用 ICMP 来发送
- 差错报告报文 \color{red}差错报告报文 差错报告报文和
 - 询问报文 \color{red}询问报文 询问报文。
 
I C M P 报文被封装在 I P 数据报 \color{red}ICMP 报文被封装在 IP 数据报 ICMP报文被封装在IP数据报中发送。
ICMP 差错报告报文共有以下 
    
     
      
       
        5
       
      
      
       5
      
     
    5 种
- 终点不可达、源点抑制、时间超过、参数问题、改变路由(重定向)
 
1、终点不可达
当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
具体可再根据 ICMP 的代码字段细分为
-  
目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知
 -  
等 13 13 13 种错误。
 
假设主机 H1 给 H2 发送 IP 数据报
H1 会将 IP 数据报发送给路由器 R1,由 R1 帮其转发
若 R1 的路由表中没有网络 N3 的路由记录、默认路由以及主机 H2 的特定主机路由
-  
则
R1就不知道如何转发该数据报,只能将其丢弃 -  
并向发送该数据报的源主机
H1发送ICMP差错报告报文(类型:终点不可达) 

2、源点抑制
当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放
慢。
假设主机 H1 给 H2 发送 IP 数据报
当该数据报传输到 R2 时,由于 R2 拥塞,也就是 R2 比较繁忙
-  
R2根据自己的丢包策略丢弃了该数据报 -  
并向发送该数据报的源主机
H1发送ICMP差错报告报文(类型:源点抑制) 


3、时间超过
当路由器收到一个目的 IP 地址不是自己的 IP 数据报,会将其生存时间 TTL 字段的值减 
    
     
      
       
        1
       
      
      
       1
      
     
    1。
若结果不为 
    
     
      
       
        0
       
      
      
       0
      
     
    0 ,则将该 IP 数据报转发出去;若结果为 
    
     
      
       
        0
       
      
      
       0
      
     
    0,除丢弃该 IP 数据报外,还要向源点发送时间超过报文。

另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃
- 也会向源点发送时间超过报文。
 
4、参数问题
当路由器或目的主机收到 IP 数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。

5、改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
假设我们给主机 H1 指定的默认网关是路由器 R1 ,则 H1 要发往网络 N2 的 IP 数据报都会传输给 R1 ,尤其帮忙转发

当 R1 发现 H1 发往 N2 的数据报的最佳路由是应当经过 R4 时
- 就用改变路由报文把这个情况告诉主机
 
于是,H1 就将自己的路由表种添加一个项目,到达 N2 应经过路由器 R4,而不是默认网关 R1

6、不应发送 ICMP 差错报告报文的情况
对 ICMP 差错报告报文不再发送 ICMP 差错报告报文
对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文
对具有多播地址的数据报都不发送 ICMP 差错报告报文
对具有特殊地址(如
    
     
      
       
        127.0.0.0
       
      
      
       127.0.0.0
      
     
    127.0.0.0 或 
    
     
      
       
        0.0.0.0
       
      
      
       0.0.0.0
      
     
    0.0.0.0)的数据报不发送 ICMP 差错报告报文
7、习题

答案 C
8、常见的 ICMP 询问报文(2 种)
8.1、回送请求和回答
ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。
收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。
这种询问报文用来 测试目的站是否可达 \color{red}测试目的站是否可达 测试目的站是否可达及了解其有关状态。
8.2、时间戳请求和回答
ICMP 时间戳请求报文是请某个主机或路由器回答当前的日期和时间。
在 ICMP 时间戳回答报文中有一个 
    
     
      
       
        32
       
      
      
       32
      
     
    32 位的字段,其中写入的整数代表从
    
     
      
       
        1900
       
      
      
       1900
      
     
    1900 年 
    
     
      
       
        1
       
      
      
       1
      
     
    1月 
    
     
      
       
        1
       
      
      
       1
      
     
    1 日起到当前时刻一共有多少秒。
这种询问报文用来进行 时钟同步和测量时间 \color{red}时钟同步和测量时间 时钟同步和测量时间
9、ICMP 应用举例
9.1、分组网间探测 PING(Packet InterNet Groper)
用来测试主机或路由器间的连通性
应用层直接使用网际层的 ICMP (没有通过运输层的 TCP 或 UDP )
使用 ICMP 回送请求和回答报文
例如:测试主机与百度网站服务器的连通性

9.2、跟踪路由 traceroute
用来测试 IP 数据报从源主机到达目的主机要经过哪些路由器
Windows 版本
-  
tracert命令 -  
应用层直接使用网际层
ICMP -  
使用了
ICMP回送请求和回答报文以及差错报告报文 
Unix 版本
-  
traceroute命令 -  
在运输层使用
UDP协议 -  
仅使用
ICMP差错报告报文 

9.2.1、实现原理
假设 H1 想要知道到达 H2 要经过哪些路由器
H1 就给 H2 发送 ICMP 回送请求报文
- 该报文被封装在 
IP数据报中 
IP 数据报中首部生存字段 TTL 的值被设置为 
    
     
      
       
        1
       
      
      
       1
      
     
    1
该 IP 数据报到达 R1 后其生存时间减 
    
     
      
       
        1
       
      
      
       1
      
     
    1 结果为 
    
     
      
       
        0
       
      
      
       0
      
     
    0
R1 丢弃该数据报。并向发送该数据报的源主机 H1 发送 ICMP 差错报告报文
- 类型:时间超过
 

H1 继续发送下一个封装有 ICMP 回送请求报文的 IP 数据报
- 其首部中生存时间字段 
TTL的值被设置为 2 2 2 
…

H2 解析该 ICMP 回送包请求报文的 IP 数据报
- 发现其内部封装的时 
ICMP回送请求报文 

10、小结




















