CPU 網絡卡老哥,你到底怎麼工作的?

2021-10-11 03:52:49 字數 4191 閱讀 1266

我是乙個網絡卡,居住在乙個機箱內的主機板上,負責整台計算機的網路通訊,要是沒有我,這裡就成了乙個資訊孤島了,那也太無聊了~

上個週末,伺服器斷電維護了,這是我難得的休息時間,我準備打個盹兒眯一會兒。

這才剛合上眼,cpu一號車間的阿q跑過來串門了。

「怎麼是你小子,聽說你背後說了我很多壞話啊!今天怎麼想起找我來了」

「網絡卡老哥,你這都聽誰造的謠,我想來拜訪你很久了,這不平時工作太忙抽不開身,今天停電了一有空就找你來了嘛!」,阿q笑著說到。

「你可是大忙人,無事不登三寶殿,說吧,找我什麼事兒」

阿q露出了尷尬而不失禮貌的微笑,「那我就開門見山了,這不年底了嗎,咱們廠裡最近評優呢,想學點網路知識,特來向你討教討教」

「就這啊,好說好說,來裡邊坐」,我招待阿q進門坐下。

剛剛落座,阿q就忍不住提問:「老哥,你們網絡卡是怎麼工作的?聽說你可以抓到別的主機通訊的資料報?可以給我露一手嗎?」

「唉,現在不行了」,我嘆了一口氣。

「咋了這是?」

我抬頭凝望,開始給阿q講起了我的故事。

很久很久以前,那時候網路中的各個計算機都是通過乙個叫集線器hub的傢伙來相連的,通過集線器,我們大家在物理上構成了乙個星型的網路,還給取了個名字:乙太網。那時候我們的傳輸速度能做到10mbps,在那個年代,已經非常了不起了!。

集線器這傢伙,不知道該說他笨,還是該說他懶,他從來不會管資料是誰發給誰,只是乙個沒有感情的**機器,工作在物理層,把收到的訊號做乙個增強處理後就一股腦的發給所有埠。

這樣一來,我們在邏輯上就變成了乙個匯流排型網路了。匯流排屬於公共資源,由所有連線在上面的主機共享,有人在傳輸資料的時候其他人就得等著,不然資料就會發生衝突,全亂套了。

每次要傳送資料之前,我都得要監聽一下線路上是否空閒,如果有別人在傳輸資料,那我就得等待。至於等待多久,我也不知道,因為這是乙個隨機值。

等到空閒的時候,我就可以傳送資料了。不過一邊傳送,我還得一邊檢測是否有衝突發生,因為說不定有別人跟我一樣以為現在空閒都在傳送資料呢!

所以這就是csma/cd——載波偵聽多路訪問/衝突檢測名字的來歷了。

但是如果資料的長度太短,我很快就傳送完了,結果先頭部隊還在路上,這之後再遇到衝突那我就發現不了了。為了應對這種情況,我們還得考慮即便是在極端情況下發生衝突,我們還是能夠檢測到。

我們這個網路能夠支援的最遠距離是2500公尺,極端情況下,到達最遠端的時候衝突才發生。衝突訊號得趕在我傳送完最後乙個bit之前傳回來,這一來一回就是5000公尺。

線路上的訊號跑個來回需要57.6微秒,我們的傳輸速度是10mbps,乙個來回的時間我就能傳送576bit,也就是72個位元組,除開8個位元組的幀前導符和幀開始符,剩下的乙太網幀長度不能低於64個位元組,這樣就算在最遠兩端發生的碰撞衝突都能及時傳遞回去被檢測到。

有了這套協議,大家再也不用爭搶,可以專心工作了。

「我說為什麼非得要至少64位元組你才傳送,原來還有這段歷史呢!那你們具體是怎麼收發資料的呢?」,說到這兒,阿q打斷了我。

「那你聽我繼續給你說」

我每天的工作就是接收、傳送資料報,作業系統把資料交給我以後,我就按照乙太網的資料格式,把資料封裝成乙個個的乙太網幀發出去

幀的頭部有收件人和發件人的位址,我們叫它mac位址,這是我們每個網絡卡的身份證號碼,從我們出生那一刻起就確定了。

發件人是我的mac位址,但收件人位址我不知道啊!作業系統協議棧部門交給我的資料報只有ip位址,我們又不認識這個,我們收發資料幀只用mac位址。

為了解決這個問題,我們又制定了一套協議:arp,位址解析協議,來實現這兩個位址的轉換。在不知道ip對應的mac位址時候,就傳送乙個廣播,這個廣播的發件人位址填我的,然後收件人位址是ff:ff:ff:ff:ff:ff,這是乙個特殊的mac位址,我們約定好了每個人收到廣播都要接收而不能丟棄。

這個廣播裡面填了ip位址,誰收到以後發現跟自己的匹配上就來應答我,這樣我就能知道對方的mac位址了,接下來就能通訊了。

當然,為了避免每一次都去詢問一遍浪費時間,我會把查詢過的記錄快取起來,下次就能直接用啦。

不過這樣做也有安全風險,要是有人冒充真正的收件人給我回信,我也沒辦法分辨,這就叫arp欺騙

「唉,等等,你還是給我講講你是怎麼可以抓到別人的通訊資料吧,我對這個更有興趣。」,阿q又一次打斷了我。

因為集線器這傢伙閉著眼睛到處**,所以不管是誰發的資料,所有人都可以看到。

就因為這樣,匯流排中每天有大量資料在流動,但我通常也不會全部都抓下來交給你們處理,不然你們cpu的人估計要罵死我了。所以我每次拿到乙個資料幀,就會檢查它的收件人是不是我,如果不是那就直接丟棄了,當然,前面我說的廣播訊息例外。

我能抓到別人通訊資料的秘密就在於:我提供了一種工作模式叫做混雜模式,這種模式下,我就會把匯流排中我看到的所有資料幀全部都抓下來交給你們cpu去處理,一般都是一些抓包軟體才會要求我這麼做,但也有一些流氓軟體和病毒木馬經常讓我抓別人的資料報,這樣他們就能嗅探網路中的其他主機的通訊了。

我並不喜歡這樣,因為每次一開啟混雜模式,我和你們cpu就忙的要死,主機板上的風扇都會瘋狂的轉起來。

「原來是這樣,那你開啟混雜模式給我露一手看看唄,可以看到別人的通訊資料,這也太刺激了!」,阿q又又又一次打斷了我。

「你別著急,聽我繼續說嘛,別老是打斷我,而且現在停電了,我想露一手也露不了啊?」

「好好好,你繼續,繼續,我不插嘴了。」

不知道從什麼時候開始,就算我開啟混雜模式,也抓不到別人的資料報了,因為我發現網路中的資料報只有跟我相關的了。

後來一打聽才知道,不只是我乙個網絡卡這樣,別的也一樣。

原來集線器那傢伙退休了,新來了乙個叫交換機的大佬取代了他的位置。

這位大佬名不虛傳,他不只是簡單的把大家連線在一塊兒,它還會學習,用一張表把大家的mac位址和連線的埠號記錄下來。每次收到資料後,它只**給對應的埠,而不會像集線器那樣到處**,我再也看不到別人的通訊資料了!

「啊?交換機那傢伙可真多事!」,阿q露出了失望的表情。

這也是件好事啊,交換機大佬不用到處**資料占用線路,相當於把衝突域進行了隔離,我連線的線路上只有我自己的資料,沒有別人的資料,就不會和別的主機傳輸資料發生衝突了。不僅如此,我們連線的網線也進行了公升級換代了,現在我們可以全雙工通訊,一邊收一邊發,也不用和交換機發給我的下行資料發生衝突!

隔離衝突域+全雙工通訊,現在再也不用csma/cd,因為不會有衝突發生,可以隨心傳送資料了,真是爽太多了!我們的傳輸速度也是日新月異,從10mbps到100mbps,再到1000mbps,越來越快,這在以前想都不敢想。

阿q點了點頭說到:「厲害了,網絡卡老哥!真是塞翁失馬焉知非福」

說完,cpu六號車間的小六出現在了門口,只見他滿頭大汗的說到:「q哥,到處找你都找不到,原來你在這,快回去,領導叫我們出趟差」

未完待續······

那天,我被拉入乙個redis群聊···

cpu明明8個核,網絡卡為啥拼命折騰一號核?

乙個故事看懂docker容器技術

主機板上來了乙個新鄰居,cpu慌了!

雜湊表哪家強?幾大程式語言吵起來了!

CPU是怎麼工作的?

計算機現在已經成了人們生活中的一部分,其中我們也知道計算機中的cpu相當於人的大腦,計算機的所有活動都離不開它。那麼它到底是怎麼工作的呢,我們今天來一起揭開它神秘的面紗。在軟考中,前10道題中,基本上都是基礎的計算機知識,如果你了解了cpu工作原理那麼這些也就不在話下了。我們都知道計算機的基本硬體系...

IPFS 到底是怎麼工作的?

這就是本文要 的主題!先來看一下 add 和 get 的基本操作過程 當乙個 ipfs 節點執行 add 操作時,它會把檔案進行分塊 block,通過構建乙個 merkle 樹根節點,來把每個子塊節點都連線起來,每個 block 都會用乙個唯一的 cid 進行標識。block 資料會被儲存到本地的 ...

C語言的main函式你到底怎麼寫?

c程式一定從main 函式開始執行的 目前不考慮例外的情況 就是乙個大家遵守的規定。被寫到了c99規範 但是從開始學習c語言到現在,我們似乎看到了很多個版本的main函式,那麼哪一種才是正確的呢?main函式版本 main 如果瀏覽舊式的c 會發現程式以如下形式開始 include main 編譯執...