在这本书数据链路层的部分,提到过ARP技术。
ARP(Address Resolution Protocol)是一种解决地址问题的协议:
以目标IP为线索,用于定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路上时,就可以通过ARP查找下一跳路由器的MAC地址。
ARP仅用于IPv4,IPv6中则有ICMPv6代替ARP发送邻居探索消息。
那么,ARP是如何工作的呢?
其实理解起来很简单?你想要在一个新的班级里,找到一个人,最简单最直率的办法,就是大喊一声“xxx,你在哪?”,对方回应你一句,你们就认识了。
书中给出了这么一张图,介绍了主机之间,ARP的工作流程。
主机A想要知道主机B的MAC地址,就会在链路上进行广播发送一个ARP请求包。这个包里,包含着想要通信的目标主机的IP地址。由于广播的包会被链路上所有主机或者路由器接收,那么也就会被这些节点解析。如果其中某个节点发现,这个请求包里的IP地址就是自己的IP地址,那么该节点就把自己的MAC地址塞入ARP响应包,返还给主机A。
这里也体现了七层网络模型分层的设计,在网络通信中,正因为有ARP协议的存在,所以在网络层中,无需知道对方的MAC地址,只需要用IP就可以了。
和上一弹中提过的DNS缓存一样,如果每次都要进行ARP请求的话,确实会造成不必要的网络流量消耗。通常的做法是将MAC地址缓存一段时间,记录到一个叫做ARP缓存表的东西中。
每次往相同MAC地址发送数据时,查表就行了。如果没查到需要再次执行ARP,那么就清除一下缓存内容。
为什么要这么设计呢?因为如果是发送了一次IP数据报的主机,连续发送多次IP数据报的可能性还是很高的,正如你在班内喊了一声之后,你们俩往往会进行类似朋友的交往。不仅发送ARP请求的能知道对方的MAC,而且接收这个包的目标主机也可以获取源主机的MAC地址。
MAC地址的缓存是有一定期限的,使得MAC地址与IP地址的对应关系即使发生了变化,也依然可以将数据包正确的发送到目标地址。
下图为ARP包格式:
讲到这里,我们会有一种感觉,IP地址和MAC地址,在数据链路层(或者说在一个局域网里),有一个就够了。
有人会觉得,在数据链路层,只要知道MAC地址,就已经知道目的地址是谁了,就不需要IP地址。
或者有人会觉得,只要知道了IP地址,即使不做ARP,不知道MAC地址,做一个广播,也可以把数据发送到目的主机。
实际不然,如果说上述场景发生在一个不存在路由器的纯二层网络,确实是如此的。但是一旦涉及到其他的数据链路,这个情况就不难理解。如下图所示:
主机A想要发送IP数据报给主机B时,必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,是无法实现从主机A发送数据报给主机B。此时,主机A必须先发送数据报给路由器C的MAC地址C1。
上述情况分析了只知道MAC地址的情况,接下来我们来看一下不知道MAC,而是用IP。假设MAC地址就用广播地址,那么路由器D也会受到该广播消息,于是路由器D又会将该消息转发给路由器C,导致数据包被重复发送两次。
在以太网中发送IP数据包时,必须要知道“下次要经过哪个路由器发送数据”,这里的下一个路由器,就对应的是MAC地址。
所以,IP地址和MAC地址缺一不可。ARP协议将IP地址和MAC地址的映射进行缓存,避免了发送IP包时次次都要请求。
书中做了一次假设,就是世界上所有网络都只有MAC地址,虽然独一无二,但是即使知道MAC地址,却不知道其所处的位置。每次发送数据,需要向全世界广播,直至网桥学习到如何发送到目的地址。可想而知,网络流量之巨。而且网桥需要维护一张巨大的表格,其中记录到学习到的MAC地址。
有了ARP协议,发送IP包获取MAC地址,自然就有如果在得知MAC地址的情况下,定位IP信息。这个协议就是RARP(Reverse Address Resolution Protocol)。应用场景是,将打印机服务器等小型嵌入式设备接入到网络时,就经常会用的到。
我们的个人电脑,可以使用DHCP自动分配获取IP地址。然而,嵌入式设备则会遇到没有任何输入接口或者无法通过DHCP动态获取IP地址的情况。
实现RARP需要部署RARP服务器(读到这里读者可能会觉得好麻烦,实际上RARP已经逐渐退出舞台了),这个服务器中注册了设备的MAC地址和IP地址。如下图所示,主机A先发送一个RARP请求,帧格式接近于RAP,大致内容就是“我的MAC地址是****,请告诉我我的IP地址应该是什么”。RARP服务器接收到该帧后,回复一个“MAC地址为****的设备,IP地址为++++”。设备就根据这个信息,设置自己的IP地址。
另一个要说的就是代理ARP。通常ARP包会被路由器隔离,但是采用代理ARP的路由器,可以将ARP请求转发给邻近的网段。
这其实也是一个退出历史舞台的概念,因为现在路由器连接多个网络时,在每个网段上定义各自的子网,从而进行路由控制。而那些不支持设定子网掩码的老设备,不使用代理ARP的话,优势就无法更好地使用网络。