网络设备想要发送数据到另一台设备是,不仅要知道对方设备的IP地址,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须要包含目的MAC地址,因此发送数据的那一台设备必须获取到目的MAC地址。通过目的IP地址而获取目的MAC地址的过程是由ARP协议来实现的。
数据的封装过程
PC1首先在应用层产生数据 data;
然后传输层在应用层的基础上封装TCP/UDP协议,产生数据段;
网络层在传输层的基础上封装IP 地址(源IP地址 192.168.1.1 和目的IP地址 192.168.2.1 | TCP | data);
数据链路层在网络层的基础上封装MAC地址(即:源MAC地址 AA 目的MAC地址 BB | 源IP地址 192.168.1.1 目的IP地址 192.168.2.1 | TCP | data);
物理层:将PDU()转换成比特流(bit)。
网络层中封装的封装的的源IP地址和数据链路层中的MAC并不是完全对应的关系,为避免记混,可以认为目的IP地址是数据最终要到达的地方的IP地址;目的MAC地址是下一站要到达的地方的MAC地址。
路由器的工作原理
PC1传来的数据到达路由器:
1:路由器会先查看自己的缓存表中是否存在PC1的相关信息;再对数据帧中的目的MAC地址进行解析,判断是否是本接口的MAC地址,如果不是就直接丢弃;如果是就进行解封装。
2:路由器查看数据中的目的IP地址,查看该IP地址是否和路由表中的信息相匹配,如果不匹配,就直接丢弃然后返回ICMP错误信息;如果匹配成功,就将数据路由到相对应的路由器的接口,再进行对帧头帧尾的封装。
3:检查ARP缓存表中是否存在下一跳的MAC地址,如果有就重新封装再进行转发;如果没有,就发送ARP请求广播报文请求获取下一跳的MAC地址,并记录到ARP缓存表中, 再重新封装数据帧发送出去。
ARP请求和响应:
ARP请求报文 (request)
PC1不知道PC2的MAC地址,因此要发送ARP广播请求报文。在数据链路层中产生ARP请求报文:
请求包中:
源MAC地址:AA 目的MAC地址:FF-FF-FF-FF-FF-FF(广播MAC地址,是为了让对方知道可以进行ARP请求在整个网络上传播,该网络所有的主机都能收到这个报文,网关将会阻止该报文发送到其他网络上。);
ARP协议中:源IP地址:192.168.1.1 目的IP地址:192.168.1.254(路由器的网关)
源MAC地址 AA 目的MAC地址 00-00-00-00-00-00
ARP响应报文 (replay)
路由器收到PC1发送的请求报文后,检查到请求报文中的MAC地址和自身的地址相匹配,路由器会将ARP报文中的源MAC地址和源IP地址信息记录到自己的ARP缓存表中,然后通过ARP Reply报文进行响应。ARP Reply报文通过单播传送。
ARP协议中:源MAC地址BB 目的MAC地址 AA
源IP地址 192.168.1.254 目的IP地址 192.168.1.1
ARP代理
广播报文无法被路由器转发,那么目的主机就收不到发送数据的主机的ARP request报文,那目的主机也就无法应答,就需要在路由器上启用代理ARP功能。用ARP代理后,路由器收到这样的请求,会查找路由表,如果路由表中存在目的主机的路由表,路由器将会使用自己与发送数据主机的那个接口的MAC地址来回应这一ARP request。主机A收到ARP reply后,将以路由器跟发送数据的主机的那个接口的MAC地址作为目的MAC地址进行数据转发。则不同网络的网络设备在没有配置网关的情况下,也能够通过ARP代理实现相互通信。