[轉帖]Linux TCP/IP協議棧,數據發送接收流程,TCP協議特色

Linux TCP/IP協議棧,數據發送接收流程,TCP協議特色

http://network.51cto.com/art/201909/603780.htm

 

能夠絕不誇張的說現現在的互聯網是基於TCP/IP構建起來的網絡。弄懂協議棧的原理,不管對調試網絡IO性能仍是解決網絡問題都是有很大幫助的。本片文章就帶領你們來看看內核是如何控制網絡數據流的。linux

做者:底層軟件架構來源: 今日頭條|2019-09-30 09:28

能夠絕不誇張的說現現在的互聯網是基於TCP/IP構建起來的網絡。弄懂協議棧的原理,不管對調試網絡IO性能仍是解決網絡問題都是有很大幫助的。本片文章就帶領你們來看看內核是如何控制網絡數據流的。算法

TCP特色網絡

咱們都很是清楚TCP協議設計的初衷,就是保證數據傳輸的快速,有序,無誤。因此特色總結以下:架構

  1. 面向鏈接,能夠用五元組來表示一條鏈接(遠程ip,遠程端口,本地ip,本地端口,傳輸層協議)。
  2. 數據是全雙工的
  3. 數據是有序的,也就是接受的數據必定是按照發送時的順序的。
  4. 流量控制,發送方能夠經過接收方滑動窗口大小來動態調整發送數據的大小。
  5. 擁塞控制,發送方經過ACK的狀態結合擁塞算法綜合計算給出窗口大小。

瞭解完TCP特色字後,咱們就來真正的看看數據發送究竟是怎樣的過程?socket

數據發送tcp

咱們首先來看張圖:性能

一篇文章:Linux TCP/IP協議棧,數據發送接收流程,TCP協議特色

上圖展現的是數據流動的在硬件中的過程,下圖展現的是數據在協議棧的過程:優化

一篇文章:Linux TCP/IP協議棧,數據發送接收流程,TCP協議特色

整個過程分爲三個大區域:用戶區,內核區,設備。這裏所說的設備就是網卡。流程以下:spa

  1. 用戶應用程序調用write系統調用
  2. 確認文件描述符
  3. 拷貝數據到socket buffer中
  4. 建立tcp片斷,計算checksum
  5. 添加IP頭,執行ip路由,計算checksum
  6. 添加以太網協議頭部,執行ARP
  7. 告訴網卡芯片要發送數據了
  8. 網卡從內存中獲取數據發送,發送完成中斷告訴CPU

數據接收設計

直接看硬件數據流圖:

一篇文章:Linux TCP/IP協議棧,數據發送接收流程,TCP協議特色

首先網卡把接收到的數據包寫入到它的內存之中。而後對其進行校驗,經過後發送到主機的主存之中。主存中的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等技術,他們經過繞過內核以減小拷貝等方式優化了性能,固然可能依賴硬件。

【編輯推薦】

相關文章
相關標籤/搜索