前面介绍了网络层IP协议,并且补充一点,IP协议与上面的运输层的连接是通过ICMP、IGMP协议来完成的,而与下面数据链路层的连接是通过ARP协议来完成的。
网络层使用的是IP地址,而在数据链路层传输数据帧时,使用的是硬件地址也就是MAC地址。那么很容易想到,我们要将IP地址转换到MAC地址,那么这里用的就是地址转换协议ARP。
在这里,我想回答一个面试非常经典的问题:
为什么有IP地址还要MAC地址
1.IP地址灵活性高,但随之而来衍生的问题是有可能IP被盗用。假设主机A和主机B通信,主机A知道主机B的IP地址,那么当然是可以给B发送信息的,但是如果主机B搬走了,不在这个局域网了。主机C搬到主机B所在的网络,并分配到了主机B的IP地址,那么A给B所发的消息就跑到主机C上去了,可见只由软件决定的IP地址并不能保证通信的安全性。
2.有MAC地址是因为MAC地址是写在网卡里面的,是硬件的一部分,所以在具体的数据即将落实到具体的主机的时候,我们选用的是MAC地址,这样IP地址和MAC地址结合起来的好处是,在软件上分配IP,在互联网中按照IP协议来转发分组直到找到想要的局域网开始将IP首部丢掉,开始变为数据帧在局域网中传输。
试想一下:同样是上面那种情况,盗用IP的情况就不会存在了,到了局域网找到了指定IP的主机,此时对比MAC地址,如果MAC地址也相同说明你就是我要通信的主机。
因为IP地址可以出现二次复用的,MAC地址不能出现重复的,每一个MAC地址都是全世界唯一的编码。
所以简要回答下上面的问题:单一的IP地址并不足以保证通信的有效性,IP+MAC可以保证。
那么,IP地址是如何与MAC地址对应起来的,因为是从源主机端要获取目的主机的MAC地址,这就是地址转换协议ARP所做的事。
地址转换协议ARP
首先IP地址是48位,MAC地址是32位,且IP地址可以重复分配,MAC地址却是全球唯一的,所以不可能存在简单的IP地址与MAC地址一对一映射的关系。地址解析协议ARP解决这个问题的方法就是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或者动态删除)。
主机A向本局域网上的主机B发送IP数据报:(步骤)
1.主机A查询ARP高速缓存中是否有B的IP地址,如果有,查找相应的硬件地址,将硬件地址写入MAC帧。如果没有B的IP地址,主机A主动运行ARP。
2.主机A的ARP进程在本局域网上广播一个ARP分组,里面的内容有主机A的IP地址,主机A的MAC地址,想要查询的主机B的IP地址。
3.本局域网所有主机运行的ARP进程都收到该ARP分组。
4.本局域网上除了B以外的主机收到都没有反应,因为想要查询的IP地址不是自己,主机B收到ARP分组做出反馈,回应一个ARP响应分组,里面的内容有主机B的IP,主机B的MAC地址。
5.主机A收到主机B的ARP响应分组,在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。
如果不使用高速缓存的话,每一次通信,都要发送ARP分组广播到局域网,这显然是非常麻烦的。
高速缓存中的每一个映射地址项目都有生存时间,超过生存时间的项目就要被删除。
注意上面说到这是本局域网上的ARP高速缓存的条目的建立和更新,那么如果不是在同一个局域网呢,这种情况非常常见。那么这种情况是先找到需要本局域网需要转发出去的路由器的硬件地址,然后加入IP数据报,然后到了路由器,查找路由表,通过下一跳跳到下一个路由器或者局域网,最终达到目的主机,获取到了目的主机的MAC地址。
为什么有了mac地址还需要IP地址
仅仅凭借mac地址无法判断主机所在的位置,假设同一台笔记本在第一天和第二天去了A,B两个城市,那么到这台笔记本的路由就会发生变化。但是主机的mac地址还是一样的,仅仅通过mac地址无法区分出主机是在A地还是在B地,所以需要IP地址。