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