ZWeily的小品文——《Something about TCP/IP》系列(1)

Something about TCP/IP<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

引言

 

也許有不少朋友看過我的小品文系列(好像比較臭美了一點,呵呵),不過那一系列已經停滯了很久了,一直沒有再寫新的了,原因也許很多吧,不過自己比較懶也是一個原因。不過現在我既然做了ABP這邊網絡版塊的斑竹麼,應該稍微用功一點,多寫點東西給大家分享。由於目前我平時一直和網絡相關的東東打交道,所以就想把自己比較瞭解的一些知識寫下來,我想總會有讀者感覺有點收穫的。

 

這個“Something about TCP/IP”麼,按照我自己現在的想法,打算還是構成一個系列的文章吧,雖然不知道我會寫多少,我想我應該儘量寫吧,最好是從下層的ARP一直寫到上層的應用協議。不過我不會像那些專業書籍那樣一點點細細道來,我會按照自己的想法和思路,挑一些比較有意思或者有價值的東西來講。所以這一系列的文章不會講的很詳細,不過每篇的相關主題總有一點比較詳細討論的地方,也會盡量結合一些有價值的例子來講述。現在我只有第一篇的想法,也就是談一點關於ARP的東東。以後麼,一點點來吧,只要有點靈感,我就會來好好寫一篇。

 

哦,這裏還有一個講述的形式問題,我還是比較喜歡那種小品文的對話形式,所以我也儘量用這種方式來寫。不過這種方式可能對我來說寫起來還是有些難度的,畢竟需要設計一些場景、人物、具體的事件等等。這個麼,等大家開始看第一篇的時候就會知道了。^_^

 

 

一、             Something about ARP

 

畫外音:Young已經到我們小組有段時間了,C++的一些基本的東西也學得差不多了,因爲我們這裏也常會有一些網絡相關的項目,於是我就給Young一個新的任務——自學一些網絡的基本知識,丟給他的書麼,就是Stevens的那個三卷套的第一卷。在Young剛拿到這本書的時候,那種久違的“無辜”的眼神又一次出現了……

 

“真鬱悶,這程序似乎還是有一些小問題……”我看着滿屏幕的代碼,在那裏一個人自言自語,“算了,先放一下,去泡杯紅茶吧。”

 

於是我就拿起杯子,往飲水機的方向走去。在經過Young桌子的時候,發現這傢伙居然在聊天,給她的那本書攤在桌上,好像沒看多少的樣子。嗯,該稍微整整她。

 

泡好了我的紅茶,回到了自己的位子上,“得好好謀劃一下如何整整Young,給她一點小小的教訓”,我正在考慮這個問題的時候,同事Kevin跑了過來,打斷了我的思路。

 

“我們什麼時候開始做壓力測試?”Kevin問道。

 

“這個麼,等功能測試都完成了之後再做吧。”我順口答道。“稍等,你說的‘壓力測試’?”我的靈感來了,哈哈。

 

“對啊,壓力測試,有什麼問題嗎?”Kevin一臉疑惑的樣子。

 

“咳,沒啥事情。只是確認一下而已。嗯,我有個建議,在給那塊開發板作壓力測試之前,我們先拿PC作一下同樣的測試,看看PC的情況如何,這樣也好有個對照嘛。”

 

“這主意不錯,是該這麼做一下。那麼我們怎麼個測法呢?用哪臺機器來測呢?”Kevin邊問這個問題,邊掃視四周,似乎在尋找沒人用的機器。

 

“不用找了,那邊有1臺機器,本來是Pisces用的,這段日子她出差去了,沒人用,就拿她的機器作爲測試對象吧。這個測試麼只要能開機進系統就行,所以不需要知道她的密碼,只要用我們域的public帳號登陸就可以了。你去準備你的測試工具,我去開Pisces的機器,好了我再叫你。”

 

說完這些,我起身往Pisces的機器走去。起來的時候,我還留意了一下Young,這傢伙居然開了5MSN窗口在聊,真是#$%@$%……

 

我按照計劃,做好了準備工作,然後就讓Kevin開始測試。看到Kevin點了Start按鈕後,我就知道,不出10分鐘,Young就會受到懲罰了,嘿嘿~~

 

大約過了5分鐘……

 

“咦,我的機器怎麼這麼卡?”我聽到了Young在那裏一個人嘀咕。

 

大約又過了1分鐘……

 

Weily,你能過來幫我看一下嗎?”Young似乎解決不了問題,開始向我求救了。

 

“有啥問題啊?我這邊有點忙,稍等一會兒吧。”嘿嘿,你就再多接受一會兒教訓嘛。

 

Young似乎沒那麼好的耐心,一溜小跑跑到我這邊,然後就在我邊上不依不饒了,“師傅,過來看一下嘛,人家的機器好像出問題了,不能動了嘛,快點來救救我吧。怎麼說,英雄也應該救美的嘛……”

 

“好吧,好吧,怎麼說,我也算是英雄了,看到需要幫助的,即使不是美人也應該幫一把的嘛,那我就隨你過去看看到底是啥問題吧。”我知道Young這個傢伙最能磨,基本上沒幾個人能受得了的,我還是快點過去,省得被她煩死。

 

到了她那臺機器跟前,我裝作啥都不知道的樣子,在那邊按按鍵盤,動動鼠標,呵呵,果然機器卡得非常厲害,反應遲鈍得很啊,而且很明顯的是,那五個最小化了的MSN窗口都在那邊閃着,但就是點不開,哈哈,我的目的算是達成了。

 

“你這臺機器好像出問題了嘛,是不是中病毒了?”我繼續裝作啥都不知道。

 

“沒有吧,我都沒裝過什麼東東啊,就剛纔一會兒就變成這樣了。而且前面我也調出任務管理器看過,沒有可疑進程啊,都是常見的進程。”Young越說越無辜了,看她那副可憐的樣子,算了,那就饒了她吧,不過在停止之前,我還是先給她上一課吧。

 

“你稍等一下,我去我的機器上抓一下包看看。”說完,我立馬回到自己機器上,打開了Ethereal,用混合模式抓了一下包,裝作思考了一番,然後跑到Kevin那裏打了個招呼,再走到Young那裏。沒過幾分鐘,一切就都正常了。

 

“師傅啊,這是怎麼回事啊?怎麼現在就好了呢?”Young一臉疑惑。

 

“其實,這個的根本原因在於你的機器由於網絡負荷過重,導致性能大幅下降,說白了呢,也就是你的機器受到了攻擊。”

 

“啊?不會吧?連我的機器都會被黑客看中?”Young更加不解了。

 

“這個不一定是黑客,也可能是一些程序錯誤引起的嘛。從我剛纔抓包的情況來看,發現很多報文都往你的機器發了,而你的機器不斷地接收這些報文,然後由於這些報文的IP地址不是你的,再把這些報文丟棄。就是這些報文造成你的機器速度變慢的。”

 

“咦?爲啥目的地址不是我IP地址的報文會發到我這裏呢?”

 

“在回答你這個問題之前,我先問你一個問題,我給你的那本書你看了多少了?”

 

“這個……”Young吐了吐舌頭,做了個鬼臉,“第一章還沒看完……”

 

“那你今天都幹啥了?”我得對她嚴厲一點,拷問拷問。

 

“這個麼…… 我在和朋友聊天嘛……”Young似乎知道自己錯了,那個表情我不知道用無辜來形容好,還是用誠懇來形容好。

 

“算了,看你還算老實,我就給你上這麼一課吧。其實今天你遇到的情況和所謂的‘ARP欺騙’有關。關於ARP協議的知識,在給你的那本書的第4章有詳細的講解。我就簡單地給你講一些基本的東西。”

 

“好呀好呀!這樣我可以省點力了,嘻嘻!”Young一聽到有可以偷懶的機會,就開心得很啊。

 

“你不要開心得太早,等我給你上完這堂課,會給你佈置任務的……”打擊Young也是我平時生活中的一大樂趣,嘿嘿!

 

“師傅啊,什麼是ARP?”Young似乎總在關鍵的時候打斷我。

 

ARP的全稱麼,是Address Resolution Protocol。在TCP/IP協議族裏,這是最基本的協議。從名字上就可以看出來,它是用來作地址解析的。”

 

“地址解析?你是說IP地址解析?不是有DNS之類的可以將域名解析爲IP地址的嘛,還要ARP做啥啊?”Young又在那裏不懂裝懂了。

 

“你就少在那裏丟人現眼了,好好聽講。”

 

“遵命!”

 

“你的網絡知識真該好好補補了。你要知道,在IP地址之下,還有一個物理地址,也就是通常所說的網卡的MAC地址。在TCP/IP協議棧中,IP層位於主機-網絡層之上,因此IP地址是一種邏輯上的地址。而在實際網絡傳輸的時候,需要一個實際的物理地址,該地址纔是報文真正發送的源地址和目的地址。就好比我們這個局域網裏,你的IP地址是192.168.0.123,而你網卡的MAC地址是00-0E-27-59-AD-46。這個MAC地址你可以在Windows的命令行方式下,用ipconfig /all來查看的。”

 

“哦?好像蠻有意思的,讓我去試試看。”她又興匆匆地跑到自己的機器前,打開了命令行方式,然後就傻在那裏了。“師傅,你說的那個命令怎麼拼來着?”

 

我暈!“I-P-C-O-N-F-I-G,空格,斜槓,A-L-L”我就一個字母一個字母地報給她,在我報的時候,聽到了幾個同事在偷笑,呵呵,看來大家以後又有茶餘飯後的談資了。

 

Young,看好了就快過來,繼續剛纔的話題。”

 

“來了!馬上!”Young邊說邊跑過來。

 

“好,我們繼續。剛纔講到IP地址和MAC地址。其實在發送一個IP報文的時候,必須得知目的方的MAC地址,這樣才能正確地發送。例如我們這種以太網內,所有的報文都是在鏈路上廣播的,也就是只要有一個報文在鏈路上出現,每臺機器都會收到。因此,一臺機器接收到一個報文的時候,網卡先判斷目的MAC地址是不是自己,如果不是,就丟掉該報文,否則,就收到下該報文,作一些處理之後,交給IP層作進一步地處理。這麼一說你就應該知道MAC地址的重要性了吧?”

 

“嗯。瞭解了。那麼ARP協議也就是將IP地址解析爲MAC地址咯?”Young似乎明白了什麼。

 

“對,簡單的說就是這個作用。當IP層要發送一個報文的時候,就交給鏈路層,鏈路層調用ARP,來獲得目的IP對應的目的MAC地址,然後構造成一個數據幀,發送到物理鏈路上。但這裏的關鍵就在於ARP如何獲得目的IP對應的MAC地址。”

 

“是啊。而且我覺得ARP協議肯定有問題,否則剛纔那些不是發給我機器的報文怎麼都發到我這裏來了呢?”

 

“不要急,讓我先解釋一下ARP如何得到MAC地址的。其實這個過程分爲兩步,首先ARP先查找本地的ARP Cache表,如果在這個表中查到了目的IP對應的MAC地址,那麼就將該MAC地址作爲目的MAC地址。如果在這個表中沒有找到,那麼就會發送一個ARP Request報文,該報文是鏈路層的廣播,目的IP匹配的那臺機器收到這個報文的時候,就會發送對應的ARP Reply報文,將自己的MAC地址發給源端,然後源端收到該ARP Reply報文後,將其中包含的數據讀出,將該MAC作爲目的MAC,並在本地的ARP Cache中建立一條新的表項,以便下次發送的時候能夠直接查找到,省去了Request/Reply的過程。”

 

“我有個問題,在ARP Cache中建立了新的表項之後,以後就一直不會發送對於該目的IPARP Request報文了嗎?萬一以後大家的IP地址改了,比如你的機器用我原來的那個IP,那豈不是就會發生前面我遇到的那種攻擊了嗎?”

 

“嗯,你說的對,不過你說的這個問題ARP的設計者已經考慮進去了。ARP要求本地保留的每條ARP信息都有一個超時時間,如果一段時間沒有更新過該表項的話,這條表項就會被刪除。這個時間在Windows系統中是210分鐘左右。”

 

“哦?那麼我剛纔遇到的那個問題到底是怎麼發生的呢?”Young似乎又糊塗了。

 

“你遇到的是ARP欺騙的情況。這裏要說明ARP存在的一個問題。ARP協議設計的時候,充分考慮了效率問題,所以當一臺機器收到一個ARP報文,無論是Request還是Reply報文,都會將其中包含的IP地址與物理地址的映射信息保存到本地的ARP Cache表中。這麼做的好處在於可以減少ARP報文的發送,提高效率。但是,問題在於如果收到的ARP報文中的信息是錯誤的,那麼也就將錯誤的信息保存到了本地ARP Cache表中了。”

 

“你的意思是剛纔我就遇到了這種情況?”Young瞪着大眼睛望着我。

 

“對的。前面我抓包的情況來看,Kevin的機器在發送大量的報文,這些報文的目的IP地址是192.168.0.125,而目的MAC地址卻是你機器的MAC地址。然後我去問了一下Kevin,原來他在拿Pisces的機器作壓力測試,快速地發送大量的報文,而PiscesIP就是192.168.0.125。於是,凡是應該發給Pisces機器的數據包都發到你那裏去了。後來我叫他清空了一下他機器的ARP Cache表,就好了。”

 

“是Kevin在搗鬼!我去找他算賬!!”Young氣沖沖的樣子,似乎要把Kevin撕成兩半,這個樣子的Young我還是第一次見到。

 

“別!你先聽我繼續講下去。其實Kevin是無辜的,他只是開着那個測試工具而已,而且他也在那裏鬱悶爲啥測試報文發出去都沒有迴應。你應該記得我剛跟你說過的那個ARP表項的有效性問題吧。如果那條ARP信息是KevinWindowsarp命令手工添加的話,過了一段時間也會失效的。依我的判斷,應該是某臺機器的一個程序以較短的時間間隔往Kevin的機器發送ARP Reply報文,該報文包含的信息就是PiscesIP和你的MAC。因此,Kevin機器上的ARP表項在每次失效之前,就又得到了更新,這就是引起他總把報文發送到你那裏的原因。至於那個程序麼,可能是有一個有錯的程序在某臺機器上運行着,所以,Kevin是無辜的啦。”

 

“哦,關於ARP的基本概念就這些了吧?我都聽明白了。只是不知道是不是有誰故意在整我,這個讓我很鬱悶,下次讓我抓到的話,我一定不放過他!”Young似乎還沒有消氣,看來我還是繼續裝無辜爲好。

 

“今天給你上課麼,就這些內容了,但這麼講都是很概要的,具體ARP報文的格式,以及其他一些相關的網絡知識要你自己去看了。”

 

“嗯,我會好好看看的。”Young有時候還真的是很聽話,不過就我的瞭解,這些都是表面現象…… 所以,得給她施加一點壓力。

 

“慢點,你先別走,課上完了,課後作業還沒佈置呢。回去你把那本書的前4章看完,給我寫一份報告,後天一早交給我。”

 

“啊?時間這麼緊啊?我怕來不及……”Young又開始裝可憐了。

 

“你有空在那裏聊天,就沒空看書嗎?交不出來的話,下次再給你一點顏色瞧瞧。”呀,我好像說漏嘴了……

 

“下次??難道今天的事情都是你在搞鬼?你!你!你!!”Young的火又上來了。我看我還是走爲上策……

 

 

注:
 
1.這裏說的“那本書”麼,就是W. Richard. Stevens那套“TCP/IP Illustrated”的第一卷“The Protocol”,中譯本叫“TCP/IP詳解 卷一:協議”。 
  2.其實文中所說的Young受到的攻擊,也算是一種DoS的攻擊。 
  3.關於文中提到的那個我用來整Young的那個發ARP Reply報文的工具,我會在寫Winpcap教程的時候會有詳細的程序,大家期待一下吧。^_^

發佈了56 篇原創文章 · 獲贊 1 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章