我们前面系列文章提到过,电脑A给电脑B发信息,电脑A需要知道电脑B的IP地址,mac地址等才能正确的把信息发送给电脑B。
上面DNS章节我们讲到,DNS协议可以通过域名查询到IP。
1. 那么电脑A怎么获取电脑B的mac地址呢?
答案是我们可以设计一套可以通过IP查询MAC地址的协议,这套协议,我们把它叫做地址解析协议---Address Resolution Protocol,简称ARP。
ARP协议为广播协议,统一向局域网内所有机器发送请求,接收方如果发现请求的目的IP与自己的IP相同,则返回接收方的IP以及MAC地址,否则忽略。
2. ARP的工作原理
1)局域网内部通信
① A要向C发送信息,但是不知道C的MAC地址,于是系统程序用IP地址在本地的缓存里面找有没有对应的MAC地址;
② 如果有,系统程序返回MAC地址后结束查找MAC地址;否则,A将按照ARP协议格式组织报文,向局域网所有的主机询问目的IP是谁的;
③ 如图,ARP消息报文到达B,先检查MAC地址,发现目的MAC地址是FF:FF:FF:FF:FF:FF,知道是ARP消息,来询问问MAC地址的,于是取出消息中目的IP地址与本机IP地址进行对比,发现不匹配,丢弃消息;
④ 如图,ARP消息报文到达C,先检查MAC地址,发现目的MAC地址是FF:FF:FF:FF:FF:FF,知道是ARP消息,来询问问MAC地址的,于是取出消息中目的IP与本机IP地址进行对比,发现匹配,这个时候C将执行两个动作:
第一、为了方便后面C向A回复消息,C会将A的MAC地址与A的IP地址形成记录在本地保存起来;
第二、C会将自己的MAC地址返回给A;
⑤ A收到C的回复,会将C的MAC地址与C的IP地址形成记录缓存起来;方便后面继续跟C交互。
以上,为局域网内ARP的运作原理。
其中,源主机与目标主机都要缓存对方的MAC地址与IP地址的关联记录;原因是后面源主机与目标主机极有可能进行很多交互,为了不让每次交互都查询MAC地址,缓存在本地是最佳的方案,如果不缓存,每次都ARP泛洪(广播),浪费网络资源(请求要在网络上传输,占用了带宽),影响请求效率(ARP广播需要时间);值得注意的是:MAC地址与IP的缓存不是永久的,存在有效期,这样做的好处是减少了过多的记录缓存,避免占用过多系统资源,其次,IP地址可能会变更与主机的绑定,如果一直缓存,一旦IP变更绑定,将无法再正常访问目的主机。
2)跨网段访问
如上图:A和C分属不同的局域网,ARP的消息只会在局域网里面进行广播;为了避免广播风暴,消息在其他局域网继续广播,我们会在两个网络之间架设一个设备,这个设备拥有隔离广播的作用,并路由来往于两个网络的消息,这样的设计叫做网关;A和C要想进行通信,我们要求“连接两个网络的设备”必须具有路由功能并只转发目的MAC地址是自己的消息等功能。这样的设备叫做网关设备。
题外话:网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。网关对收到的信息要重新打包,以适应目的系统的需求。
网关是一个功能,而不是一个设备,只要一个设备在网络中充当网关角色,那么它就是网关设备;生活中最经常出现的两种网关就是,用于智能家居的蓝牙网关,和以太网网关路由器。
ARP其实属于局域网协议,这种情况目的MAC地址是如何设置的,消息是如何进行传输的呢?
跨网段访问ARP分三个阶段:
① 广播获取网关地址,源主机将消息发送给网关;
② 网关ARP广播获取目的主机MAC,网关重新封装数据,将消息发送给目的主机;
③ 目的主机回复源主机消息。
第一阶段:
① 主机A数据经过网络层的程序封装加入IP地址后,继续向下封装,将数据链路层的MAC地址封装,但是发现没有主机C的MAC地址,于是在本地ARP表里查询,这里假设没有缓存的主机的MAC地址,判断主机C是否和主机A在同一网段;发现主机C的IP不是本网段IP需要跨网段传输,跨网段相当于要出本局域网的这个大门,所以需要找网关,查询ARP表,发现没有网关MAC地址信息;
题外话:网关IP地址从哪里来呢?默认网关或手动设置。
下图为Windows的网关地址设置:
② 主机A先把要发送的信息放入缓存中,然后在本局域网内发送ARP报文请求网关的MAC地址;
ARP消息内容如下:
③ 交换机1将该帧源mac和接口port信息保存到MAC地址表,然后对该广播报文进行泛洪操作;
④ 网关(192.168.1.0)收到广播数据包后,先将主机A的MAC与接口保存到MAC地址表(MAC地址与端口port的对应记录表)中,同时也会保存主机A的MAC与IP到ARP表里,然后对比该报文的目的IP是否为自己,网关发现请求的正是自己的MAC地址,于是网关将自己的MAC地址封装在回复报文里进行回复,内容大概是“我是网关,我的MAC地址是xxxxxxxxxxxxxxxxxx”;
⑤ 网关(192.168.1.0)的回复信息到达交换机1后,交换机1将“网关MAC”与接口信息保存到自己的MAC地址表中,并根据回复信息的目的MAC,在MAC地址表里面找到对应的接口,将信息转发给主机A;
⑥ 主机A收到网关的回复报文后,将网关(192.168.1.0)的MAC地址与IP保存入ARP表里面,将缓存的数据拿出封装,目的IP为主机C的IP;目的MAC为本网段网关(192.168.1.0)的MAC地址(跨网段通信,目的MAC地址统一写本网段内网关的MAC地址,意思是帧交给网关就完事了,由网关进行下一步转发,就没主机的事了,目的MAC写网关即可),重新封装好后进行重新发送。
请求的数据包格式:
第二阶段:网关(192.168.2.0)ARP广播获取目的主机MAC,网关重新封装数据,将消息发送给目的主机C。
① 主机A发送的消息到达网关(192.168.1.0),但是网关(192.168.1.0)发现这个数据包的MAC地址是自己的,但目的IP地址不是,所以就需要进行路由(查询一条前行的道路),从路由表查找通向192.168.2.0网段中主机192.168.2.1的路由信息(即主机C的路由信息),找到后,把消息的目的MAC地址改成网关(192.168.2.0)的MAC地址,然后网关(192.168.1.0)把信息转发给网关(192.168.2.0)。
② 网关(192.168.2.0)发现这个数据包的MAC地址是自己的,但目的IP地址不是;然后查询ARP表,如果存在,就直接替换消息的目的MAC地址,并进行转发,否则网关(192.168.2.0)将发送ARP报文进行问询主机C的MAC地址;
ARP报文格式:
③ 交换机2将主机A的MAC与接口保存到MAC地址表中并泛洪该广播报文;
④ 主机C接收到ARP请求报文,发现是问自己的,将主机A的MAC与IP保存到ARP表中并回复一个ARP Reply报文;
⑤ 交换机2接收到主机C的回复消息,将主机C的MAC与接口保存到MAC地址表中并转发该单播回复报文;
⑥ 网关(192.168.2.0)收到主机C的ARP回复后,将主机A的MAC与IP保存到ARP表中然后将该数据包的目的MAC地址信息封装为主机C的MAC地址、源MAC地址换成网关(192.168.2.0)的MAC地址,加上FCS,封装好后进行发送;
数据报文格式:
题外话:思考下,为何在这里要把源MAC地址换成网关呢?
两个物理接口必须在同一个域。
⑦ 交换机2查询对应目的MAC地址在哪个端进行口转发然后转发;
⑧ 主机C收到数据包进行解封装,将数据包的源MAC地址(网关的MAC地址)和主机A的IP保存到ARP表里,然后处理数据,发送过程完成;
第三阶段:回复消息(这个就简单了,因为刚才的请求已经在对应的节点建立了对应的关系)
① 主机C收到信息后进行回复,不在同网段就回复给本网段网关,通过交换机2转发给网关(192.168.2.0);
② 网关(192.168.2.0)收到回复后将数据包转发给主机A的对应网关(192.168.1.0),网关(192.168.1.0)查询表,转发给交换机1,再通过交换机1转发到主机A的手中;
3)ARP协议内容详细格式
4)静态ARP
静态ARP表项是由网络管理员手工建立的IP地址和MAC地址之间固定的映射关系。静态ARP表项不会被老化,不会被动态ARP表项覆盖。
① 短静态ARP表项:手工建立IP地址和MAC地址之间固定的映射关系,未同时指定VLAN和出接口。
② 长静态ARP表项:手工建立IP地址和MAC地址之间固定的映射关系,并同时指定该ARP表项所在VLAN和出接口。
5)动态ARP
动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。
6)代理ARP
对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的 ARP 请求会使用自己的 MAC 地址与目标计算机的 IP地址对源计算机进行应答。
代理ARP就是将一个主机“作为”另一个主机对收到的ARP请求进行应答。它能使得在不影响路由表的情况下添加一个新的Router,使得子网对该主机来说变得更透明化。同时也会带来巨大的风险,除了ARP欺骗,和某个网段内的ARP增加,最重要的就是无法对网络拓扑进行网络概括。代理ARP的使用一般是使用在没有配置默认网关和路由策略的网络上的。
7)ARP欺骗
ARP请求,是以广播的形式发送的,局域网上的所有主机,都可以自主地发送ARP应答消息,并且当其他主机收到应答消息时,不会检测该消息的真实性,就将其记录在本地的“ARP缓存表”中。这样攻击者就可以向目标主机发送伪造的“ARP请求包”(错误的IP地址和MAC地址的映射关系),从而篡改目标主机的本地“ARP缓存表”。
ARP欺骗,可以导致目标主机与网关通信失败,更会导致通信重定向,所有的数据都会通过攻击者的机器,因此存在极大的安全隐患。
8)RARP
反向地址转换协议(RARP:Reverse Address Resolution Protocol) 允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。
假设让我们来实现RARP,我们将:
① 我们规定只有RARP服务器能回复RARP广播信息;
② 制定RARP协议格式;
③ 我们编写程序实现RARP协议。
工作原理:
① 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
② 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
③ 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
④ 如果不存在,RARP服务器对此不做任何的响应;
⑤ 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
- 读者的困惑:感觉上只要IP就能进行通信,不需要Mac地址了?留待大家思考