[圖解]ARP協議(一)

1、ARP概述macos

若是要在TCP/IP協議棧中選擇一個"最不安全的協議",那麼我會堅決果斷把票投給ARP協議。咱們常常聽到的這些術語,包括"網絡掃描"、"內網滲透"、"中間人攔截"、"局域網流控"、"流量欺騙",基本都跟ARP脫不了干係。大量的安全工具,例如大名鼎鼎的Cain、功能完備的Ettercap、操做傻瓜式的P2P終結者,底層都要基於ARP實現。編程

 

聽上去這麼"逆天"的協議,其實技術原理又簡單的難以置信,例如ARP整個完整交互過程僅須要兩個包,一問一答便可搞定!可是ARP協議也有它令初學者迷惑的地方,例如由它自己延伸出來的"代理ARP"、"免費ARP"、"翻轉ARP"、"逆向ARP",而這些不一樣種類的ARP,又應用於不一樣的場景。好吧,在深刻到技術原理以前,做爲初學者,咱們先記住下面三句話:windows

 

ARP(Address Resolution Protocol)即地址解析協議, 用於實現從 IP 地址到 MAC 地址的映射,即詢問目標IP對應的MAC地址緩存

 

②在網絡通訊中,主機和主機通訊的數據包須要依據OSI模型從上到下進行數據封裝,當數據封裝完整後,再向外發出。因此在局域網的通訊中,不只須要源目IP地址的封裝,也須要源目MAC的封裝。安全

 

③通常狀況下,上層應用程序更多關心IP地址而不關心MAC地址,因此須要經過ARP協議來獲知目的主機的MAC地址,完成數據封裝。網絡

 

接下來,咱們經過圖解的方式來深刻了解ARP協議是如何工做的。編程語言

 

 


 

2、ARP原理之請求應答工具

同一個局域網裏面,當PC1須要跟PC2進行通訊時,此時PC1是如何處理的?spa

 

wKioL1mjyQzzPWA8AADqjhYvy2c681.png

 

根據OSI數據封裝順序,發送方會自頂向下(從應用層到物理層)封裝數據,而後發送出去,這裏以PC1 ping PC2的過程舉例==>命令行

wKiom1mjyTaTFTPSAAGeGtry-OU503.png

 

PC1封裝數據而且對外發送數據時,上圖中出現了"failed",即數據封裝失敗了,爲何?

 

咱們給PC1指令-"ping ip2",這就告知了目的IP,此時PC1便有了通訊須要的源目IP地址,可是PC1仍然沒有通訊須要的目的MAC地址。這就比如咱們要寄一個快遞,若是在快遞單上僅僅寫了收件人的姓名(IP),卻沒有寫收件人的地址(MAC),那麼這個快遞就無法寄出,由於信息不完整。

 

那麼,如今PC1已經有了PC2的IP地址信息,如何獲取到PC2的MAC地址呢?此時,ARP協議就派上用場了。咱們接着上面這張圖,繼續==>

 

wKiom1mjyUfTP_VZAAH2B0OmqsU256.png

經過第三和第四步驟,咱們看到PC1和PC2進行了一次ARP請求和回覆過程,經過這個交互工程,PC1便具有了PC2的MAC地址信息。

 

接下來PC1會怎麼作呢?在真正進行通訊以前,PC1還會將PC2的MAC信息放入本地的【ARP緩存表】,表裏面放置了IP和MAC地址的映射信息,例如 IP2<->MAC2。接下來,PC1再次進行數據封裝,正式進入PING通訊,以下==>

 

wKiom1mjyVWjQvbeAAHINNu-eZo561.png

 

小結:通過上面6個步驟的處理,PC1終於把數據包發送出去了,以後即可以進行正常的通訊了。看到了吧,ARP的功能和實現過程是如此的簡單:它在發送方須要目標MAC地址的時及時出手,經過"一問一答"的方式獲取到特定IP對應的MAC地址,而後存儲到本地【ARP緩存表】,後續須要的話,就到這裏查找。

 

既然是"緩存"表,意味着它有時效性,而且若是電腦或者通訊設備重啓的話,這張表就會清空;也就是說,若是下次須要通訊,又須要進行ARP請求。在咱們的windows/macos系統下,能夠經過命令行"arp -a"查看具體信息=>

 

wKiom1mjyWnioEpCAAFSWuUGP0Q089.png

 

 

 


 

3、ARP原理之廣播請求單播迴應

上面的圖解過程看上去簡單又純粹,好像咱們就已經把這個協議的精髓所有get到,但其實,咱們只是剛揭開了它的面紗,接下來咱們才真正進入正題。例如,上面的圖解過程當中,整個局域網(LAN)只有PC1和PC2兩個主機,因此這個一問一答過程很是的順暢。

 

而實際網絡中,這個LAN可能有幾十上百的主機,那麼請問,PC1如何將這個【ARP請求包】順利的交給PC2,而PC2又如何順利的把【ARP迴應包】返回給PC1? 咱們看下面的圖:

 

 

 

wKiom1mjyX-yuMXeAAHYtV_I9rA078.png

wKioL1mjyW-RqIfVAAH6rC7kWJM787.png

爲了營造出"幾十上百"的效果,這裏多添加了2個主機進來 ( ω ),而且增長了有線和無線的環境。那麼,在多主機環境下,PC1如今發出的ARP請求包,怎麼交到PC2手裏?

 

這時,ARP協議就須要採用以太網的"廣播"功能:將請求包以廣播的形式發送,交換機或WiFi設備(無線路由器)收到廣播包時,會將此數據發給同一局域網的其餘全部主機。

 

那麼,什麼是廣播?對於初學者而言,咱們只須要知道,大部分的廣播包,它們有一個共同特徵:二層封裝時目的MAC是全f(ffff.ffff.ffff)或三層封裝時目的IP是全1(255.255.255.255)。能夠這樣更方便的記住:目的地址最大的,就是廣播。

 

註明:廣播根據所在層次可分爲二層廣播和三層廣播,根據發生範圍可分爲本地廣播和定向廣播,小夥伴們有興趣能夠本身再去拓展下。

 

接下來咱們來看下這個ARP廣播請求包接下來是如何工做的?

 

wKioL1mjyYXgyhcYAAL1Uhn9Yzc214.png

根據上圖咱們看到,PC1發送的請求廣播包同時被其餘主機收到,而後PC3和PC4收到以後(發現不是問本身)則丟棄。而PC2收到以後,根據請求包裏面的信息(有本身的IP地址),判斷是給本身的,因此不會作丟棄動做,而是返回ARP迴應包。

 

ARP請求是經過廣播方式來實現的,那麼,PC2返回ARP迴應包,是否也須要經過廣播來實現呢?答案是否認的。大部分網絡協議在設計的時候,都須要保持極度剋制,不須要的交互就砍掉,能合併的信息就合併,能不用廣播就用單播,以此讓帶寬變得更多讓網絡變得更快。

 

那麼,ARP迴應包是如何處理的?這裏須要特別關注ARP請求包的內容,在上面的圖解裏面,ARP請求包的完整信息是:個人IP地址是IP1,MAC地址是MAC1,請問誰是PC2,你的IP2對應的MAC地址是多少?

 

簡單來講,ARP請求首先有"自我介紹",而後纔是詢問。這樣的話,PC2在收到請求以後,就能夠將PC1的IP和MAC映射信息存儲在本地的【ARP緩存表】,既然知道PC1在哪裏,就能夠返回ARP單播迴應包。

 

wKioL1mjyZzxyHuUAAL8B6-X0vY648.png

這張圖咱們須要獲得兩個信息:①被詢問者PC2先生成了ARP映射信息,而後纔是詢問者PC1;②PC3和PC4等其餘主機,沒法收到這個ARP迴應包,由於是單播形式。

 

小結:ARP協議經過"一問一答"實現交互,可是"問"和"答"都有講究,"問"是經過廣播形式實現,"答"是經過單播形式。

 

 


 

4、ARP數據包解讀

爲了讓你們更好的理解ARP協議以及廣播和單播的概念,咱們來看一下用Wireshark抓取到的真實網絡中的ARP過程,經過數據包的方式來呈現,地址信息以下,部分MAC信息隱去。(建議初學者用GNS3配合Wireshark來抓取協議包進行分析,相比真實網絡更加乾淨,方便分析)

主機1 <---> 主機2

主機1:  IP1 10.1.20.64    MAC1:00:08:ca:xx:xx:xx

主機2:  IP2 10.1.20.109  MAC2:44:6d:57:xx:xx:xx

 

【ARP請求包】

 

 

wKioL1mjybXBzN7XAASAgIFsB_0048.png

【ARP迴應包】

wKioL1mjycTRmvOEAAQLf48DXPo677.png

 

 

【ARP協議字段解讀】

Hardware type :硬件類型,標識鏈路層協議

Protocol type: 協議類型,標識網絡層協議

Hardware size :硬件地址大小,標識MAC地址長度,這裏是6個字節(48bti)

Protocol size: 協議地址大小,標識IP地址長度,這裏是4個字節(32bit)

Opcode: 操做代碼,標識ARP數據包類型,1表示請求,2表示迴應

Sender MAC address :發送者MAC

Sender IP address :發送者IP

Target MAC address :目標MAC,此處全0表示在請求

Target IP address: 目標IP

 

 


 

5、ARP究竟是鏈路層仍是網絡層?

這個問題的難度堪比另一個世界級難題:世界上最好的編程語言是什麼?

其實早在20世紀時,W.Richard Stevens在《TCP/IP詳解卷一》裏面就提到了這個難題。這裏給出我我的的協議分層思路,給你們做爲參考=>

 

協議到底所屬哪一層,能夠從應用/功能來考慮,也能夠從層次/包封裝來考慮。

以ARP協議爲例,它的功能最終是獲取到MAC信息,服務於鏈路層,從這點考慮,ARP是鏈路層協議;可是從層次來看,ARP基於Ethernet協議,IP協議基於Ethernet協議,它們在Ethernet協議裏面有獨立的Type類型,前者是0x0806,後者是0x0800,既然ARP和IP協議"分庭抗禮",那麼IP是網絡層,ARP難道就不是網絡層?

 

wKiom1mjyeyw1Bh2AADC0czmIVc959.png

小結:基於功能來考慮,ARP是鏈路層協議;基於分層/包封裝來考慮,ARP是網絡層協議。(此方法對於ICMP協議一樣管用)

相關文章
相關標籤/搜索