我把本身以往的文章彙總成爲了 Github ,歡迎各位大佬 star
https://github.com/crisxuan/bestJavaerhtml
公衆號連載計算機網絡文章以下git
我畫了 40 張圖就是爲了讓你搞懂計算機網絡層github
那麼開始咱們本篇文章服務器
只要肯定了 IP 地址後,就可以向這個 IP 地址所在的主機發送數據報,這是咱們所熟知的事情。可是再往深了想,IP 地址只是標識網絡層的地址,那麼在網絡層下方數據鏈路層是否是也有一個地址可以告訴對方主機本身的地址呢?是的,這個地址就是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 協議的全稱是 Address Resolution Protocol(地址解析協議)
,它是一個經過用於實現從 IP 地址到 MAC 地址的映射,即詢問目標 IP 對應的 MAC 地址 的一種協議。ARP 協議在 IPv4 中極其重要。
注意:ARP 只用於 IPv4 協議中,IPv6 協議使用的是 Neighbor Discovery Protocol,譯爲鄰居發現協議,它被歸入 ICMPv6 中。
簡而言之,ARP 就是一種解決地址問題的協議,它以 IP 地址爲線索,定位下一個應該接收數據分包的主機 MAC 地址。若是目標主機不在同一個鏈路上,那麼會查找下一跳路由器的 MAC 地址。
下面咱們探討一下 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 請求轉發給臨近的網段。使多個網段中的節點像是在同一網段內通訊。
如今你知道了發送一次 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 查詢緩存
主要包含五項
標誌主要分爲三類
: 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 對想要知道 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。發送方硬件地址(MAC 地址)
,發送方的協議地址(IPv4 地址)
,目的硬件地址
和 目的協議地址
。咱們分別演示在 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 把保存在高速緩存中的每一映射地址都設置生存時間,通常爲 20 分鐘。若是是不完整的映射,那麼緩存超時時間爲 3 分鐘,不完整的映射一般會強制發送一條不存在主機的 ARP 請求。
與 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 響應報文,從而形成網關部分的 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 以下