技术编程浅谈ARP地址解析协议


今天跟大家聊一聊你们认为最熟悉又是最陌生的ARP地址解析协议 , 现在网络都是 Ethernet , 在这个环境中 , 我们的 PC router 三层设备都包含 MAC IP 地 址 。
一、ARP的简单介绍
在以太网环境中 , 我们要发送帧 , 帧要添加SD( 源目,下面统一说成SD)MAC 地址信息 , 通信的时候 , 不关注 MAC 地址是什么 , ping IP 地址 , 很多情况下 S 和 D 通信的时候 S 知道 D的 IP 地址 , 不知道MAC 地址是不能通信的 , 因为在 Ethernet 环境中将成帧(成帧 我们的数据帧能够成功的被封装) , 如果不知道 MAC 地址 , 那么 MAC 地址帧头的第一个字段没有办法填写 , 所以通信的时候 , 不但知道对端的 IP 地址 , 还要知道对端 MAC 地址 。
当PC 发送一个数据包去往目的节点的时候 , 回做一个判断自身的 IP 地址和目标 IP 地址是否在同一个自网段内 , 使用自身的掩码和目的 IP 地址做一个云运算 , 得出网络号和自身的网络号对比 , 一致代表在同一个网络内或者广播域内 , 这个时候可以使用对端 MAC 地址做数据封装 , 不在同一网络内 , 那么就检查是否指定网关 , 去查看网关的 MAC 地址信息 , 因为去往外网的时候目的 MAC 地址必须是网管的 , 否则出不去 , 因为 router 收到 MAC 地址为自己的接受接口地址的时候才会拆包 , 获得 3 层查 DIP , 做转发 , 这就是 PC 对待网络内 网络间通信差异化处理 。
还有一种可能 , 就是 PC 要访问外网节点 , 并没有指定网关 , 那么可以尝试解析对端的 MAC 地址 , 只要通过 Ethernet 接口发送数据 , 我一定要根据下一跳 IP 地址在 ARP 表中找对应的表项, 情况有以下两种:
找到:直接使用该表项的地址信息填充 MAC 字段 ,
没有找到:发送 ARP 请求来解析 ,
在同一网络内 , 我的下一跳就是目的地;不在同一网络内 下一跳就是网关 。 当两来主机在同一网络内的时候直接针对目的 IP 做 ARP 检查 , 要访问外网的时候指定网关 , 对网关做 ARP 地址检查 。 ARP请求广播 , 应答为单播 , 那什么情况下发送ARP请求呢?就是在已知目的主机 IP , 解析目的主机MAC 地址的时候 , 如下图:
技术编程浅谈ARP地址解析协议
本文插图
可以看到 , ARP 封装一定是封装 Ethernet 帧头 。
下面我们就来说看看ARP数据包格式 , 如下图所示:
技术编程浅谈ARP地址解析协议
本文插图
Hardware type(硬件类型)表示硬件地址类型 , 一般为以太网
Protocol type(协议字段) 三层的协议信息
Hardware length (硬件地址长度)MAC 地址多少字节 ,
Protocol length(协议长度) 3 层地址长度
Operation code (操作代码) 1 是 request 2 是 reply
二、代理 ARP 和免费 ARP
代理 ARP 全称是 Proxy ARP, 在路由器、多层交换机、防火墙的网关接口使用 , 那么代理 ARP 是怎么工作的呢?如:PCA---SW1---R1---SW2---PCB , PCA 是没有配置网关的老式电脑 , 步骤如下:
(1)判断 PCB 和自身的 IP 地址是否属于同一个 IP 子网段 , 然后
(2)PCA 直接针对 PCB 的 IP 地址做 ARP 解析 , 条件如下:
ARP 的请求者和被请求者是否属于同一个网络
R1 需要拥有去往被请求者的路由
接口开启代理 ARP
这时 R1 会伪装成 PCB 代替 PCB 向 A 返还 ARP 应答、免费 ARP全称是IP gratuitous-arps , 通过 DHCP 来获取一个 ip 地址 , 同时发送免费 ARP , 免费 ARP 数据包是主机发送 ARP 查找自己的 IP 地址 。 那么免费ARP有那么作用呢?如下:
(1)验证 IP 是否冲突一个主机能够通过它来确定还有一个主机是否设置了同样的 IP 地址 。 发送主机并不须要一定收到此请求的回答 。 假设收到一个回答 , 表示网络中存在与自身 IP 同样的主机 。 假设没有收到应答 , 则表示本机所使用的 IP 与网络中其他主机并不冲突。


推荐阅读