一文詳解 ARP 協議

我把自己以往的文章匯總成為了 Github ,歡迎各位大佬 star
//github.com/crisxuan/bestJavaer

公眾號連載電腦網路文章如下

ARP,這個隱匿在計網背後的男人

我畫了 40 張圖就是為了讓你搞懂電腦網路層

40 張圖帶你搞懂 TCP 和 UDP

拿下計網協議後,我就是公園裡最靚的仔

TCP/IP 基礎知識總結

電腦網路基礎知識總結

那麼開始我們本篇文章

只要確定了 IP 地址後,就能夠向這個 IP 地址所在的主機發送數據報,這是我們所熟知的事情。但是再往深了想,IP 地址只是標識網路層的地址,那麼在網路層下方數據鏈路層是不是也有一個地址能夠告訴對方主機自己的地址呢?是的,這個地址就是MAC 地址

認識 MAC 地址

MAC 地址的全稱是 Media Access Control Address,譯為媒體訪問控制地址,它是網路上乙太網或網路適配器的唯一標識符。MAC 地址能夠區分不同的網路介面,並用於多種網路技術,尤其是大多數 IEEE 802 網路。

MAC 地址也稱為物理地址,硬體地址和老化地址。

MAC 地址主要用於識別數據鏈路中互聯的節點,如下圖所示

MAC 地址長 48 bit,在使用網卡(NIC) 的情況下,MAC 地址一般都會燒入 ROM 中。因此,任何一個網卡的 MAC 地址都是唯一的。MAC 地址的結構如下

MAC 地址中的 3 – 24 位表示廠商識別碼,每個 NIC 廠商都有特定唯一的識別數字。25 – 48 位是廠商內部為識別每個網卡而用。因此,可以保證全世界不會有相同 MAC 地址的網卡。

MAC 地址也有例外情況,即 MAC 地址也會有重複的時候,但是問題不大,只要兩個 MAC 地址是屬於不同的數據鏈路層就不會出現問題。

ARP 是什麼

ARP 協議的全稱是 Address Resolution Protocol(地址解析協議),它是一個通過用於實現從 IP 地址到 MAC 地址的映射,即詢問目標 IP 對應的 MAC 地址 的一種協議。ARP 協議在 IPv4 中極其重要。

注意:ARP 只用於 IPv4 協議中,IPv6 協議使用的是 Neighbor Discovery Protocol,譯為鄰居發現協議,它被納入 ICMPv6 中。

簡而言之,ARP 就是一種解決地址問題的協議,它以 IP 地址為線索,定位下一個應該接收數據分包的主機 MAC 地址。如果目標主機不在同一個鏈路上,那麼會查找下一跳路由器的 MAC 地址。

ARP 的工作機制

下面我們探討一下 ARP 的工作機制是怎樣的。假設 A 和 B 位於同一鏈路,不需要經過路由器的轉換,主機 A 向主機 B 發送一個 IP 分組,主機 A 的地址是 192.168.1.2 ,主機 B 的地址是 192.168.1.3,它們都不知道對方的 MAC 地址是啥,主機 C 和 主機 D 是同一鏈路的其他主機。

主機 A 想要獲取主機 B 的 MAC 地址,通過主機 A 會通過廣播 的方式向乙太網上的所有主機發送一個 ARP 請求包,這個 ARP 請求包中包含了主機 A 想要知道的主機 B 的 IP 地址的 MAC 地址。

主機 A 發送的 ARP 請求包會被同一鏈路上的所有主機/路由器接收並進行解析。每個主機/路由器都會檢查 ARP 請求包中的資訊,如果 ARP 請求包中的目標 IP 地址 和自己的相同,就會將自己主機的 MAC 地址寫入響應包返回主機 A

由此,可以通過 ARP 從 IP 地址獲取 MAC 地址,實現同一鏈路內的通訊。

如果是不同鏈路怎麼辦呢?

這就要使用到 代理 ARP 了,通常 ARP 會被路由器隔離,但是採用代理 ARP (ARP Proxy) 的路由器可以將 ARP 請求轉發給臨近的網段。使多個網段中的節點像是在同一網段內通訊。

ARP 快取

現在你知道了發送一次 IP 分組前通過發送一次 ARP 請求就能夠確定 MAC 地址。那麼是不是每發送一次都得經過廣播 -> 封裝 ARP 響應 -> 返回給主機這一系列流程呢?

想想看,瀏覽器是如何做的呢?瀏覽器內置了快取能夠快取你最近經常使用的地址,那麼 ARP 也是一樣的。ARP 高效運行的關鍵就是維護每個主機和路由器上的 ARP 快取(或表)。這個快取維護著每個 IP 到 MAC 地址的映射關係。通過把第一次 ARP 獲取到的 MAC 地址作為 IP 對 MAC 的映射關係到一個 ARP 快取表中,下一次再向這個地址發送數據報時就不再需要重新發送 ARP 請求了,而是直接使用這個快取表中的 MAC 地址進行數據報的發送。每發送一次 ARP 請求,快取表中對應的映射關係都會被清除。

通過 ARP 快取,降低了網路流量的使用,在一定程度上防止了 ARP 的大量廣播。

一般來說,發送過一次 ARP 請求後,再次發送相同請求的幾率比較大,因此使用 ARP 快取能夠減少 ARP 包的發送,除此之外,不僅僅 ARP 請求的發送方能夠快取 ARP 接收方的 MAC 地址,接收方也能夠快取 ARP 請求方的 IP 和 MAC 地址,如下所示

不過,MAC 地址的快取有一定期限,超過這個期限後,快取的內容會被清除

我們可以在 Linux 或者 Windows 中使用 arp 命令查看 ARP 快取。選項 -a 用於顯示兩個系統快取中所有的快取項。

在 Linux 中使用 arp 查詢快取

主要包含五項

  • 主機名 — 對應一個 IP 地址
  • 硬體地址類型
  • 硬體地址
  • 標誌
  • 本地網路介面

標誌主要分為三類: C 、M 或 P,C 表示的是由 ARP 協議動態學習。M 類可以通過 arp -s 增加一條。P 類表示的是 發布,對於任何 P 類項目,主機對輸入的 ARP 請求都返回一個 ARP 響應。這個選項用於配置代理 ARP。

比如我們在 Windows 中進行 ARP 快取查詢

Windows 中的 ARP 程式顯示了 IPv4 的地址,它的介面是十六進位數,Windows 版本還指出地址是手動輸入還是 ARP 動態學習的。在上面的例子中,既有靜態的也有動態的。48 位的 MAC 地址被顯示為 6 個十六進位數,在 Linux 中使用 : 號,在 Windows 中使用 - 進行分隔。

ARP 結構

我們上面說到,ARP 對想要知道 MAC 地址的目標主機會首先發送 ARP 請求,那麼這個請求中都攜帶哪些資訊呢?下面 cxuan 就來和你聊一下。下面是在乙太網中轉換一個 IPv4 的地址常用的 ARP 請求或響應的報文格式。

前面 14 個位元組構成標準乙太網的首部,前兩個欄位 DST 和 SRC 分別表示 乙太網的目的地址乙太網的源地址,乙太網的目的地址如果是 ff:ff:ff:ff:ff:ff 全部為 1 表示廣播地址,在同一廣播域中的所有乙太網介面可以接收這些幀。後面緊跟著的是 ARP 請求的長度/類型,ARP 請求 和 ARP 應答這個值為 0x0806

  • 硬體類型表示硬體地址的類型,硬體地址常見的有 MAC 物理或者乙太網地址,對於乙太網來說,此值為 1。
  • 協議類型 指出映射的協議地址類型,對於 IPv4 地址,這個值是 0x0800
  • 硬體大小協議大小 分別指出硬體地址和協議地址的位元組數。對於乙太網中使用 IPv4 的 ARP 請求或應答,它們的值分別是 6 和 4。
  • Op 欄位指出如果是 ARP 請求,Op = 1,ARP 應答 ,Op = 2,RARP 請求 Op = 3,RARP 應答,Op = 4。
  • 緊跟在 Op 之後的是 發送方硬體地址(MAC 地址)發送方的協議地址(IPv4 地址)目的硬體地址目的協議地址

ARP 抓包實戰

我們分別演示在 Mac 和 Linux 下的 ARP 報文的截獲

在 Mac 環境下,我這邊使用的是 WireShark 進行抓包,你可以從官網下載,地址如下

//www.wireshark.org/download.html

下載完成後閱讀安裝說明的手冊,閱讀後會發現需要安裝兩個插件,根據提示安裝即可,然後我們打開 WireShark ,開始報文攔截,下面是我解惑的 ARP 數據包

這款軟體很好的一個地方是對不同的數據包會有不同的顏色標識,這點非常好。

然後我們查看 ARP 請求

可以看到,這就是一個完整的 ARP 請求包,我們使用的硬體類型是乙太網,協議類型是 IPv4 ,默認值是 0x0800,然後硬體大小是 6 個位元組,協議大小佔用 2 個位元組,Op 的全稱是 Opcode ,Op = 1 表示這是一個 ARP 請求,然後是發送方的硬體地址和協議地址,接收方的硬體地址和協議地址。

ARP 響應如下

可以看到 Op = 2,表示這是 ARP 響應。

在 Linux 環境下,你可以使用 tcpdump 截獲 ARP 數據包,如果 tcpdump not found 的話,你可以使用 yum install -y tcpdump 安裝。

使用 tcpdump -i ens33 可以列印出在 ens33 地址下的數據包,下面是我截取的 ARP 數據包。

更多關於 tcpdump 的用法,你可以參考這篇部落格

//www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

大佬寫的很詳細,這裡就不再說明了。

ARP 快取超時

快取超時通常與 ARP 快取中的項有關係,arp 命令可以允許管理員設置永不超時。ARP 把保存在高速快取中的每一映射地址都設置生存時間,一般為 20 分鐘。如果是不完整的映射,那麼快取超時時間為 3 分鐘,不完整的映射通常會強制發送一條不存在主機的 ARP 請求。

RARP

與 ARP 相對的,RARP(Reverse Address Resolution Protocol) 是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協議,將印表機伺服器等小型嵌入式設備接入網路時會使用到。

平常我們設置 IP 地址一般會有兩種方式,手動設置DHCP 動態獲取

但是對於嵌入式設備來說,它沒有任何輸入介面,也無法通過 DHCP 獲取動態地址。

在這種情況下,就要使用到 RARP 了,你需要準備一個 RARP 伺服器,在這個伺服器上註冊設備的 MAC 地址和 IP 地址,然後將設備接入網路,設備會發出一條 IP 和 MAC 地址的查詢請求給伺服器,伺服器會告訴設備其 IP 地址和 MAC 地址。

ARP 攻擊

ARP 是一種非常不安全的協議,目前已經有很多涉及 ARP 的攻擊,最主要的就是使用代理 ARP 功能假扮主機,對 ARP 請求作出應答,通過偽造 ARP 數據包來竊取合法用戶的通訊數據,造成影響網路傳輸速率和盜取用戶隱私資訊等嚴重危害。

ARP 攻擊分類

ARP 主要攻擊方式分為下面這幾種

  • ARP 泛洪攻擊:通過向網關發送大量 ARP 報文,導致網關無法正常響應。首先發送大量的 ARP 請求報文,然後又發送大量虛假的 ARP 響應報文,從而造成網關部分的 CPU 利用率上升難以響應正常服務請求,而且網關還會被錯誤的 ARP 快取表充滿導致無法更新維護正常 ARP 快取表,消耗網路頻寬資源。
  • ARP 欺騙主機攻擊:ARP 欺騙主機的攻擊也是 ARP 眾多攻擊類型中很常見的一種。攻擊者通過 ARP 欺騙使得區域網內被攻擊主機發送給網關的流量資訊實際上都發送給攻擊者。主機刷新自己的 ARP 使得在自己的ARP 快取表中對應的 MAC 為攻擊者的 MAC,這樣一來其他用戶要通過網關發送出去的數據流就會發往主機這裡,這樣就會造成用戶的數據外泄。
  • 欺騙網關的攻擊: 欺騙網關就是把別的主機發送給網關的數據通過欺騙網關的形式使得這些數據通過網關發送給攻擊者。這種攻擊目標選擇的不是個人主機而是區域網的網關,這樣就會攻擊者源源不斷的獲取區域網內其他用戶韻數據.造成數據的泄露,同時用戶電腦中病毒的概率也會提升。
  • 中間人攻擊: 中間人攻擊是同時欺騙區域網內的主機和網關,區域網中用戶的數據和網關的數據會發給同一個攻擊者,這樣,用戶與網關的數據就會泄露。
  • IP地址衝突攻擊: 通過對區域網中的物理主機進行掃描,掃描出區域網中的物理主機的 MAC 地址,然後根據物理主機的 MAC 進行攻擊,導致區域網內的主機產生 IP 地址衝突,影響用戶的網路正常使用。

總結

ARP 是 TCP/IP 實現中的一個基本協議,它通常在應用程式或用戶沒有察覺到的情況下運行。ARP 可以用於映射 IP 地址為 MAC 地址。

這篇文章我們主要講了 ARP 的基本原理,ARP 的幀結構,ARP 的工作機制,以及 ARP 代理、ARP 攻擊、RARP 和 ARP 的區別等。

如果這篇文章讀者們覺得還不錯,跪求點贊、留言,你的支援將是我繼續肝文的動力!

**另外,添加我的微信 becomecxuan,加入每日一題群,每天一道面試題分享,更多內容請參見我的 Github,成為最好的 bestJavaer

我自己肝了六本 PDF,微信搜索「程式設計師cxuan」關注公眾號後,在後台回復 cxuan ,領取全部 PDF,這些 PDF 如下

六本 PDF 鏈接