我是一個網卡,居住在一個機箱內的主板上,負責整臺計算機的網絡通訊,要是沒有我,這裏就成了一個信息孤島了,那也太無聊了~編程
上個週末,服務器斷電維護了,這是我可貴的休息時間,我準備打個盹兒眯一下子。緩存
這纔剛合上眼,CPU一號車間的阿Q跑過來串門了。安全
「怎麼是你小子,據說你背後說了我不少壞話啊!今天怎麼想起找我來了」服務器
「網卡老哥,你這都聽誰造的謠,我想來拜訪你好久了,這不平時工做太忙抽不開身,今天停電了一有空就找你來了嘛!」,阿Q笑着說到。網絡
「你但是大忙人,無事不登三寶殿,說吧,找我什麼事兒」編程語言
阿Q露出了尷尬而不失禮貌的微笑,「那我就開門見山了,這不年末了嗎,我們廠裏最近評優呢,想學點網絡知識,特來向你討教討教」學習
「就這啊,好說好說,來裏邊坐」,我招待阿Q進門坐下。操作系統
剛剛落座,阿Q就忍不住提問:「老哥,大家網卡是怎麼工做的?據說你能夠抓到別的主機通訊的數據包?能夠給我露一手嗎?」3d
「唉,如今不行了」,我嘆了一口氣。blog
「咋了這是?」
我擡頭凝望,開始給阿Q講起了個人故事。
好久好久之前,那時候網絡中的各個計算機都是經過一個叫集線器Hub的傢伙來相連的,經過集線器,咱們你們在物理上構成了一個星型的網絡,還給取了個名字:以太網。那時候咱們的傳輸速度能作到10Mbps,在那個年代,已經很是了不得了!。
集線器這傢伙,不知道該說他笨,仍是該說他懶,他歷來不會管數據是誰發給誰,只是一個沒有感情的轉發機器,工做在物理層,把收到的信號作一個加強處理後就一股腦的發給全部端口。
這樣一來,咱們在邏輯上就變成了一個總線型網絡了。總線屬於公共資源,由全部鏈接在上面的主機共享,有人在傳輸數據的時候其餘人就得等着,否則數據就會發生衝突,全亂套了。
爲了讓你們都能和平共處,沒必要爲了爭搶線路發生不愉快,咱們制定了一套規則:CSMA/CD。
每次要發送數據以前,我都得要監聽一下線路上是否空閒,若是有別人在傳輸數據,那我就得等待。至於等待多久,我也不知道,由於這是一個隨機值。
等到空閒的時候,我就能夠發送數據了。不過一邊發送,我還得一邊檢測是否有衝突發生,由於說不定有別人跟我同樣覺得如今空閒都在發送數據呢!
因此這就是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哥,處處找你都找不到,原來你在這,快回去,領導叫咱們出趟差」
未完待續······