ICMP协议
背景知识:
●在以太网中,数据帧大小最大为1518字节,最小为64字节(由以太网
CSMA/CD决定)
以太网中数据帧的封装格式:
6 6 2 — 4
●IP数据报格式:
其中,较常用“协议”的取值有:
ICMP数据包格式
ICMP协议基于IP协议,ICMP数据包封装在IP数据包内。
ICMP封装格式:
20字节
ICMP数据包的结构:
ICMP头部长度为8bytes。
ICMP查询报文ICMP两种报文形式
ICMP差错报文
检测连通性
ICMP报文作用
提示错误信息
常见ICMP类型、代码值及应用场景:
下面是几种常见的ICMP报文:
1).响应请求
我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。
Ping程序的参数如下:
C:\Users\qich>ping
用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL]
[-r count] [-s count]
[-R] [-S srcaddr] target_name
选项:
-t Ping 指定的主机,直到停止。
若要查看统计信息并继续操作- 请键入Control-Break;
若要停止- 请键入Control-C。
-a 将地址解析成主机名。 -n count 要发送的回显请求数。 -l size 发送缓冲区大小。
-f 在数据包中设置“不分段”标志(仅适用于 IPv4)。 -i TTL 生存时间。
-r count 记录计数跃点的路由(仅适用于 IPv4)。 -s count 计数跃点的时间戳(仅适用于 IPv4)。 -S srcaddr 要使用的源地址。
使用Ping 程序时,如果指定了参数-f (不分片),则参数-l 后,可以指定的最大发送缓冲区大小为1472。
1500(IP MTU)-20(IP 头部大小)-8(ICMP 头部大小)=1472
2) 需要进行分片但设置了DF 标记位
在封装UDP 的IP 数据包中,一般支持分片。
以太网中IP 数据包的MTU 为1500,这与初期设备的接收缓存小有关。当发送数据包的大小大于MTU 时,需要对该数据包进行分片。
发生ICMP 不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP 首部又设置了不分片(DF )的标志比特。如果某个程序需要判断到达目的端的路途中最小MTU 是多少—称作路径MTU 发现机制(PMTUD ),那么这个差错就可以被该程序使用。
这种情况下的ICMP 不可达差错报文格式如下图所示。在第2个32bit 字中,16~31bit 可以提供下一跳的MTU 。
ICMP 报文中的IP 首部和原始IP 数据报中数据的前8字节,也成为伪首部
类型(3)
代码(4)
检验和
8
字节 下一跳网络的MTU
未用(必须为0)
IP 首部(包括选项)+原始IP 数据报中数据的前8字节 (
信息。
Juniper NetScreen防火墙中根据五元组(源IP、目的IP、协议、源端口、目的端口)匹配时,将根据伪首部信息进行匹配,关联现有会话,然后放行。
相关case处理结果为:
数据包举例:
3)ICMP超时差错报文
4)ICMP端口不可达差错报文
下面各种情况都不会产生ICMP差错报文:
1)ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)
2)目的地址是广播地址或多播地址的IP数据报
3)作为链路层广播的数据报
4)不是IP分片的第一片
5)源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。
附:ICMP类型、代码取值表