arp协议属于OSI模型第二层(数据链路层)
计算机实现网络通信在数据链路层发送数据帧(链路层数据包)实现通讯。而数据帧要发送到目标计算机需要知道,发送端的ip地址和mac地址还有接收端的ip地址和mac地址。
那么问题来了,发送端能很简单的获取到发送端的ip地址和mac地址,以及接收端的ip地址,而接收端的mac地址最开始是不知道的,而arp协议就是为了解决这个问题的,它能通过接收端的ip地址解析到mac地址。
然而,arp协议是属于数据链路层的协议,如果发送端和目标端的主机都在同一个网段,我们则很好理解,其过程如下:
发送端发送数据帧前检查是否拥有接收端的mac地址,如果没有,则启动arp,先检查缓存ip-mac表中是否有接收端的mac地址,如果有则直接拿来即用,如果没有则在本网段(局域网)广播arp包,本网段各计算机都收到arp请求,从发送来的数据中检查请求过来的ip地址与自己是否一致,如果不一致,则丢弃,如果ip一致,则单播返回mac地址给请求的计算机,发送端便获取到了接收端的mac地址,接收到接收端的mac地址它还会缓存一份,用于下次拿来即用。
那么如果请求端和目标端的主机不在同一个网段呢?arp广播的数据是被路由阻断的,不能跨到不同的网段进行广播的,因为这样广播会导致广播数据泛滥。
不同网段的获取mac地址过程如下:
原文链接:
假设主机A(135.24.25.23)第一次和不同网段的主机C(135.24.52.123)通信:
A封装好要发送的信息,在要写“收件地址”时,
A会用子网掩码进行计算先判断B和A自己在不在同一个网段,这时候A知道了B和自己不在一个网段,
这时候,A知道该用网关把自己的数据传递给C,所以A会发送一个ARP包来获取网关的MAC地址,
网关收到ARP包后,把自己的MAC地址封装在ARP包中,发送给A,
A封装报文,目标MAC地址写网关的MAC地址,
网关收到报文,发现是给自己发的,就开始解包,解开之后,发现是给另一个网段的主机发送的,
此时如果网管本身就是路由器就直接把数据报文发送给下一跳路由器,如果网关是普通的PC,就发送给路由器,由路由器发送给下一跳路由器,目标MAC写下一跳路由器的MAC地址,
历经千辛万苦,报文终于到达C的主机的路由器,路由器发送报文到C所在网段的网关,
C网段的网关解包之后发现不是给自己,而是给自己网段内的C主机,就发送报给给C
总结:如果不在同一个网段,则请求端拿到的目标端的mac地址其实是它网关的mac地址,将数据帧给到网关再进行下一跳转发,下一跳同样在自己的网段寻找到目标主机mac地址或再找到下一跳mac地址。