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