關於ARP協議的基礎知識
1.ARP的工作原理
本來我不想在此重復那些遍地都是的關於ARP的基本常識,但是為了保持文章的完整性以及照顧初學者,我就再啰嗦一些文字吧,資深讀者可以直接跳過此節。
我們都知道以太網設備比如網卡都有自己全球唯一的MAC地址,它們是以MAC地址來傳輸以太網數據包的,但是它們卻識別不了我們IP包中的IP地址,所以我們在以太網中進行IP通信的時候就需要一個協議來建立IP地址與MAC地址的對應關系,以使IP數據包能發到一個確定的地方去。這就是ARP(Address Resolution Protocol,地址解析協議)。
講到此處,我們可以在命令行窗口中,輸入
arp –a
來看一下效果,類似於這樣的條目
210.118.45.100 00-0b-5f-e6-c5-d7 dynamic
就是我們電腦里存儲的關於IP地址與MAC地址的對應關系,dynamic表示是臨時存儲在ARP緩存中的條目,過一段時間就會超時被刪除(xp/2003系統是2分鍾)。
這樣一來,比如我們的電腦要和一台機器比如210.118.45.1通信的時候,它會首先去檢查arp緩存,查找是否有對應的arp條目,如果沒有,它就會給這個以太網絡發ARP請求包廣播詢問210.118.45.1的對應MAC地址,當然,網絡中每台電腦都會收到這個請求包,但是它們發現210.118.45.1並非自己,就不會做出相應,而210.118.45.1就會給我們的電腦回復一個ARP應答包,告訴我們它的MAC地址是xx-xx-xx-xx-xx-xx,於是我們電腦的ARP緩存就會相應刷新,多了這么一條:
210.118.45.1 xx-xx-xx-xx-xx-xx dynamic
為什么要有這么一個ARP緩存呢,試想一下如果沒有緩存,我們每發一個IP包都要發個廣播查詢地址,豈不是又浪費帶寬又浪費資源?
而且我們的網絡設備是無法識別ARP包的真偽的,如果我們按照ARP的格式來發送數據包,只要信息有效計算機就會根據包中的內容做相應的反應.
試想一下,如果我們按照ARP響應包的相應的內容來刷新自己的ARP緩存中的列表,嘿嘿,那我們豈不是可以根據這點在沒有安全防范的網絡中玩些ARP包的小把戲了?在后面的文章里我就手把手來教你們如何填充發送ARP包,不過先別急,我們再繼續學點基礎知識^_^
2.ARP包的格式
既然我們要來做一個我們自己的ARP包,當然首先要學習一下ARP包的格式。
從網絡底層看來,一個ARP包是分為兩個部分的,前面一個是物理幀頭,后面一個才是ARP幀。
首先,物理幀頭,它將存在於任何一個協議數據包的前面,我們稱之為DLC Header,因為這個幀頭是在數據鏈路層構造的,並且其主要內容為收發雙方的物理地址,以便硬件設備識別。
DLC Header
|
|||
字段
|
長度(Byte)
|
默認值
|
備注
|
接收方MAC
|
6
|
|
廣播時,為 ff-ff-ff-ff-ff-ff
|
發送方MAC
|
6
|
|
|
Ethertype
|
2
|
0x0806
|
0x0806是ARP幀的類型值
|
圖1 物理幀頭格式
圖1是需要我們填充的物理幀頭的格式,我們可以看到需要我們填充的僅僅是發送端和接收端的物理地址罷了,是不是很簡單呢?
接下來我們看一下ARP幀的格式.
ARP Frame
|
|||
字段
|
長度(Byte)
|
默認值
|
備注
|
硬件類型
|
2
|
0x1
|
以太網類型值
|
上層協議類型
|
2
|
0x0800
|
上層協議為IP協議
|
MAC地址長度
|
1
|
0x6
|
以太網MAC地址長度為 6
|
IP地址長度
|
1
|
0x4
|
IP地址長度為 4
|
操作碼
|
2
|
|
0x1表示ARP請求包,0x2表示應答包
|
發送方MAC
|
6
|
|
|
發送方IP
|
4
|
|
|
接收方MAC
|
6
|
|
|
接收方IP
|
4
|
|
|
填充數據
|
18
|
|
因為物理幀最小長度為64字節,前面的42字節再加上4個CRC校驗字節,還差18個字節
|
圖2 ARP幀格式
我們可以看到需要我們填充的同樣也只是MAC,IP,再加上一個1或2的操作碼而已。
3.ARP包的填充
1) 請求包的填充:
比如我們的電腦MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1
我們想要查詢 192.168.0.99的MAC地址,應該怎么來做呢?
首先填充DLC Header,通過前面的學習我們知道,想要知道某個計算機對應的MAC地址是要給全網發送廣播的,所以接收方MAC肯定是 ffffffffffff,發送方MAC當然是自己啦,於是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當然我編的程序比較智能,會根據你選擇的ARP包類型幫你自動填入一些字段,你一用便知^_^)。
DLC Header
|
||
字段
|
長度(Byte)
|
填充值
|
接收方MAC
|
6
|
ffffffffffff
|
發送方MAC
|
6
|
aaaaaaaaaaaa
|
Ethertype
|
2
|
0x0806
|
圖3 ARP請求包中 DLC Header內容
接下來是ARP幀,請求包的操作碼當然是 1,發送方的MAC以及IP當然填入我們自己的,然后要注意一下,這里的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,於是,如圖,
ARP Frame
|
||
字段
|
長度(Byte)
|
填充值
|
硬件類型
|
2
|
1
|
上層協議類型
|
2
|
0800
|
MAC地址長度
|
1
|
6
|
IP地址長度
|
1
|
4
|
操作碼
|
2
|
1
|
發送方MAC
|
6
|
aaaaaaaaaaaa
|
發送方IP
|
4
|
192.168.0.1
|
接收方MAC
|
6
|
任意值 xxxxxxxxxxxx
|
接收方IP
|
4
|
192.168.0.99
|
填充數據
|
18
|
0
|
圖4 ARP請求包中 ARP幀的內容
如果我們構造一個這樣的包發送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發來的一個響應包,我們可以查看一下我們的ARP緩存列表,是不是多了一項類似這樣的條目:
192.168.0.99 bb-bb-bb-bb-bb-bb
是不是很神奇呢?
我們再來看一下ARP響應包的構造
2) 響應包的填充
有了前面詳細的解說,你肯定就能自己說出響應包的填充方法來了吧,所以我就不細說了,列兩個表就好了
比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發一個ARP響應包,告訴它我們的MAC地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個字段
DLC Header
|
||
字段
|
長度(Byte)
|
填充值
|
接收方MAC
|
6
|
bbbbbbbbbbbb
|
發送方MAC
|
6
|
aaaaaaaaaaaa
|
Ethertype
|
2
|
0x0806
|
圖5 ARP響應包中 DLC Header內容
ARP Frame
|
||
字段
|
長度(Byte)
|
填充值
|
硬件類型
|
2
|
1
|
上層協議類型
|
2
|
0800
|
MAC地址長度
|
1
|
6
|
IP地址長度
|
1
|
4
|
操作碼
|
2
|
2
|
發送方MAC
|
6
|
aaaaaaaaaaaa
|
發送方IP
|
4
|
192.168.0.1
|
接收方MAC
|
6
|
bbbbbbbbbbbb
|
接收方IP
|
4
|
192.168.0.99
|
填充數據
|
18
|
0
|
圖6 ARP響應包中 ARP幀的內容
這樣192.168.0.99的ARP緩存中就會多了一條關於我們192.168.0.1的地址映射。