天天看點

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!
原文連結

網絡部新員工

我叫Robert,是Linux帝國一個普通的公民。

今天是我第一天上班的日子,我下了好大功夫才考上了帝國的公務員,根據我的成績,我被分到了帝國網絡部。

一進入帝國的辦公園區,我就被眼前的景象驚呆了,一座座高樓大廈,富麗堂皇,鱗次栉比,我忍不住駐足多看了幾眼。

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

這些大樓上面都有招牌,最高的那一座是帝國的程序&線程管理部門的辦公大廈,旁邊還有記憶體管理部門、檔案管理等部門辦公大廈。

網卡驅動部門

我隻顧東張西望,不小心跟旁邊小路跑出來的一位小哥撞了一個滿懷,他手裡抱的一堆資料散落的滿地都是。

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

我一邊道歉,一邊幫他撿起資料。

“這位小哥行色匆匆,不知要去哪裡啊”,我好奇的問到。

“哦,你好,我是網卡驅動部門的,這是從網卡那裡剛剛拿到的資料包,我得趕緊交給協定棧處理”,說完整理了下資料,就匆忙離開了。

尋着他出來的地方看去,不遠處就是他說的網卡驅動部門,難道我辦公的地方就在這裡?我沿着這條小路走了過去。

一進入網卡驅動部門,出現在眼前的就是一副熱火朝天的景象,收包的,解包的,發包的,一群人忙的不亦樂乎。

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

“這麼早就這麼忙碌了啊”,我問門口的保安大叔。

“是啊,這平時這個點也沒什麼網絡通路,不知道今天怎麼回事,一大早的資料就傳輸個不停”,保安說到。

我指着裡面一個員工問保安:“大叔,那人在幹嘛呢?一直在轉來轉去的”

“你說他啊,他在從網卡輪詢讀取資料包呢!”

“輪詢?網絡資料包不是網卡發中斷通知嗎,幹嘛要去輪詢呢?”,我不解的問到。

“以前是這樣的,不過後來CPU那邊有個叫阿Q的家夥不幹了,說網卡資料太頻繁,老是打斷他們正常的工作。不僅如此,中斷響應的時候還得把中斷給關了,避免出現錯誤,時間久了,鍵盤、滑鼠等機關就得不到響應紛紛鬧事了”,保安說完點了一支香煙。

我若有所思的點了點頭,“那現在就改成輪詢了?不過這樣好浪費時間哦”

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

保安吐了一個煙圈,繼續說到:“倒也不是全都是輪詢,現在把處理過程分成了兩段,最開始的第一部分還是靠中斷來通知的,這個時候需要關一下中斷,不過通知後不會真正處理資料包,而是開啟了一個

軟中斷

,是以關不了太久時間。第二部分在軟中斷中去輪詢處理的,這個時候就不用關中斷了。把硬中斷和輪詢結合了一下,就不用每個資料包來都中斷一次了,也不用關中斷太長時間,還給這技術取了個名字叫NAPI”

“保安大叔,你怎麼什麼都知道啊?”

“我以前就在裡面工作啊,現在年紀稍微大了些,比不上年輕人,就讓我來當保安了,唉~”,大叔說完又猛抽了一口香煙,整理了下自己日益稀疏的頭發。

“唉,對了,你是誰啊,怎麼沒見過你?”

“我是帝國網絡部新來的員工,今天來報道的。我把手中的錄取通知書遞給了保安”

保安大叔看了看說到:“你走錯了,不是這裡,你該去網絡協定棧大廈”。

協定棧大廈

離開網卡驅動部門,我繼續前行終于找到了網絡協定棧大廈,這便是我今後工作的地方了。

走近一看,這座網絡大廈并不如前面看到的高大,隻有三層高,每一層的牆上都挂着一個巨大的招牌,上面寫着這一層的名字,從上向下分别是:

  • 應用層

  • 傳輸層

  • 網絡層

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

大廈的門口還有一個收發室,門牌上寫着

netif_receive_skb

,收發室坐着一位大爺。

正在這時,先前碰到的小哥又來了,将手裡的資料放到了收發室就離開了,看來這裡就是網絡協定棧的入口了。

大爺拆開這個資料包看了看,随即按了下按鈕,資料包就順着管道傳到了背後協定棧大廈一樓的一個辦公室,我擡頭一看,上面寫着IPv4。再向旁邊看去,還有好幾間辦公室,分别寫了IPv6、ICMP、IGMP、ARP···

我來到這個IPv4的門口,裡面也是忙的不亦樂乎,有分片的、組包的、計算校驗和的、有條不紊。

辦公室正中央有一個圓柱形的管道,通向了二樓,一樓處理完畢就通過這管道把資料包送了上去。

牆上還有另一個管道,上面寫着

netfilter hook

,不知道是通向了哪裡。

“你找誰?”,我正看得入神,裡面一個負責人發現了我,我趕緊表明來意。

他看過我手中的錄取通知書後說到,“你是在傳輸層啊,出門右拐上二樓就是了。我們這一樓都是網絡層協定的辦公室。”

我又看了下手裡的錄用通知書,這才發現被配置設定在了

傳輸層

工作。

傳輸層工作

來到二樓,總算見到了我的主管。

“Robert,歡迎加入網絡部,工作崗位在傳輸層的TCP小組,大家歡迎!”

“謝謝主管!謝謝大家!”

“這是Cerf,你剛來,就讓他先帶帶你,有什麼不懂的就向他請教吧。”

我點頭感謝,和一旁這個叫Cerf的握了握手。

接下來,主管向我介紹了咱們傳輸層的幾個小組的情況:TCP、UDP、SCTP、UDP-lite······我這才知道,原來傳輸層不是隻有TCP和UDP。

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

Cerf帶我來到了工位,不愧是國有機關,無比寬敞,桌上還有一堆奇怪的裝置。

“這是一堆什麼東西啊”,我問Cerf。

“這些都是定時器,後面你工作處理TCP連接配接會用到的”

我點了點頭,環顧四周,工位旁邊的牆壁上還貼滿了什麼東西,我湊近了一看,才發現滿滿的都是RFC幾千條的規定。

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

“好好看,以後的工作可是要天天用到這些東西呢”,Cerf略開玩笑的說着。

“這些我基本都背的下來了,要不然我也考不到這裡來”,我笑着說,略帶一些得意。

Cerf也笑了笑,“别大意,之前也有人也說過這話,後來還不是走了”

我有些尴尬,不知道說些什麼,這時辦公室中央的管道裡冒出了一個資料包。

“Robert,你剛來,這個新的連接配接資料包就交給你來處理下,熟悉下工作流程”,主管說到。

我剛剛放松的心情一下緊張了起來,畢竟以前都是紙上談兵,還從沒有真正處理過資料包呢。

我小心翼翼的接過這個資料包,定位到TCP的頭部,瞧了一眼标志位,發現

SYN

位是1,看來是有新的連接配接到來了,接下來不就是三次握手嗎,我再熟悉不過了。

【趣話程式設計】中斷還是輪詢?取個資料包真麻煩!

我準備了一個響應包,将

SYN

标記和

ACK

标記都點亮後,接下來就犯了難了。這個确認号

ACK

我倒是知道是對方的序列号+1,不過我回複的序列号該是多少呢?一時之間,不知道如何是好。

你們知道嗎?線上等,挺急的。**

彩蛋

CPU一号工廠中的房間的阿Q又鬧脾氣了。

“我們花了大量時間把網卡資料搬運到記憶體,重複又沒有技術含量,我受夠了!”

預知後事如何,請關注後續精彩······

作者 | 軒轅之風O

來源 | 程式設計技術宇宙

繼續閱讀