写点什么

几幅图拿下 ARP 协议

发布于: 2021 年 02 月 07 日
几幅图拿下 ARP 协议

🎓 尽人事,听天命。博主东南大学研究生在读,热爱健身和篮球,正在为两年后的秋招准备中,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步


🎁 本文已收录于 CS-Wiki(Gitee 官方推荐项目,现已 0.9k star),致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习

0. 前言

在上一篇文章 别再恐惧 IP 协议 中, 我们了解到,网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。也就是说:只要在网络层确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个 IP 地址所对应的 MAC 地址。


对于这段话不太了解的小伙伴强烈推荐翻看上篇讲解 IP 协议的文章 别再恐惧 IP 协议,有非常详细的解释和图例 😊


那么,ARP 就是用来实现由 IP 地址到 MAC 地址转化的一个网络层协议,当然,还有一个 RARP 协议可以实现由 MAC 地址到 IP 地址的转化。两者原理都差不多,本文就以 ARP 协议为例进行讲解。



1. ARP 概要

ARP(Address Resolution Protocol )地址解析协议:实现由 IP 地址到 MAC 地址的转换。准确的来说,ARP 协议以目标 IP 地址为线索,用来定位下一个应该数据分包的网络设备对应的 MAC 地址。


🍉 以买车票为例:我们把数据链路层当成乘坐高铁从苏州到南京,再在南京转乘到北京,再在北京转乘到西藏的旅客,那么网络层就相当于每个车站的工作人员,在数据链路层每次转乘时,网络层为其购买了一张标有下一个 MAC 地址的车票。因此,即使旅客(数据链路层)不知道其最终目的地也没有关系,工作人员(网络层)会给你做出指引。


那么,ARP 协议做的事情就是在数据链路层每次换乘时,为其购买一张标有下一个 MAC 地址的车票



具体来说,网络层对数据链路层做出指引的过程称为路由控制,指引数据链路层的下一站是哪。为了将数据包发送给目标主机,所有主机和路由器都维护着一张路由控制表(Routing Table),该表记录着如下两个字段:


  • 1)IP 地址

  • 2)如果想要到达这个 IP 地址,在当前路由器,数据包的下一步应该是发送到哪个路由器


很不幸的是,路由控制表中记录的是这个数据包下一步应该发送到的 IP 地址,但是数据链路层进行通信的时候,它只认得 MAC 地址。所以,用来实现 IP 地址到 MAC 地址转换的 ARP 协议在此时就显得尤为重要。


2. ARP 的工作原理

那么 ARP 又是如何知道 MAC 地址的呢?


简单地说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。并且每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表


如下图所示,假定主机 A 向同一链路上的主机 B 发送 IP 数据报,已知主机 A 和主机 B 的 IP 地址,它们互不知道对方的 MAC 地址:



1)首先,主机 A 为了获得主机 B 的 MAC 地址,它会先去查询自己的 ARP 高速缓存中有没有主机 B 的相关记录;


2)如果主机 A 的 ARP 高速缓存中没有主机 B 的 IP 地址到 MAC 地址的映射,主机 A 就会通过广播的方式发送 ARP 请求包(该包携带自己的 IP 地址 和 MAC 地址 以及 目标主机的 IP 地址),表明自己想要获得主机 B 的 MAC 地址;


2) 由于广播请求可以被同一个链路上的所有主机或路由器接收,因此如果这条链路上某个主机或路由的 IP 地址与这个 ARP 请求包中包含的目标主机的 IP 地址相同,那么这个节点就将自己的 MAC 地址塞入 ARP 响应包中返回给主机 A;



当然,ARP 响应包是以单播的形式进行发送的,毕竟 ARP 请求包中已经包含了主机 A 的 IP 地址,所以主机 B 非常清楚这个响应包应该发送给谁。

大部分网络协议在设计的时候,都是保持极度克制的,不需要的交互就砍掉,能合并的信息就合并,能不用广播就用单播,以此让带宽变得更多让网络变得更快。


3)主机 A 在收到主机 B 发过来的 ARP 响应包后,向其 ARP 高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。



当然,缓存是有一定期限的,超过这个期限,缓存的内容将被清空。这也使得即使 MAC 地址和 IP 地址的映射关系发生了变化,也依然能够正确的将数据包发送给目标地址。

🎉 关注公众号 | 飞天小牛肉,即时获取更新

  • 博主东南大学研一在读,利用课余时间运营一个公众号『 飞天小牛肉 』,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 基础和面试指南的相关原创技术好文。本公众号的目的就是让大家可以快速掌握重点知识,有的放矢。关注公众号,第一时间获取文章更新,与小牛肉一起成长吧!


  • 并推荐个人维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已 0.9k star), 面向全栈,致力于构建完善的知识体系(数据结构、计算机网络、操作系统、算法、数据库、设计模式、Java 技术栈、机器学习、深度学习、强化学习等)。相比公众号,本仓库拥有更加健全的知识体系,欢迎各位小伙伴前来 star ~ 😊


发布于: 2021 年 02 月 07 日阅读数: 29
用户头像

🦄 公众号『飞天小牛肉』 2021.02.01 加入

🎓 博主东南大学研究生在读,热爱篮球和健身,正在为一年后的秋招准备中,进击的 Javaer,深耕计算机基础和 Java 相关技术栈

评论

发布
暂无评论
几幅图拿下 ARP 协议