ARP協議淺析(1):緣起

ARP協議淺析(1):緣起

下一章:ARP協議淺析(2):協議分析

(關心技術的朋友可以跳過)

朝花夕拾

一直想寫一個局域網IP查看工具,用來查詢一個局域網的以使用的IP地址。畢業一年多了,仍然牽掛着這個網絡小工具。當時由於水平有限未能完成,8月底正好有這個時間,於是花了一個星期的時間,終於完成了。其間的一些體會寫出來和大家分享。此文適合於對TCP/IP協議有所瞭解和具有一定編程基礎的朋友。

IP地址衝突

2002年筆者所在宿舍樓開通校園網,大家無比興奮,但是很快煩惱就來了。筆者所在宿舍樓共6層,計算機多達400多臺(可能還要多一些),而只分配了一個CIP段,254IP地址,IP地址太少了,IP地址衝突非常激烈。

“瓜分之”

最初大家很早起牀打開計算機來佔住IP地址,那時候晚上是停電的。所以每天IP地址都要在早上重新被“瓜分”。有個哥們每天早上起來推電閘,搞得大家覺都睡得不好。僧多粥少,實屬無奈。

宿舍裏有好幾臺電腦,於是先佔住IP的同志有義務爲後面的同志提供查詢義務,隨便設置一個IP,可能別人已經使用了。好在Window2000可以動態該IP地址,無需重啓。WinXP更強,修復一下可以恢復過來。Win98就沒有這麼幸運,經常被衝突死機,於是那個時候Win98就被大家無情的拋棄了。問題是:你可以改動IP設置,但是你並不知道那些IP沒有被其他機器使用。

那個時候,經常你下網不到一分鐘就會被別人佔住IP地址。如果是網絡遊戲,就慘了,裝備

撿不到,還可能被別的玩家砍死。不過筆者不玩網遊,所以體會不到他們的痛苦。

尋找空閒IP

Ping命令是一個最常見的工具。Ping命令不好用,一個一個的Ping,很浪費時間,沒有時效性。另外天網防火牆等軟件可以設置不響應Ping,所以很不準確。看着別人上網,自己設置一個IP衝突一個,真是鬱悶。如果有個工具可以準確的查看局域網的IP使用情況該多好啊!

當時在網上搜索了很久,發現了一個基於UDP協議的查看IP的程序,還有源代碼。效果改觀了很多,它使用一個獨立的線程發送,利用socket接受,缺點是天網可以屏蔽它。

當時開始思考這個問題,每臺機器的唯一不變的是網卡的物理地址即Mac地址,局域網到底是用什麼機制來實現IP地址到Mac的映射了,這可是通信的基本的問題!

因爲對網絡協議感興趣的原因,後來查閱很多種資料,包括RFC的英文文檔,用代理在國外的找的,該文檔介紹各種於網絡相關的標準,有各種協議的規範。我知道了一些ARP(Address Resolution Protocol,地址解析協議)方面的知識,後面介紹詳細這個協議。

不久,真的出現了這麼一個小軟件。據說是這棟樓的一個VC高手寫的,看到這個東西的只需要輸入一個查詢範圍如202.4.151.1-202.4.151.254它就會快速的查詢IP地址的使用情況。當時看不到源代碼,佩服了半天。不過有一點可以肯定,它使用的是ARP協議,用到了多線程。

當時筆者僅僅知道一些網絡協議,沒有編過Winsock方面的程序,多線程也很弱。但當時就想寫一個工具,苦於知識經驗缺乏,以後有機會要寫一個類似的小工具。

峯迴路轉

大概3個月後,學校調查後採取了措施,擴大了IP的範圍,幾乎每臺一個IP。問題不復存在了,想編寫一個IP-MAC查詢的工具的念頭從此沉底。

舊“情”復燃

之後又發生了很多情。考程序員,做畢業設計,工作,再換工作從機械設計回到軟件開發。加班,學習,學習,加班日子過得真快。

《深入淺出MFC》《Windows核心編程》《Windows網絡編程技術》看了很長時間了,漸漸的領悟了一些東西,多線程也沒有那麼懼怕了。特別是有個項目涉及到了UDP多點傳輸,當時把socket深入的看了幾章,調試了幾個這個方面的程序,對這個模型熟悉起來。感覺有足夠的知識來寫這個東西了。

現在終於有了時間,也感覺自己有這個實力了,但還沒有想到具體怎麼寫?到網上搜所(在前人的基礎上有所超越),於是找到了幾篇關於ARP的文章,下面的兩篇是其一。同時也開始接觸Row Socket(原始套接字),研究Sniffer(嗅探器)。當時想,Ping的時候,如果不知道相應的IP地址的MAC地址該如何處理,只能還是回到ARP協議,對了上層協議必須建立在下層協議的基礎上工作!Row Socket雖然原始,卻只能到網絡層,而ARP協議在鏈路層工作,因爲在網線或設備識別的只能是MAC地址,同時它不是物理層。

WinPcap利器

武俠世界盛傳:“真氣所至,草木皆爲利器”。

在查找Row Socket資料時,發現了WinPcap庫,得知一些網絡工具是基於它開發的,於是着手研究WinPcap庫。通過閱讀幫助文檔和練習裏面的例子,逐漸對它有了深入認識。它經封裝了對設備的操作,可以直接發送鏈路層的包。其實,只要你瞭解了各種包格式,你就可以實現ISO/OSI的各個協議層的功能!OKWinPcap能夠實現ARP協議的應用,剩下的就是設計編碼。

真氣是ARP工作原理和流程,草木就是具體程序的代碼。當然沒有必要從頭做起,利用成熟的庫可以事半功倍。

實踐

WinPcap的參考幫助文檔是Web格式的,沒有索引(不如MSDN方便)

筆者也沒有徹底研究,涉及到的代碼,有較爲詳細的註釋。

首先參考了《手把手教你玩轉ARP》,作者提供了詳細的代碼,講的也很詳細,於是沒有花多少時間就看明白了。但是作者的工程是用VS2003寫的,但沒有說在哪個Window版本上通過,估計上Win2000,轉換到VC6的工程後,在WinXP上卻沒有提到的arp緩衝條目增加的情況。

這個問題困擾了兩天,最後發現之前下載的文章《詳談調用WinPcap驅動寫arp多功能工具》有收發arp包的功能。這個例子離筆者的需要很近。該代碼是console工程,必須改造成MFC App。這倒不是很難。簡單的設計了界面,具體實現需要的就是時間。

前後用了一個星期,利用別人的間隙時間使用電腦,着實不方便。中間還有幾個細節問題,最後還是完成了,感覺不錯。

 

下一章:ARP協議淺析(2):協議分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章