在学习IP协议之前,必须要弄懂IP地址与硬件地址的区别。
下图说明了这两种地址的区别,从层次的角度讲,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址。(IP地址是用软件实现的)
在发送数据的时,数据从高层下到低层,然后才到通信链路上传输。使用IP地址的IP数据报一旦交给数据链路层,就被封装成MAC帧了,MAC帧在传输时使用的源地址和目的地址都是硬件地址,这两个硬件地址都被写在MAC帧的首部了。也就是说,数据链路层只会用硬件地址来定位主机,它看不见IP地址了。
各种电子设置都会有个mac地址,它就是硬件地址,比如
设备中在网卡在出厂的时候就会被设定mac地址,它长48位,也就是6个字节,如上图中的3c:22:fb:86:0a:12,一般来说,mac地址分成两个部分,前24位表示厂商的编号,后面24位则是厂商给网卡的编号
我们上网时,只会记住域名,比如我们在浏览器上输入http://www.baidu.com,网络层只识别IP地址,DNS帮我们将域名转换为IP地址,数据链路层只识别MAC地址,那么怎么把IP地址转换为MAC地址呢?这就需要使用到ARP协议了。
当主机A要向本局域网上的主机B发送IP数据报时,如果A在缓存中查找不到B的mac地址:
1、A在本局域网上广播发送ARP请求,大致就是我的IP地址是XXXX,mac地址是XXXX,我想知道IP地址为XXXX的主机的mac地址
2、本局域网上的所有主机都会收到这个ARP请求
3、主机B的IP地址与ARP请求中要查询的IP地址一致,就收下这个ARP请求,然后向主机A发送ARP响应,并且在响应中写下自己的mac地址。其余的主机IP地址不一致,因此就不会理会这个ARP请求
4、主机A收到主机B的响应后,就知道主机B的mac地址了。主机A也会将主机B的mac地址写入其ARP缓存中,这样下一次查缓存就能直接知道B的mac地址了,不需要通过ARP协议来获取,加快速度
每个主机上都会有ARP高速缓存,这样能加快mac地址的查询。
注意:ARP只是解决了同一个局域网上的主机或路由器的IP地址与mac地址的映射问题。如果要找的主机和源主机不在同一个局域网上,是无法直接查到另一个主机的mac地址的。
如上图,假设主机A和路由器组成一个局域网A,主机B和路由器组成另一个局域网B,主机A和主机B分别在不同的局域网内。主机A要向主机B发送一条IP数据报,但A不知道B的mac地址,但A和B也不在同一局域网内。
A先要将数据发给路由器,所以A先要查询路由器的MAC地址,查到后,发送MAC帧给路由器,路由器再发送数据给B,由于路由器和B是在同一个局域网内,所以路由器能查到B的mac地址,最终B成功地收到了A的发送数据。
回顾最上面的一张图,我们知道了,mac帧的首部中保存的目的mac地址是会经常变化的,因为一般的数据传输都不会只是在本局域网内。IP数据报中的目的IP是一定不会变的。
还有一个小疑问,主机A通过路由器向另一个局域网中的主机B发送消息,连接两个不同局域网用的是同一个路由器,路由器有不同的端口,每个端口会有不同的IP地址和mac地址,所以才能一个路由连接在不同的局域网中