我把自己以往的文章彙總成為了 Github ,歡迎各位大佬 star
https://github.com/crisxuan/bestJavaer
公眾號連載計算機網路文章如下
那麼開始我們本篇文章
只要確定了 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
進行抓包,你可以從官網下載,地址如下
https://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 的用法,你可以參考這篇部落格
https://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 如下