Linux TCP/IP協議棧全過程

安全劍客發表於2019-10-22
可以毫不誇張的說現如今的網際網路是基於TCP/IP構建起來的網路。弄懂協議棧的原理,無論對除錯網路IO效能還是解決網路問題都是有很大幫助的。本片文章就帶領大家來看看核心是如何控制網路資料流的。

Linux TCP/IP協議棧全過程Linux TCP/IP協議棧全過程

TCP特點

我們都非常清楚TCP協議設計的初衷,就是保證資料傳輸的快速,有序,無誤。所以特點總結如下:

  • 1、面向連線,可以用五元組來表示一條連線(遠端ip,遠端埠,本地ip,本地埠,傳輸層協議)。

  • 2、資料是全雙工的

  • 3、資料是有序的,也就是接受的資料一定是按照傳送時的順序的。

  • 4、流量控制,傳送方可以通過接收方滑動視窗大小來動態調整傳送資料的大小。

  • 5、擁塞控制,傳送方通過ACK的狀態結合擁塞演算法綜合計算給出視窗大小。

瞭解完TCP特點字後,我們就來真正的看看資料傳送到底是怎樣的過程?

資料傳送

我們首先來看張圖:
Linux TCP/IP協議棧全過程Linux TCP/IP協議棧全過程
上圖展示的是資料流動的在硬體中的過程,下圖展示的是資料在協議棧的過程:
Linux TCP/IP協議棧全過程Linux TCP/IP協議棧全過程
整個過程分為三個大區域:使用者區,核心區,裝置。這裡所說的裝置就是網路卡。流程如下:

  • 1、使用者應用程式呼叫write系統呼叫

  • 2、確認檔案描述符

  • 3、拷貝資料到socket buffer中

  • 4、建立tcp片段,計算checksum

  • 5、新增IP頭,執行ip路由,計算checksum

  • 6、新增乙太網協議頭部,執行ARP

  • 7、告訴網路卡晶片要傳送資料了

  • 8、網路卡從記憶體中獲取資料傳送,傳送完成中斷告訴CPU
資料接收

直接看硬體資料流圖:
Linux TCP/IP協議棧全過程Linux TCP/IP協議棧全過程
首先網路卡把接收到的資料包寫入到它的記憶體之中。然後對其進行校驗,通過後傳送到主機的主存之中。主存中的buffer是驅動分配好的,驅動會把分配好的buffer描述告訴網路卡,如果沒有足夠的buffer接受網路卡的資料包,網路卡會將資料包丟棄。一旦資料包拷貝到主存完成,網路卡會通過中斷告知主機OS。

之後驅動會檢查它是否能處理這個新的包。如果能處理,驅動會把資料包包裝成OS認識的結構( linux sk_buffer)並推送到上層。 鏈路層接收到幀後檢查通過的話會按照協議解幀並推送至IP層。

IP層會在解包之後根據包中包含的IP資訊決定推送至上層還是轉發到其他IP。如果判斷需要推送至上層,則會解掉IP包頭並推送至TCP層。

TCP在解報之後會根據其四元組找到對應的TCB,之後通過TCP協議處理這個報文。在接收到報文後,會把報文加到接受報文,之後根據TCP的狀態傳送一個ACK給對端。

當然上述過程會受到NAT等等Netfilter的作用,這裡不談了,也沒深研究過。當然為了效能,大牛們方方面面也做了很多努力,比如大到RDMA、DPDK等大的軟硬體技術,小到zero-copy、checksum offload等;

總結

現代的軟硬體TCP/IP協議棧單連結傳送速率到1~2GiB/s完全沒有任何問題(經過實測)。如果你想探索更優秀的效能,你可以嘗試RMDA等技術,他們通過繞過核心以減少拷貝等方式優化了效能,當然可能依賴硬體。

原文地址: https://www.linuxprobe.com/linux-tcp-ip-protocol-stack.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2661048/,如需轉載,請註明出處,否則將追究法律責任。

相關文章