【轉】交換機開發(四)—— ARP 基礎知識解析
一、ARP協議簡介
Internet是由各種各樣的物理網路通過使用諸如路由器之類的裝置連線在一起組成的。當主機傳送一個資料包到另一臺主機的過程中 可能要經過多種不同的物理網路。主機和路由器都是在網路層通過IP地址來識別的,這個地址是在全世界內唯一的。 然而,資料包是通過物理網路傳遞的。在物理網路中,主機和路由器通過其MAC地址來識別的,其範圍限於本地網路中。 MAC地址和IP地址是兩種不同的識別符號。這就意味著將一個分組傳遞到一個主機或路由器需要進行兩級定址:IP和MAC。需要能將一個IP地址對映到相應的MAC地址。
ARP協議是“Address Resolution Protocol”(地址解析協議)的縮寫。 所謂“地址解析”就是主機在傳送幀前將目標網路層地址轉換成目標實體地址的過程。在使用TCP/IP協議的乙太網中,即完成將IP地址對映到MAC地址的過程——使用ARP協議通過目標裝置的IP地址,查詢目標裝置的MAC地址,以保證通訊的順利進行。
二、ARP報文格式
從網路底層看來,一個ARP包是分為兩個部分的,前面一個是物理幀頭,後面一個才是ARP幀。
首先,物理幀頭,它將存在於任何一個協議資料包的前面,我們稱之為DLC Header,因為這個幀頭是在資料鏈路層構造的,並且其主要內容為收發雙方的實體地址,以便硬體裝置識別。
DLC Header |
|||
欄位 |
長度(Byte) |
預設值 |
備註 |
接收方MAC |
6 |
|
廣播時,為 ff-ff-ff-ff-ff-ff |
傳送方MAC |
6 |
|
|
Ethertype |
2 |
0x0806 |
0x0806是ARP幀的型別值 |
圖1 物理幀頭格式
圖1是需要我們填充的物理幀頭的格式,我們可以看到需要我們填充的僅僅是傳送端和接收端的實體地址罷了,是不是很簡單呢?
接下來我們看一下ARP幀的格式
ARP Frame |
|||
欄位 |
長度(Byte) |
預設值 |
備註 |
硬體型別 |
2 |
0x1 |
乙太網型別值 |
上層協議型別 |
2 |
0x0800 |
上層協議為IP協議 |
MAC地址長度 |
1 |
0x6 |
乙太網MAC地址長度為 6 |
IP地址長度 |
1 |
0x4 |
IP地址長度為 4 |
操作碼 |
2 |
|
0x1表示ARP請求包,0x2表示應答包 |
傳送方MAC |
6 |
|
|
傳送方IP |
4 |
|
|
接收方MAC |
6 |
|
|
接收方IP |
4 |
|
|
填充資料 |
18 |
|
因為物理幀最小長度為64位元組,前面的42位元組再加上4個CRC校驗位元組,還差18個位元組 |
圖2 ARP幀格式
我們可以看到需要我們填充的同樣也只是MAC,IP,再加上一個1或2的操作碼而已。
三、ARP包的填充
1、請求包的填充:
比如我們的電腦MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1
我們想要查詢 192.168.0.99的MAC地址,應該怎麼來做呢?
首先填充DLC Header,通過前面的學習我們知道,想要知道某個計算機對應的MAC地址是要給全網傳送廣播的,所以接收方MAC肯定是 ffffffffffff,傳送方MAC當然是自己啦,於是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當然我編的程式比較智慧,會根據你選擇的ARP包型別幫你自動填入一些欄位,你一用便知)。
DLC Header |
||
欄位 |
長度(Byte) |
填充值 |
接收方MAC |
6 |
ffffffffffff |
傳送方MAC |
6 |
aaaaaaaaaaaa |
Ethertype |
2 |
0x0806 |
圖3 ARP請求包中 DLC Header內容
接下來是ARP幀,請求包的操作碼當然是 1,傳送方的MAC以及IP當然填入我們自己的,然後要注意一下,這裡的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,於是,如圖
ARP Frame |
||
欄位 |
長度(Byte) |
填充值 |
硬體型別 |
2 |
1 |
上層協議型別 |
2 |
0800 |
MAC地址長度 |
1 |
6 |
IP地址長度 |
1 |
4 |
操作碼 |
2 |
1 |
傳送方MAC |
6 |
aaaaaaaaaaaa |
傳送方IP |
4 |
192.168.0.1 |
接收方MAC |
6 |
任意值 xxxxxxxxxxxx |
接收方IP |
4 |
192.168.0.99 |
填充資料 |
18 |
0 |
圖4 ARP請求包中 ARP幀的內容
如果我們構造一個這樣的包傳送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發來的一個響應包,我們可以檢視一下我們的ARP快取列表,是不是多了一項類似這樣的條目:
192.168.0.99 bb-bb-bb-bb-bb-bb
是不是很神奇呢?
我們再來看一下ARP響應包的構造
2、響應包的填充
有了前面詳細的解說,你肯定就能自己說出響應包的填充方法來了吧,所以我就不細說了,列兩個表就好了
比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發一個ARP響應包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個欄位
DLC Header |
||
欄位 |
長度(Byte) |
填充值 |
接收方MAC |
6 |
bbbbbbbbbbbb |
傳送方MAC |
6 |
aaaaaaaaaaaa |
Ethertype |
2 |
0x0806 |
圖5 ARP響應包中 DLC Header內容
ARP Frame |
||
欄位 |
長度(Byte) |
填充值 |
硬體型別 |
2 |
1 |
上層協議型別 |
2 |
0800 |
MAC地址長度 |
1 |
6 |
IP地址長度 |
1 |
4 |
操作碼 |
2 |
2 |
傳送方MAC |
6 |
aaaaaaaaaaaa |
傳送方IP |
4 |
192.168.0.1 |
接收方MAC |
6 |
bbbbbbbbbbbb |
接收方IP |
4 |
192.168.0.99 |
填充資料 |
18 |
0 |
圖6 ARP響應包中 ARP幀的內容
這樣192.168.0.99的ARP快取中就會多了一條關於我們192.168.0.1的地址對映。
四、ARP的執行過程
在因特網中,資料包傳遞過程中包括如下步驟:
1. 傳送者知道目標端的IP地址
2. IP要求ARP建立一個ARP請求報文,其中包含了傳送方的實體地址、傳送方的IP地址和目標端的IP地址。目標的實體地址用0填充。
3. 將報文傳遞到資料鏈路層,並在該層中用傳送方的實體地址作為源地址,用物理廣播地址作為目的地址,將其封裝在一個幀中。
4. 同一鏈路中的每個主機或路由器都接收到這個幀,因為該幀中包含了一個廣播目的地址,所有的站點都對報文進行移交,並將其傳遞到ARP。除了目標機器以外的所有機器都丟棄該報文。目標機器對IP地址進行識別。
5. 目標機器用一個包含其實體地址的ARP響應報文做出響應,並對該報文進行單播。
6. 傳送方接收到一個響應報文,這樣它就知道了目標機器的實體地址。
7. 這樣就可以將攜帶目標機器資料的IP資料包封裝在一個幀中,並單播到目的地址。
五、ARP快取
實際上,在真正的協議實現中,並不是每次傳送IP報文前都需要傳送ARP請求報文來獲取目的MAC地址。在大多數的系統中都存在著一個ARP快取表。記錄著已經獲取的MAC地址和IP地址的對映關係,如下圖:
IP地址 MAC地址
202.98.13.1 00-E0-4C-3D-89-76
202.98.13.2 00-E0-4C-3D-C5-03
202.98.13.3 00-E0-4C-4D-BA-92
... ...
傳送IP報文前總是先對ARP快取表進行查詢,看是否目標MAC地址存在於快取表中,如果存在,則不需要傳送ARP請求報文而直接使用此地址進行IP報文的傳送。如果不存在,則傳送ARP請求報文,並將結果存於ARP快取表中供以後使用。
另外,ARP快取表採用了老化機制,在一段時間內如果表中的某一行沒有使用,就會被刪除,這樣可以大大減少ARP快取表的長度,加快查詢速度。
六、ARP代理
ARP本身無法跨躍不同網段。當資料要發往外部網路時,通常是首先使用ARP請求閘道器路由器的MAC地址,之後將資料發往閘道器路由器, 由閘道器路由器進行轉發(動畫演示)。 但有時由於管理或地域等原因,我們的內部網路又會劃分為很多子網,這時我們可以通過修改網路內每臺主機的本地路由,使發往其它子網的資料傳送到連線兩個子網的路由器, 再由路由器轉發。但這樣也許並不是一個易於管理和維護的方案。我們可以使用ARP代理使子網的劃分對每臺主機更加透明化。ARP代理的工作原理很簡單:
當ARP請求是從一個網路的主機發往另一個網路的主機時,啟用ARP代理的連線這兩個網路的路由器將回答該請求,使請求的傳送者誤以為此路由器就是目標主機, 而將所有資料幀傳送到此路由器。路由器在收到資料幀後,再將其轉發到真正的目標主機(動畫演示)。
ARP代理實際上是使用了簡單的欺騙手段,使網路內的主機錯誤的認為目標主機與自己處於同一網段內,從而達到了透明化子網劃分的目的。
相關文章
- 一看就懂的交換機基礎知識
- 【轉】交換機開發(一)—— 交換機的工作原理
- 【轉】交換機開發(二)—— 三層交換機報文轉發過程
- 交換機基礎及stp
- 交換機及路由基礎路由
- Camera基礎知識四
- JavaSE基礎知識分享(四)Java
- 收藏: 全面解析FPGA基礎知識FPGA
- 知識圖譜 KnowledgeGraph基礎解析
- app,小程式開發基礎知識APP
- 安卓(Android)開發基礎知識安卓Android
- 【轉】JavaScript物件的基礎知識JavaScript物件
- 【轉】交換機開發(三)—— 深入分析三層網路交換機的原理和設計
- 小程式開發之基礎知識(0)
- 前端開發基礎知識整理–css篇前端CSS
- Java併發--基礎知識Java
- SQLAlchemy 基礎知識 - autoflush 和 autocommit(轉)SQLMIT
- MySQL 基礎知識梳理學習(四)—-GTIDMySql
- ASP.NET Core基礎知識(四)【路由】ASP.NET路由
- Java基礎知識掃盲(四)——泛型Java泛型
- 小白系列:資料庫基礎知識解析資料庫
- 遊戲開發3D基礎知識遊戲開發3D
- 爬蟲開發知識入門基礎(1)爬蟲
- iOS 開發:『Runtime』詳解(一)基礎知識iOS
- ARP地址解析協議、DNS域名系統和交換機、路由器、閘道器的概念協議DNS路由器
- 基礎知識
- 交換機是如何轉發資料包的?
- HTML 基礎知識(特殊字元的轉義)HTML字元
- Linux基礎命令---arpLinux
- java基礎變數的交換Java變數
- 機器學習基礎知識1機器學習
- 計算機基礎知識很重要計算機
- 計算機基礎知識複習計算機
- 1、交換與定址轉發
- ARP協議 地址解析協議:IP地址轉換為MAC地址協議Mac
- Linux面試題-交換機/路由有哪些必備知識點?Linux面試題路由
- Android 基於ffmpeg開發簡易播放器 – 基礎知識Android播放器
- Android 基於ffmpeg開發簡易播放器 - 基礎知識Android播放器