三十天學不會TCP,UDP/IP網絡編程-ARP -- 鏈接MAC和IP

繼續來作(da)推(guang)介(gao)我本身的!因爲這兩年接觸到了比較多的這方面的知識,不想忘了,我決定把他們記錄下來,因此決定在GitBook用半年時間上面寫下來,這是目前寫的一節,目前已完成了九篇啦。後面會在gitbook上不斷更新,歡迎你們star,主要是在寫完以前歡迎各位給出指正的意見。最最重要的,地址在這裏:https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/,或者在gitbook上搜索「三十天學不會TCP,UDP/IP編程」。linux

以爲我要以一個真實的故事來開始這一部分。在我上大二的時候,忽然從某一天開始,咱們那層連着的6個寢室全都不能上網了,可是有時候又能短暫的上一下子網,沒有規律。不過有一個同窗例外,雖然他也處在這6個寢室之中,但不管什麼時候他都能上網。咱們很苦悶,因而他那段時間挨個寢室炫耀本身能夠上網。就這樣過了大約一個星期,後來他們寢室另外三我的忽然發現一個規律,只要這個同窗沒有插網線咱們就能上網,只要他一插網線咱們就全完了。在用他的電腦作了幾回開關機時間以後,咱們確認了這個事實。這是個不得了的發現吶,考慮到以前他過高調了,咱們6個寢室的人勒令他不容許開電腦,哈哈。可是咱們仍是有良心的,開始在網上搜索資料,後來架不住人(mei)多(wang)力(shang)量(bu)大(xing),咱們在茫茫互聯網資料中,搜索到了兩個詞「arp欺騙」和「arp病毒」。特別是想到那位同窗前幾天炫耀的表情,在興(fen)趣(nu)的指引下,咱們認真學習了其原理,確認了確實是那位同窗的鍋。而後下載了個殺毒軟件,給那位同窗的電腦完全的殺毒,今後上面的現象再也沒有出現過了。並且在後面長達一週的時間內,咱們天天必作的一件事就是去問候一下那位同窗,哈哈。git

ARP是什麼?

ARP學名Address Resolution Protocol,從英文上看意思已經躍然紙上了。地址解析協議,解析啥呢,解析IP地址到MAC地址。爲何要這麼作呢,由於兩個計算機通訊本質上是經過MAC地址來識別對方的。我以爲在避免陷入一個協議複雜的細節以前,能夠先從一個宏觀上面弄明白協議的整個流程是什麼樣的,是時候再一次獻上個人手繪版了。編程

 

 

ARP協議主要在兩個場景下有所使用,第一個猶如圖中繪製的,某一段想向另外一端發送數據包以前,須要經過ARP協議來知曉對方的的地址,具體用文字描述就是以下:windows

首先,發送端會發出一個ARP請求以太網報文,因爲如今發送端還不知道對端的MAC地址,因此ARP的請求報文利用了鏈路層廣播,使得局域網內全部的主機都能接受到這個信息,這就像咱們小時候站在別的班教室門口找人同樣,大喊,誰誰誰,有人找你,全部人都能聽到,可是隻有正確的誰誰誰纔會發出響應。緩存

按照這個邏輯,回憶一下,其實就是點擊一下「MAC地址與數據鏈路層」裏介紹的數據鏈路層以太網幀格式,其中以太網頭部填上目標鏈路層廣播MAC地址,也就是在前一節裏已經介紹過的全FF,接下來的填入本身的MAC地址,剩下的幀類型是0x0806,標識ARP協議。網絡

接下來就是數據部分了,在ARP協議的數據部分, 要填入的數據類型的不少, 我想以一個表格的形式來表示會比較清晰(表中黑體部分標識以太網幀頭部分,普通字體表示數據部分):tcp

長度 數據類型
48 目標以太網地址(FF:FF:FF:FF:FF:FF)
48 發送端以太網地址
16 幀類型(0x0806)
16 硬件類型(0x0001表示以太網)
16 協議類型(0x8000表示IPv4,0x86DD標識IPv6)
8 硬件地址長度(6)
8 協議地址長度(4對應IPv4,6對應IPv6)
16 操做碼(1)
48 發送端MAC地址
32 發送端IP地址
48 目標MAC地址(全0標識空)
32 目標IP地址

當這個請求數據幀構造後以後,發送端將其發送給整個網絡,接下來的局域網中全部接口卡都會讀入這個幀,可是在驅動程序讀到數據部分的目標IP地址以後發現與本身的IP地址並不匹配,因此就什麼也不作,簡單的丟棄這個幀就好。直到正確的對端出現,他發現這個幀裏面的IP地址就是本身,因而下面他就須要構造一個ARP應答幀。學習

這個應答幀的組成絕大部分和上表列出的同樣,不一樣的只有這幾點:字體

  1. 目標以太網地址再也不是全FF的廣播地址,而是剛纔發送端A的MAC地址,由於該應答端B已經從A的ARP請求幀的數據部分能夠知道A的MAC地址,不必再廣播了。
  2. 操做碼改成2,2表示ARP應答。
  3. 其他將全部"發送端」相關的都填本身(B)的信息,目標端都填要回復的那一端的信息(A),這一點是顯而易見的。

當應答幀構造完畢發送出去之後,A的網卡驅動程序就能篩選出發給本身應答幀,裏面含有他須要的對端的B的MAC地址信息。這時候以備之後使用,A會把這個信息寫入本身的一個cache裏面存起來,這個緩存會有個老化機制,會按期淘汰好久沒用的,這樣能夠保持這個表不至於太龐大,加快查詢速度。這樣下次再想和B通訊的時候就不用再一次的廣播消息重走長征路了,佔用帶寬並且也沒有必要。而這個緩存信息,在每一個機器上都能看到,在windows上用arp -a命令,在linux上使用arp命令就能夠看到。ui

 

 

這裏有個有趣的現象,個人局域網的廣播地址對應的物理地址是全ff,這一點我在上一節也說過了,鏈路層廣播地址和IP層次的廣播地址沒有徹底直接的關係,可能好幾類的IP層次的廣播地址映射的都是全ff的鏈路層廣播地址。

按照慣例,我會截圖截個wireshark的數據包來看一下實際中的包表示標準沒有欺騙咱們,那麼固然這一次也不例外:

看看wireshark這個至關用戶友好化的界面說明,個人電腦要找到局域網的路由器的地址,先霸氣的在網絡裏大叫,「誰TM的擁有192.168.8.1,告訴我192.168.8.124」,並且注意第一個消息的地址是Broadcast,是一個廣播消息,接下來,路由器作出了應答,「我是192.168.8.1,個人MAC地址是。。。」,這裏的發送地址已經準確的是個人電腦了。

 

爲了更一步的看看包裏面到底有啥,就選取ARP請求包展開看一下其中內容,對比一下前面表中的內容,又一次發現,標準說明沒有騙咱們:

 

 

免費ARP和免費一點也沒有關係

前面我說了,ARP協議主要用在兩個場景,在上一節中已經介紹了第一個,第二個就是這個翻譯的使人感到很困惑的免費ARP了。免費ARP,其實學名是gratuitous ARP, gratuitous這個詞主要有三個意思,無故的,沒有理由的和免費的。我以爲翻譯成另外兩個都比免費的這個翻譯好。

廢話很少說了,那麼這個gratuitous ARP究竟是幹啥的呢?不知道你們有沒有遇到過這樣一個現象,在公司裏用電腦用的好好的,忽然會右下角會出現一個氣泡提示,說你的IP地址衝突了。這個提示就來源於gratuitous ARP,每一個機器在DHCP(後面會詳細介紹這個重要協議的)拿到這個IP以後,會向局域網中廣播一個ARP請求,可是這個請求中的目標IP地址是本身已經分配了的IP地址,按照前面的邏輯,若是局域網上還有一個主機具備一樣的IP地址的主機,那麼他就會發送一個回覆,而這個回覆中會包含本身MAC地址。發送端若是接收到這麼一個回覆,那麼意味着在網絡中有一個和本身如出一轍的IP地址的主機,他本身就知道本身的IP地址重複了,因而就會給出這個麼一個提示給用戶。

ARP欺騙

有了前面這個免費ARP的例子,那麼ARP欺騙就很好理解了。只要作一個以下的想象:

若是有一個程序,他能夠篡改ARP應答包裏的MAC地址,也就是把MAC地址改爲本身規定好的主機,那麼按照咱們上面說的,,發送包在收到這個ARP應答後會把cache起來以防下次再作沒必要要的努力。那麼你之後原本想發送到B的包就會被髮到一個指定的主機上,由於數據層的MAC地址已經被邪惡的入侵者所改掉,不會填入B的MAC地址。

這也就是爲何最開始的故事中咱們都上不了網,惟獨我那一個同窗能上網的緣由,由於他機器上的ARP病毒將全部包的地址都改成他本身的主機,咱們其他的電腦都根本沒法完成通訊,或者也多是說根本收不到消息。

相關文章
相關標籤/搜索