交换机开发(四)—— ARP 基础知识解析
一、ARP協(xié)議簡介?
? ? ?Internet是由各種各樣的物理網(wǎng)絡(luò)通過使用諸如路由器之類的設(shè)備連接在一起組成的。當(dāng)主機發(fā)送一個數(shù)據(jù)包到另一臺主機的過程中 可能要經(jīng)過多種不同的物理網(wǎng)絡(luò)。主機和路由器都是在網(wǎng)絡(luò)層通過IP地址來識別的,這個地址是在全世界內(nèi)唯一的。 然而,數(shù)據(jù)包是通過物理網(wǎng)絡(luò)傳遞的。在物理網(wǎng)絡(luò)中,主機和路由器通過其MAC地址來識別的,其范圍限于本地網(wǎng)絡(luò)中。 MAC地址和IP地址是兩種不同的標(biāo)識符。這就意味著將一個分組傳遞到一個主機或路由器需要進行兩級尋址:IP和MAC。需要能將一個IP地址映射到相應(yīng)的MAC地址。
? ? ?ARP協(xié)議是“Address Resolution Protocol”(地址解析協(xié)議)的縮寫。 所謂“地址解析”就是主機在發(fā)送幀前將目標(biāo)網(wǎng)絡(luò)層地址轉(zhuǎn)換成目標(biāo)物理地址的過程。在使用TCP/IP協(xié)議的以太網(wǎng)中,即完成將IP地址映射到MAC地址的過程——使用ARP協(xié)議通過目標(biāo)設(shè)備的IP地址,查詢目標(biāo)設(shè)備的MAC地址,以保證通信的順利進行。
二、ARP報文格式
? ? ?從網(wǎng)絡(luò)底層看來,一個ARP包是分為兩個部分的,前面一個是物理幀頭,后面一個才是ARP幀。
首先,物理幀頭,它將存在于任何一個協(xié)議數(shù)據(jù)包的前面,我們稱之為DLC Header,因為這個幀頭是在數(shù)據(jù)鏈路層構(gòu)造的,并且其主要內(nèi)容為收發(fā)雙方的物理地址,以便硬件設(shè)備識別。
| DLC Header | |||
| 字段 | 長度(Byte) | 默認(rèn)值 | 備注 |
| 接收方MAC | 6 | 廣播時,為 ff-ff-ff-ff-ff-ff | |
| 發(fā)送方MAC | 6 | ||
| Ethertype | 2 | 0x0806 | 0x0806是ARP幀的類型值 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1 物理幀頭格式
? ? ?圖1是需要我們填充的物理幀頭的格式,我們可以看到需要我們填充的僅僅是發(fā)送端和接收端的物理地址罷了,是不是很簡單呢?
? ? 接下來我們看一下ARP幀的格式
| ARP Frame | |||
| 字段 | 長度(Byte) | 默認(rèn)值 | 備注 |
| 硬件類型 | 2 | 0x1 | 以太網(wǎng)類型值 |
| 上層協(xié)議類型 | 2 | 0x0800 | 上層協(xié)議為IP協(xié)議 |
| MAC地址長度 | 1 | 0x6 | 以太網(wǎng)MAC地址長度為 6 |
| IP地址長度 | 1 | 0x4 | IP地址長度為 4 |
| 操作碼 | 2 | 0x1表示ARP請求包,0x2表示應(yīng)答包 | |
| 發(fā)送方MAC | 6 | ||
| 發(fā)送方IP | 4 | ||
| 接收方MAC | 6 | ||
| 接收方IP | 4 | ||
| 填充數(shù)據(jù) | 18 | 因為物理幀最小長度為64字節(jié),前面的42字節(jié)再加上4個CRC校驗字節(jié),還差18個字節(jié) | |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖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地址,應(yīng)該怎么來做呢?
首先填充DLC Header,通過前面的學(xué)習(xí)我們知道,想要知道某個計算機對應(yīng)的MAC地址是要給全網(wǎng)發(fā)送廣播的,所以接收方MAC肯定是 ffffffffffff,發(fā)送方MAC當(dāng)然是自己啦,于是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當(dāng)然我編的程序比較智能,會根據(jù)你選擇的ARP包類型幫你自動填入一些字段,你一用便知)。
| DLC Header | ||
| 字段 | 長度(Byte) | 填充值 |
| 接收方MAC | 6 | ffffffffffff |
| 發(fā)送方MAC | 6 | aaaaaaaaaaaa |
| Ethertype | 2 | 0x0806 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖3 ARP請求包中 DLC Header內(nèi)容
? ? ? ? 接下來是ARP幀,請求包的操作碼當(dāng)然是 1,發(fā)送方的MAC以及IP當(dāng)然填入我們自己的,然后要注意一下,這里的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如圖
| ARP Frame | ||
| 字段 | 長度(Byte) | 填充值 |
| 硬件類型 | 2 | 1 |
| 上層協(xié)議類型 | 2 | 0800 |
| MAC地址長度 | 1 | 6 |
| IP地址長度 | 1 | 4 |
| 操作碼 | 2 | 1 |
| 發(fā)送方MAC | 6 | aaaaaaaaaaaa |
| 發(fā)送方IP | 4 | 192.168.0.1 |
| 接收方MAC | 6 | 任意值 xxxxxxxxxxxx |
| 接收方IP | 4 | 192.168.0.99 |
| 填充數(shù)據(jù) | 18 | 0 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4 ARP請求包中 ARP幀的內(nèi)容
? ? ? ?如果我們構(gòu)造一個這樣的包發(fā)送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發(fā)來的一個響應(yīng)包,我們可以查看一下我們的ARP緩存列表,是不是多了一項類似這樣的條目:
192.168.0.99 ? ? ? ? ? ? ? ? ?bb-bb-bb-bb-bb-bb
是不是很神奇呢?
我們再來看一下ARP響應(yīng)包的構(gòu)造
2、響應(yīng)包的填充
有了前面詳細(xì)的解說,你肯定就能自己說出響應(yīng)包的填充方法來了吧,所以我就不細(xì)說了,列兩個表就好了
比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發(fā)一個ARP響應(yīng)包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個字段
| DLC Header | ||
| 字段 | 長度(Byte) | 填充值 |
| 接收方MAC | 6 | bbbbbbbbbbbb |
| 發(fā)送方MAC | 6 | aaaaaaaaaaaa |
| Ethertype | 2 | 0x0806 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖5 ARP響應(yīng)包中 DLC Header內(nèi)容
| ARP Frame | ||
| 字段 | 長度(Byte) | 填充值 |
| 硬件類型 | 2 | 1 |
| 上層協(xié)議類型 | 2 | 0800 |
| MAC地址長度 | 1 | 6 |
| IP地址長度 | 1 | 4 |
| 操作碼 | 2 | 2 |
| 發(fā)送方MAC | 6 | aaaaaaaaaaaa |
| 發(fā)送方IP | 4 | 192.168.0.1 |
| 接收方MAC | 6 | bbbbbbbbbbbb |
| 接收方IP | 4 | 192.168.0.99 |
| 填充數(shù)據(jù) | 18 | 0 |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖6 ARP響應(yīng)包中 ARP幀的內(nèi)容
這樣192.168.0.99的ARP緩存中就會多了一條關(guān)于我們192.168.0.1的地址映射。
四、ARP的運行過程?
? 在因特網(wǎng)中,數(shù)據(jù)報傳遞過程中包括如下步驟:?
1. 發(fā)送者知道目標(biāo)端的IP地址?
2. IP要求ARP創(chuàng)建一個ARP請求報文,其中包含了發(fā)送方的物理地址、發(fā)送方的IP地址和目標(biāo)端的IP地址。目標(biāo)的物理地址用0填充。?3. 將報文傳遞到數(shù)據(jù)鏈路層,并在該層中用發(fā)送方的物理地址作為源地址,用物理廣播地址作為目的地址,將其封裝在一個幀中。?
4. 同一鏈路中的每個主機或路由器都接收到這個幀,因為該幀中包含了一個廣播目的地址,所有的站點都對報文進行移交,并將其傳遞到ARP。除了目標(biāo)機器以外的所有機器都丟棄該報文。目標(biāo)機器對IP地址進行識別。?
5. 目標(biāo)機器用一個包含其物理地址的ARP響應(yīng)報文做出響應(yīng),并對該報文進行單播。?
6. 發(fā)送方接收到一個響應(yīng)報文,這樣它就知道了目標(biāo)機器的物理地址。?
7. 這樣就可以將攜帶目標(biāo)機器數(shù)據(jù)的IP數(shù)據(jù)報封裝在一個幀中,并單播到目的地址。?
五、ARP緩存?
? ? ?實際上,在真正的協(xié)議實現(xiàn)中,并不是每次發(fā)送IP報文前都需要發(fā)送ARP請求報文來獲取目的MAC地址。在大多數(shù)的系統(tǒng)中都存在著一個ARP緩存表。記錄著已經(jīng)獲取的MAC地址和IP地址的映射關(guān)系,如下圖:
? ? ? ? ? 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?? ? ? ? ? ? ? ? ... ? ? ? ? ? ? ? ? ? ? ? ?...?
? ? ?
? ? ? ?發(fā)送IP報文前總是先對ARP緩存表進行查找,看是否目標(biāo)MAC地址存在于緩存表中,如果存在,則不需要發(fā)送ARP請求報文而直接使用此地址進行IP報文的發(fā)送。如果不存在,則發(fā)送ARP請求報文,并將結(jié)果存于ARP緩存表中供以后使用。?
? ? ?另外,ARP緩存表采用了老化機制,在一段時間內(nèi)如果表中的某一行沒有使用,就會被刪除,這樣可以大大減少ARP緩存表的長度,加快查詢速度。?
六、ARP代理?
? ? ?ARP本身無法跨躍不同網(wǎng)段。當(dāng)數(shù)據(jù)要發(fā)往外部網(wǎng)絡(luò)時,通常是首先使用ARP請求網(wǎng)關(guān)路由器的MAC地址,之后將數(shù)據(jù)發(fā)往網(wǎng)關(guān)路由器, 由網(wǎng)關(guān)路由器進行轉(zhuǎn)發(fā)(動畫演示)。 但有時由于管理或地域等原因,我們的內(nèi)部網(wǎng)絡(luò)又會劃分為很多子網(wǎng),這時我們可以通過修改網(wǎng)絡(luò)內(nèi)每臺主機的本地路由,使發(fā)往其它子網(wǎng)的數(shù)據(jù)發(fā)送到連接兩個子網(wǎng)的路由器, 再由路由器轉(zhuǎn)發(fā)。但這樣也許并不是一個易于管理和維護的方案。我們可以使用ARP代理使子網(wǎng)的劃分對每臺主機更加透明化。ARP代理的工作原理很簡單:?
? ? ? 當(dāng)ARP請求是從一個網(wǎng)絡(luò)的主機發(fā)往另一個網(wǎng)絡(luò)的主機時,啟用ARP代理的連接這兩個網(wǎng)絡(luò)的路由器將回答該請求,使請求的發(fā)送者誤以為此路由器就是目標(biāo)主機, 而將所有數(shù)據(jù)幀發(fā)送到此路由器。路由器在收到數(shù)據(jù)幀后,再將其轉(zhuǎn)發(fā)到真正的目標(biāo)主機(動畫演示)。?
? ? ?ARP代理實際上是使用了簡單的欺騙手段,使網(wǎng)絡(luò)內(nèi)的主機錯誤的認(rèn)為目標(biāo)主機與自己處于同一網(wǎng)段內(nèi),從而達(dá)到了透明化子網(wǎng)劃分的目的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的交换机开发(四)—— ARP 基础知识解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AlterID.exe 报错问题
- 下一篇: java snap7_Snap7 ref