你不好奇 Linux 網絡發包過程嗎?

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"前言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這次,就圍繞一個問題來說。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Linux 系統是如何收發網絡包的?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"horizontalrule","attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"正文","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"網絡模型","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了使得多種設備能通過網絡相互通信,和爲了解決各種不同設備在網絡互聯中的兼容性問題,國際標標準化組織制定了開放式系統互聯通信參考模型(","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"pen System Interconnection Reference Model","attrs":{}},{"type":"text","text":"),也就是 OSI 網絡模型,該模型主要有 7 層,分別是應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層以及物理層。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每一層負責的職能都不同,如下:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"應用層,負責給應用程序提供統一的接口;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"表示層,負責把數據轉換成兼容另一個系統能識別的格式;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"會話層,負責建立、管理和終止表示層實體之間的通信會話;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"傳輸層,負責端到端的數據傳輸;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡層,負責數據的路由、轉發、分片;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據鏈路層,負責數據的封幀和差錯檢測,以及 MAC 尋址;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"物理層,負責在物理網絡中傳輸數據幀;","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於 OSI 模型實在太複雜,提出的也只是概念理論上的分層,並沒有提供具體的實現方案。事實上,我們比較常見,也比較實用的是四層模型,即 TCP/IP 網絡模型,Linux 系統正是按照這套網絡模型來實現網絡協議棧的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"TCP/IP 網絡模型共有 4 層,分別是應用層、傳輸層、網絡層和網絡接口層,每一層負責的職能如下:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"應用層,負責向用戶提供一組應用程序,比如 HTTP、DNS、FTP 等;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"傳輸層,負責端到端的通信,比如 TCP、UDP 等;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡層,負責網絡包的封裝、分片、路由、轉發,比如 IP、ICMP 等;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡接口層,負責網絡包在物理網絡中的傳輸,比如網絡包的封幀、 MAC 尋址、差錯檢測,以及通過網卡傳輸網絡幀等;","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"TCP/IP 網絡模型相比 OSI 網絡模型簡化了不少,也更加易記,它們之間的關係如下圖:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ac/accdc75a60926191d4ad8d8343e50301.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不過,我們常說的七層和四層負載均衡,是用 OSI 網絡模型來描述的,七層對應的是應用層,四層對應的是傳輸層。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"horizontalrule","attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Linux 網絡協議棧","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們可以把自己的身體比作應用層中的數據,打底衣服比作傳輸層中的 TCP 頭,外套比作網絡層中 IP 頭,帽子和鞋子分別比作網絡接口層的幀頭和幀尾。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在冬天這個季節,當我們要從家裏出去玩的時候,自然要先穿個打底衣服,再套上保暖外套,最後穿上帽子和鞋子纔出門,這個過程就好像我們把 TCP 協議通信的網絡包發出去的時候,會把應用層的數據按照網絡協議棧層層封裝和處理。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你從下面這張圖可以看到,應用層數據在每一層的封裝格式。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4d/4daed9e15b85f1691497bf911642b229.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"傳輸層,給應用數據前面增加了 TCP 頭;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡層,給 TCP 數據包前面增加了 IP 頭;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡接口層,給 IP 數據包前後分別增加了幀頭和幀尾;","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這些新增和頭部和尾部,都有各自的作用,也都是按照特定的協議格式填充,這每一層都增加了各自的協議頭,那自然網絡包的大小就增大了,但物理鏈路並不能傳輸任意大小的數據包,所以在以太網中,規定了最大傳輸單元(MTU)是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1500","attrs":{}}],"attrs":{}},{"type":"text","text":" 字節,也就是規定了單次傳輸的最大 IP 包大小。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當網絡包超過 MTU 的大小,就會在網絡層分片,以確保分片後的 IP 包不會超過 MTU 大小,如果 MTU 越小,需要的分包就越多,那麼網絡吞吐能力就越差,相反的,如果 MTU 越大,需要的分包就越小,那麼網絡吞吐能力就越好。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"知道了 TCP/IP 網絡模型,以及網絡包的封裝原理後,那麼 Linux 網絡協議棧的樣子,你想必猜到了大概,它其實就類似於 TCP/IP 的四層結構:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/36/361e77d512918f5cd16a340b3bd351af.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從上圖的的網絡協議棧,你可以看到:","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"應用程序需要通過系統調用,來跟 Socket 層進行數據交互;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Socket 層的下面就是傳輸層、網絡層和網絡接口層;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最下面的一層,則是網卡驅動程序和硬件網卡設備;","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"horizontalrule","attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Linux 接收網絡包的流程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網卡是計算機裏的一個硬件,專門負責接收和發送網絡包,當網卡接收到一個網絡包後,會通過 DMA 技術,將網絡包放入到 Ring Buffer,這個是一個環形緩衝區。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那接收到網絡包後,應該怎麼告訴操作系統這個網絡包已經到達了呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最簡單的一種方式就是觸發中斷,也就是每當網卡收到一個網絡包,就觸發一箇中斷告訴操作系統。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是,這存在一個問題,在高性能網絡場景下,網絡包的數量會非常多,那麼就會觸發非常多的中斷,要知道當 CPU 收到了中斷,就會停下手裏的事情,而去處理這些網絡包,處理完畢後,纔會回去繼續其他事情,那麼頻繁地觸發中斷,則會導致 CPU 一直沒玩沒了的處理中斷,而導致其他任務可能無法繼續前進,從而影響系統的整體效率。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以爲了解決頻繁中斷帶來的性能開銷,Linux 內核在 2.6 版本中引入了 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"NAPI 機制","attrs":{}},{"type":"text","text":",它是混合「中斷和輪詢」的方式來接收網絡包,它的核心概念就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"不採用中斷的方式讀取數據","attrs":{}},{"type":"text","text":",而是首先採用中斷喚醒數據接收的服務程序,然後 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"poll","attrs":{}}],"attrs":{}},{"type":"text","text":" 的方法來輪詢數據。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"比如,當有網絡包到達時,網卡發起硬件中斷,於是會執行網卡硬件中斷處理函數,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"中斷處理函數處理完需要「暫時屏蔽中斷」,然後喚醒「軟中斷」來輪詢處理數據,直到沒有新數據時才恢復中斷,這樣一次中斷處理多個網絡包","attrs":{}},{"type":"text","text":",於是就可以降低網卡中斷帶來的性能開銷。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那軟中斷是怎麼處理網絡包的呢?它會從 Ring Buffer 中拷貝數據到內核 struct sk_buff 緩衝區中,從而可以作爲一個網絡包交給網絡協議棧進行逐層處理。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,會先進入到網絡接口層,在這一層會檢查報文的合法性,如果不合法則丟棄,合法則會找出該網絡包的上層協議的類型,比如是 IPv4,還是 IPv6,接着再去掉幀頭和幀尾,然後交給網絡層。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"到了網絡層,則取出 IP 包,判斷網絡包下一步的走向,比如是交給上層處理還是轉發出去。當確認這個網絡包要發送給本機後,就會從 IP 頭裏看看上一層協議的類型是 TCP 還是 UDP,接着去掉 IP 頭,然後交給傳輸層。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"傳輸層取出 TCP 頭或 UDP 頭,根據四元組「源 IP、源端口、目的 IP、目的端口」 作爲標識,找出對應的 Socket,並把數據拷貝到 Socket 的接收緩衝區。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,應用層程序調用 Socket 接口,從內核的 Socket 接收緩衝區讀取新到來的數據到應用層。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"至此,一個網絡包的接收過程就已經結束了,你也可以從下圖左邊部分看到網絡包接收的流程,右邊部分剛好反過來,它是網絡包發送的流程。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/42/427db83b285da4c3e6b28090f73f43da.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Linux 發送網絡包的流程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖的有半部分,發送網絡包的流程正好和接收流程相反。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,應用程序會調用 Socket 發送數據包的接口,由於這個是系統調用,所以會從用戶態陷入到內核態中的 Socket 層,Socket 層會將應用層數據拷貝到 Socket 發送緩衝區中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來,網絡協議棧從 Socket 發送緩衝區中取出數據包,並按照 TCP/IP 協議棧從上到下逐層處理。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果使用的是 TCP 傳輸協議發送數據,那麼會在傳輸層增加 TCP 包頭,然後交給網絡層,網絡層會給數據包增加 IP 包,然後通過查詢路由表確認下一跳的 IP,並按照 MTU 大小進行分片。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分片後的網絡包,就會被送到網絡接口層,在這裏會通過 ARP 協議獲得下一跳的 MAC 地址,然後增加幀頭和幀尾,放到發包隊列中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一些準備好後,會觸發軟中斷告訴網卡驅動程序,這裏有新的網絡包需要發送,最後驅動程序通過 DMA,從發包隊列中讀取網絡包,將其放入到硬件網卡的隊列中,隨後物理網卡再將它發送出去。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"----","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"總結","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"電腦與電腦之間通常都是通話網卡、交換機、路由器等網絡設備連接到一起,那由於網絡設備的異構性,國際標準化組織定義了一個七層的 OSI 網絡模型,但是這個模型由於比較複雜,實際應用中並沒有採用,而是採用了更爲簡化的 TCP/IP 模型,Linux 網絡協議棧就是按照了該模型來實現的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"TCP/IP 模型主要分爲應用層、傳輸層、網絡層、網絡接口層四層,每一層負責的職責都不同,這也是 Linux 網絡協議棧主要構成部分。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當應用程序通過 Socket 接口發送數據包,數據包會被網絡協議棧從上到下進行逐層處理後,纔會被送到網卡隊列中,隨後由網卡將網絡包發送出去。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而在接收網絡包時,同樣也要先經過網絡協議棧從下到上的逐層處理,最後纔會被送到應用程序。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章