ICMP协议
ICMP
是“Internet Control Message Ptotocol”
的缩写。它是TCP/IP
协议族的一个子协议,用于在IP
主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。在网络中经常会使用到ICMP
协议。例如经常用于检查网络不通的ping
命令,这个ping
的过程实际上就是ICMP
协议工作的过程。还有跟踪路由的trancert
命令也是基于ICMP
协议的。
Ping命令
ping.exe的原理
向指定的IP
地址发送一定长度的数据包,按照约定,若指定IP
地址存在的话,会返回同样大小的数据包,当然,若在特定时间内没有返回,就是“超时”,会被认为指定的IP
地址不存在。由于ping
使用的是ICMP
协议,有些防火墙软件会屏蔽ICMP
协议,所以有时候ping
的结果只能作为参考,ping
不通并不一定说明对方IP
不存在。
Ping命令过程
机器A
ping
机器B
同一网段
ping
通知系统建立一个固定格式的ICMP
请求数据包ICMP
协议打包这个数据包和机器B
的IP
地址转交给IP
协议层(一组后台运行的进程,与ICMP
类似)IP
层协议将以机器B
的IP
地址为目的地址,本机IP
地址为源地址,加上一些其他的控制信息,构建一个IP数据包- 获取机器
B
的MAC
地址
IP
层协议通过机器B
的IP
地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络查找这台机器的MAC
。
若两台机器之前有过通信,在机器A
的ARP
缓存表应该有B
机IP
与其MAC
的映射关系;若没有,则发送ARP
请求广播,得到机器B
的MAC
地址,一并交给数据链路层
数据链路层构建一个数据帧,目的地址是IP
层传过来的MAC
地址,源地址是本机的MAC
地址,再附加一些控制信息,依据以太网的介质访问规则,将他们传送出去
机器B收到这个数据帧后,先检查目的地址,和本机MAC
地址对比
符合,接收。接收后检查该数据帧,将IP
数据包从帧中提取出来,交给本机的IP
协议层协议。IP
层检查后,将有用的信息提取交给ICMP
协议,后者处理后,马上构建一个ICMP
应答包,发送给主机A
,其过程和主机A
发送ICMP请求包到主机
B类似(这时候主机
B已经知道了主机
A的
MAC地址,不需再发
ARP`请求);不符合,丢弃。
不同网段
ping
通知系统建立一个固定格式的ICMP
请求数据包ICMP
协议打包这个数据包和机器B
的IP
地址转交给IP
协议层(一组后台运行的进程,与ICMP
类似)IP
层协议将以机器B
的IP
地址为目的地址,本机IP
地址为源地址,加上一些其他的控制信息,构建一个IP
数据包- 获取主机
B
的MAC
地址
IP
协议通过计算发现主机B
与自己不在同一网段内,就直接交给路由处理,就是将路由的MAC
取过来,至于怎么得到路由的MAC
地址,和之前一样,先在ARP
缓存表中寻找,找不到可以利用广播。路由得到这个数据帧之后,再跟主机B
联系,若找不到,就向主机A
返回一个超时信息。
Ping结果
Request timed out
:对方与自己不在同一网段内,通过路由也无法到达;对方已关机,或者网络上没有这个地址;对方存在,不过设置了ICMP
数据包过滤;错误设置IP地址Destination host Unreachable
:自己未设定默认路由,对方跟自己不在同已网段。Bad ip address
:没有连接到DNS
服务器,无法解析IP
,也可能是IP
不存在Source quench received
:对方或中途服务器繁忙而无法应答Ping 127.0.0.1
:如果ping
不通,则表明本地址TCP/IP
协议不能正常工作
ARP协议
什么是ARP协议?
网络层以上的协议用IP
地址来标识网络接口,但以太数据帧传输时,以物理地址来标识网络接口。因此我们需要进行IP
地址与物理地址之间的转化。对于IPv4
来说,我们使用ARP
地址解析协议来完成IP
地址与物理地址的转化(IPv6
使用邻居发现协议进行IP
地址与物理地址的转化,它包含在ICMPv6
中).ARP
协议提供了网络层地址(IP
地址)到物理地址(mac
地址)之间的动态映射。ARP
协议 是地址解析的通用协议。
工作流程
每个主机都会在自己的
ARP
缓冲区中建立一个ARP
列表,以表示IP
地址和MAC
地址(以太网地址)之间的对应关系。主机(网络接口)新加入网络时(也可能只是
MAC
地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。网络上的主机接收到免费
ARP
报文时,会更新自己的ARP
缓冲区。将新的映射关系更新到自己的ARP表中。某个主机需要发送报文时,首先检查
ARP
列表中是否有对应IP
地址的目的主机的MAC
地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP
数据包,该数据包包括的内容有:源主机IP
地址,源主机MAC
地址,目的主机的IP
地址等。当本网络的所有主机收到该
ARP
数据包时: 首先检查数据包中的
IP
地址是否是自己的IP
地址,如果不是,则忽略该数据包。 如果是,则首先从数据包中取出源主机的
IP
和MAC
地址写入到ARP
列表中,如果已经存在,则覆盖。 然后将自己的
MAC
地址写入ARP
响应包中告诉源主机自己是它想要找的MAC
地址。源主机收到
ARP
响应包后。将目的主机的IP
和MAC
地址写入ARP
列表,并利用此信息发送数据。如果源主机一直没有收到ARP
响应数据包,表示ARP
查询失败。
获取目的端的MAC地址(在一个以太网中)步骤
- 发送
ARP
请求的以太网数据帧给以太网上的每个主机,即广播(以太网源地址填全1)。ARP
请求帧中包含了目的主机的IP
地址。 - 目的主机收到了该
ARP
请求之后,会发送一个ARP
应答,里面包含了目的主机的MAC
地址。