本文來自微信公眾號:編程技術宇宙 (ID:xuanyuancoding),作者:軒轅之風 O
阿 Q 造訪
我是一個網卡,居住在一個機箱內的主板上,負責整臺計算機的網絡通信,要是沒有我,這里就成了一個信息孤島了,那也太無聊了~
上個周末,服務器斷電維護了,這是我難得的休息時間,我準備打個盹兒瞇一會兒。
這才剛合上眼,CPU 一號車間的阿 Q 跑過來串門了。
“怎么是你小子,聽說你背后說了我很多壞話啊!今天怎么想起找我來了”
“網卡老哥,你這都聽誰造的謠,我想來拜訪你很久了,這不平時工作太忙抽不開身,今天停電了一有空就找你來了嘛!”,阿 Q 笑著說到。
“你可是大忙人,無事不登三寶殿,說吧,找我什么事兒”
阿 Q 露出了尷尬而不失禮貌的微笑,“那我就開門見山了,這不年底了嗎,咱們廠里最近評優(yōu)呢,想學點網絡知識,特來向你討教討教”
“就這啊,好說好說,來里邊坐”,我招待阿 Q 進門坐下。
剛剛落座,阿 Q 就忍不住提問:“老哥,你們網卡是怎么工作的?聽說你可以抓到別的主機通信的數據包?可以給我露一手嗎?”
“唉,現在不行了”,我嘆了一口氣。
“咋了這是?”
我抬頭凝望,開始給阿 Q 講起了我的故事。
集線器時代
很久很久以前,那時候網絡中的各個計算機都是通過一個叫集線器 Hub 的家伙來相連的,通過集線器,我們大家在物理上構成了一個星型的網絡,還給取了個名字:以太網。那時候我們的傳輸速度能做到 10Mbps,在那個年代,已經非常了不起了!。
集線器這家伙,不知道該說他笨,還是該說他懶,他從來不會管數據是誰發(fā)給誰,只是一個沒有感情的轉發(fā)機器,工作在物理層,把收到的信號做一個增強處理后就一股腦的發(fā)給所有端口。
這樣一來,我們在邏輯上就變成了一個總線型網絡了??偩€屬于公共資源,由所有連接在上面的主機共享,有人在傳輸數據的時候其他人就得等著,不然數據就會發(fā)生沖突,全亂套了。
為了讓大家都能和平共處,不必為了爭搶線路發(fā)生不愉快,我們制定了一套規(guī)則:CSMA/CD。
每次要發(fā)送數據之前,我都得要監(jiān)聽一下線路上是否空閑,如果有別人在傳輸數據,那我就得等待。至于等待多久,我也不知道,因為這是一個隨機值。
等到空閑的時候,我就可以發(fā)送數據了。不過一邊發(fā)送,我還得一邊檢測是否有沖突發(fā)生,因為說不定有別人跟我一樣以為現在空閑都在發(fā)送數據呢!
所以這就是 CSMA / CD—— 載波偵聽多路訪問 / 沖突檢測名字的來歷了。
但是如果數據的長度太短,我很快就發(fā)送完了,結果先頭部隊還在路上,這之后再遇到沖突那我就發(fā)現不了了。為了應對這種情況,我們還得考慮即便是在極端情況下發(fā)生沖突,我們還是能夠檢測到。
我們這個網絡能夠支持的最遠距離是 2500 米,極端情況下,到達最遠端的時候沖突才發(fā)生。沖突信號得趕在我發(fā)送完最后一個 bit 之前傳回來,這一來一回就是 5000 米。
線路上的信號跑個來回需要 57.6 微秒,我們的傳輸速度是 10Mbps,一個來回的時間我就能發(fā)送 576bit,也就是 72 個字節(jié),除開 8 個字節(jié)的幀前導符和幀開始符,剩下的以太網幀長度不能低于 64 個字節(jié),這樣就算在最遠兩端發(fā)生的碰撞沖突都能及時傳遞回去被檢測到。
有了這套協議,大家再也不用爭搶,可以專心工作了。
“我說為什么非得要至少 64 字節(jié)你才發(fā)送,原來還有這段歷史呢!那你們具體是怎么收發(fā)數據的呢?”,說到這兒,阿 Q 打斷了我。
“那你聽我繼續(xù)給你說”
數據收發(fā)過程
我每天的工作就是接收、發(fā)送數據包,操作系統把數據交給我以后,我就按照以太網的數據格式,把數據封裝成一個個的以太網幀發(fā)出去
幀的頭部有收件人和發(fā)件人的地址,我們叫它 MAC 地址,這是我們每個網卡的身份證號碼,從我們出生那一刻起就確定了。
發(fā)件人是我的 MAC 地址,但收件人地址我不知道?。〔僮飨到y協議棧部門交給我的數據包只有 IP 地址,我們又不認識這個,我們收發(fā)數據幀只用 MAC 地址。
為了解決這個問題,我們又制定了一套協議:ARP,地址解析協議,來實現這兩個地址的轉換。在不知道 IP 對應的 MAC 地址時候,就發(fā)送一個廣播,這個廣播的發(fā)件人地址填我的,然后收件人地址是 FF:FF:FF:FF:FF:FF,這是一個特殊的 MAC 地址,我們約定好了每個人收到廣播都要接收而不能丟棄。
這個廣播里面填了 IP 地址,誰收到以后發(fā)現跟自己的匹配上就來應答我,這樣我就能知道對方的 MAC 地址了,接下來就能通信了。
當然,為了避免每一次都去詢問一遍浪費時間,我會把查詢過的記錄緩存起來,下次就能直接用啦。
不過這樣做也有安全風險,要是有人冒充真正的收件人給我回信,我也沒辦法分辨,這就叫 ARP 欺騙。
“唉,等等,你還是給我講講你是怎么可以抓到別人的通信數據吧,我對這個更有興趣。”,阿 Q 又一次打斷了我。
因為集線器這家伙閉著眼睛到處轉發(fā),所以不管是誰發(fā)的數據,所有人都可以看到。
就因為這樣,總線中每天有大量數據在流動,但我通常也不會全部都抓下來交給你們處理,不然你們 CPU 的人估計要罵死我了。所以我每次拿到一個數據幀,就會檢查它的收件人是不是我,如果不是那就直接丟棄了,當然,前面我說的廣播消息例外。
我能抓到別人通信數據的秘密就在于:我提供了一種工作模式叫做混雜模式,這種模式下,我就會把總線中我看到的所有數據幀全部都抓下來交給你們 CPU 去處理,一般都是一些抓包軟件才會要求我這么做,但也有一些流氓軟件和病毒木馬經常讓我抓別人的數據包,這樣他們就能嗅探網絡中的其他主機的通信了。
我并不喜歡這樣,因為每次一開啟混雜模式,我和你們 CPU 就忙的要死,主板上的風扇都會瘋狂的轉起來。
“原來是這樣,那你開啟混雜模式給我露一手看看唄,可以看到別人的通信數據,這也太刺激了!”,阿 Q 又又又一次打斷了我。
“你別著急,聽我繼續(xù)說嘛,別老是打斷我,而且現在停電了,我想露一手也露不了啊?”
“好好好,你繼續(xù),繼續(xù),我不插嘴了。”
交換機時代
不知道從什么時候開始,就算我開啟混雜模式,也抓不到別人的數據包了,因為我發(fā)現網絡中的數據包只有跟我相關的了。
后來一打聽才知道,不只是我一個網卡這樣,別的也一樣。
原來集線器那家伙退休了,新來了一個叫交換機的大佬取代了他的位置。
這位大佬名不虛傳,他不只是簡單的把大家連接在一塊兒,它還會學習,用一張表把大家的 MAC 地址和連接的端口號記錄下來。每次收到數據后,它只轉發(fā)給對應的端口,而不會像集線器那樣到處轉發(fā),我再也看不到別人的通信數據了!
“啊?交換機那家伙可真多事!”,阿 Q 露出了失望的表情。
這也是件好事啊,交換機大佬不用到處轉發(fā)數據占用線路,相當于把沖突域進行了隔離,我連接的線路上只有我自己的數據,沒有別人的數據,就不會和別的主機傳輸數據發(fā)生沖突了。不僅如此,我們連接的網線也進行了升級換代了,現在我們可以全雙工通信,一邊收一邊發(fā),也不用和交換機發(fā)給我的下行數據發(fā)生沖突!
隔離沖突域 + 全雙工通信,現在再也不用 CSMA / CD,因為不會有沖突發(fā)生,可以隨心發(fā)送數據了,真是爽太多了!我們的傳輸速度也是日新月異,從 10Mbps 到 100Mbps,再到 1000Mbps,越來越快,這在以前想都不敢想。
阿 Q 點了點頭說到:“厲害了,網卡老哥!真是塞翁失馬焉知非?!?/p>
說完,CPU 六號車間的小六出現在了門口,只見他滿頭大汗的說到:“Q 哥,到處找你都找不到,原來你在這,快回去,領導叫我們出趟差”
未完待續(xù)??????
廣告聲明:文內含有的對外跳轉鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結果僅供參考,IT之家所有文章均包含本聲明。