-
ICMP报文分为两种:
1、ICMP差错报告报文
2、ICMP询问报文 -
ICMP差错报告报文
1、终点不可达:路由器或主机不能交付数据报时就向源点发送终点不可达报文
2、时间超过:当路由器收到生存时间为0的数据报时,丢弃该数据报,还要向源点发送时间超过报文。
当终点在预先规定的时间内未收到一个数据报的全部报片时,会丢弃已收到的数据报片,并向源点发送时间超过报文
3、参数问题:当路由器或目的主机收到的数据报的首部有字段不正确时,就丢弃该数据报,并向源点发送参数问题报文
4、改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给别的路由器(更好的路由)
,详情见下 -
改变路由报文
互联网上的主机
自身也有一个路由表
当主机要发送数据报时,首先查找主机自己的路由表
,确定从哪个接口将数据报发送出去
由于互联网中的主机数量
远大于路由器的数量
,考虑效率问题,主机一般不和连接在网络上的路由器定期交换路由信息
主机刚开始工作时,一般都在主机路由表
中设置一个默认路由器的ip地址
,主机发出所有的数据报都先被传送给这个默认路由器
此默认路由器
知道到每一个网络的最佳路由
(通过和其它路由交换信息可以得到)
若默认路由器发现主机发往某个目的地址的数据报的最佳路径
应当经过另一个路由器
而不是默认路由
时,就向主机发送改变路由报文
于是主机就在其路由表中增加一个项目:到xx目的地址应经过路由器R(而不是默认路由器) -
ICMP差错报告报文格式
0 ~ 3 byte:统一的格式
4 ~ 7 byte:取决于ICMP差错报告报文的类型
其余部分:就是ICMP差错报告报文的 数据部分
,由需要进行差错报告的 分组的首部
和 分组数据字段的前8个字节
提取出来,作为ICMP差错报告报文(ip数据报的数据字段前8个字节是为了得到 运输层的端口号
和 运输层报文的发送序号
)
-
不需要发送ICMP差错报告报文的几种情况
1、不需要为ICMP差错报告报文发送ICMP差错报告报文
2、为分片数据报的第一个分片
发了,后续分片
都不用发了
3、多播地址的数据报
4、特殊地址的数据报(如 127.0.0.0 或 0.0.0.0) -
ICMP询问报文
1、回送请求和回答 报文
由主机或路由器
向特定目的主机
发出的回送请求报文
,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文
此种报文一般用于测试目的站是否 可达
2、时间戳请求和回答 报文
请求某台主机或路由器
回答当前的日期和时间
时间戳回答报文
有一个32bit的字段存放从1900年1月1日
到当前时刻
一共有多少秒
主要用于时钟同步和时间测量