979 字
5 分钟
ICMP
Internet Control Manage Protocol
报文格式
ICMP报文的种类有2种,即ICMP差错报告报文和ICMP询问报文。ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码、检验和。接着的4个字节的内容与ICMP的类型有关,最后面是数据字段,其长度取决于ICMP的类型,下表给出了几种常用的ICMP报文类型
数据字段
所有的ICMP差错报告报文中的数据字段都具有同样的格式,如下图所示:
把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段,再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(TCP、UDP)以及运输层报文的发送序号(TCP)。 icmp里包装有问题的分组(的一部分), 然后icmp分组再包在一个新的ip分组
种类

- 差错报文
- 终点不可达
- 路由器找不到目的主机的路由
- 目的主机没有对应的端口
- 事件超过 当路由器收到生存时间为0的数据报时,除了丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文
- 参数问题
- 校验和出错时不发送ICMP报文
- 指上层的语义错误 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文
- 重定向 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(有更好的路由)。
- 源点抑制
- 拥塞控制
- 终点不可达
- 询问报文
- 回送请求和回答 测试目的站是否可达以及了解其有关状态
- 时间戳请求和回答 时间戳请求与回答可用于时钟同步和时间测量。
不应发送ICMP差错报告报文的几种情况
- 对ICMP差错报告报文,不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
- 对具有多播地址的数据报,都不发送ICMP差错报告报文
- 对具有特殊地址(127.0.0.1 | 0.0.0.0)的数据报,不发送ICMP差错报告报文
应用
Ping
ping使用回送请求和回答来实现
Traceroute
traceroute程序开始时发送一个TTL字段为1的UDP数据报(选择一个不可能的值作为UDP端口号),然后将TTL每次加1,以确定路径中每个路由器。每个路由器在丢弃UDP数据报的时候都返回一个ICMP超时报文(如:ICMP time exceeded in-transit, length 36),而最终主机则产生一个ICMP端口不可达报文(如: ICMP 74.125.128.103 udp port 33492 unreachable, length )。 对每个TTL,发送3份数据报,并且计算打印出往返时间。如果5秒内未收到任意一份回应,则打印一个星号。 需要注意的是:
- 并不能保证现在的路由就是将来所采用的路由;
- 不能保证
ICMP报文的路由与traceroute程序发出的UDP数据报采用同一路由; - 返回的
ICMP报文中信源的IP地址是UDP数据报到达的路由器接口的IP地址。
