若文章对你有帮助请点个👍👍👍, 表示对我的鼓励, 非常感谢 ❤️❤️❤️
预备知识
- 讨论的的前提在 TCP/IP 协议族中
- 在同一个局域网中,有自己的寻址机制(不是IP地址,而是物理地址,如Mac地址).
- 如果物理地址是 FF:FF:FF:FF:FF:FF, 则表示广播, 要将数据发送给所有PC.
ARP基本原理
ARP 地址解析协议, 主要用的作用就是负责把IP地址转换为数据链路层的地址. 下面拿以太网(Ethernet)来说, 以太网的寻址地址是48位比特.
为什么需要硬件地址(Mac地址) ?
在 TCP/IP 协议族中, 数据在数据链路层传输必须知道目的端的硬件地址才能发送数据. 这里是不能通过IP地址进行寻找的. 而ARP就是为了解决这个问题.什么是硬件地址?
硬件地址就是网络接口的硬件地址, 比如通过ifconfig命令查看, 有一行是ether, 后面跟着的就是以太网的硬件地址, 该地址具有唯一性, 也就是全球没有两个硬件地址是一样的.
ARP实际使用
简单ping一下同一局域网上的另一个台电脑. 比如ping 192.168.1.100. 然后用 WireShark 抓包.(代码: ping 10.232.32.187)
解释上图:
- Dell_fc:bb:ef 向外询问, 谁的IP地址是10:232:32:187, 把你的硬件地址告诉 10.232.32.189(这个是我).
- Dell_4a:0f:28 回复 Dell_fc:bb:ef , IP地址是10:232:32:187的硬件地址在 xx:xx:xx:xx:xx:xx
可以用图来解释上面过程:
假设有如下结构的局域网:
现在PC1 想要向 PC2 发送消息, 但是只知道PC3的IP地址(这里先不管怎么获取IP地址,实际可以提前告知,或者DNS等), 这个时候 PC1 就会发送ARP请求,询问 192.168.0.102 的硬件地址是多少?
ARP请求是广播,而ARP响应是单播.
ARP拓展
在同一个局域网上, 如上述流程. 但是如果两者不在一个局域网中, 那么又该如何进行通信呢? 答案: ARP代理.
ARP代理
本质是路由器代理PC, 在不同的子网中, 必定会有一个路由器进行连接,路由器具有代理ARP的功能.
假设有如下图的网络结构, PC1 想要给 PC3 发送消息, 但是 PC1 不知道PC3 的硬件地址, 所以需要先获取 PC3 的硬件地址.
- PC1 发出寻找PC3硬件地址的 ARP 请求
- 路由器接收到 ARP请求, 根据IP发现某个子网的请求, 则返回自己的硬件地址. 若不是,则根据IP地址转发.
- PC1 接收到 “认为” 是PC3的硬件地址, 实际是路由器的硬件地址.
- PC1 开始发送数据给PC3, 但是数据链路层封装的目标硬件地址是路由器的.
- 路由器接收到数据包,发现是给自己的数据, 因此分析IP头. 发现是给PC3的, 于是重新封装该数据包, 把真正的PC3的硬件地址封装进去. 发送给PC3.
- PC3 接收到 PC1 发送的数据包.
参考:
[1]. TCP/IP详解 卷1:协议