Internet控制报文协议
与IP结合使用,以便提供与IP协议层配置和IP数据包处置相关的诊断和控制信息。
常被人为是在网络层,但实际上该协议通过ip协议传输。但确切的说他位于网络层和传输层之间的。
ICMP报文可有网络层,传输层或者用应用触发执行。并不能为ip层提供可靠性,只能表明某些类别的故障和配置信息。
丢包不会触发ICMP报文。
报文
ICMP IPv4上面的图貌似不准确啊。
头部属于IP头部,然后后面跟地址之类的啊。
然后才是ICMP报文
ICMP报文使用的是IP报文封装,在IP头部协议号为1。
IP报文的数据部分为ICMP报文。
其种类型和代码从下表中查询:
当发送一个ICMP差错报文,它包含了一个完整的源自引起差错的数据报IP头部副本(即生成导致错误的数据报的IP头部,包括任何IP选项),再加上原始数据报的IP有效载荷区中的任何其他数据,同时要确保生成的IP/ICMP的数据报的大小不会超过一个特定的值。IPv4,这个值是576字节。
ICMP报文处理
当接收到ICMP报文时,如果是请求类的报文被操作系统自动处理。
而差错类报文则传递个传输层处理。
当接收到ICMP重定向报文时,主机更新路由表。
ICMP差错报文
尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下:
ICMP差错报文不会产生ICMP差错报文(出IMCP查询报文)(防止IMCP的无限产生和传送)
目的地址是广播地址或多播地址的IP数据报。
作为链路层广播的数据报。
不是IP分片的第一片。
源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。
上面的规则都是为了防止ICMP数据包无限重复。
限制生成ICMP差错报文的原因是限制生成所谓的广播风暴。
重定向
当一个路由器收到一个来自主机的数据报,当他发现发送方应该有更好的投递或者跳转ip时,会向发送方发送重定向报文,并将数据报投递到正确的路由。
主要是在一个子网中存在两个路由器,而发送方第一跳的路由不是最佳选择时,路由器会发送该报文。
发送方接收到重定向报文,然后更新自己的路由表。
重定向报文
重定向报文ICMP查询报文
目前唯一保存下来的广泛使用的ICMP查询/信息类报文是回显请求/应答报文,通常称为ping,以及路由器发现报文。
ICMP协议不像传输层协议那样有端口号。
所以区别不同进城的ping。
linux中,发送进程的进程ID通常被放置在标识符字段。
window中不知道放的是什么玩意。
在window下两个cmd进行ping
window ping
该字段放的应该是区分线程的,(同一个cmd不同时间的ping不同,因为ping以后fork了一个单独的进城)。
图中66,和61,为发送顺序,接受时会带有该序号。
还可以ping广播地址,能用于快速广播本主机系统的ARP表。
响应的目标系统位于同一个子网内时,将会触发ARP请求查找请求发送者的链路层地址。这么做,将会在每个响应者和请求发送者之间交换。这也导致回显请求报文的发送者学习所有响应者的链路层地址。
IPv4的路由器发现
也是采用ICMP来实现的。
TTL= 1 ,这样路由器会返回超时。
路由器发现的主要目的是让一台主机学习到它所在的本地子网中的所有路由器,因此它能够从中选择一台作为默认路由
网友评论