當前位置:編程學習大全網 - 編程語言 - linux內核協議棧源碼解析linux內核協議棧

linux內核協議棧源碼解析linux內核協議棧

dpdk框架詳解?

dpdk(數據平面轉發工具),為Intel處理器架構下用戶空間高效的數據包處理提供了庫函數和驅動的支持,數據包的控制層和數據層分開,dpdk繞過linux內核協議棧將數據包的接受處理放到應用層。

DPDK攔截中斷,不觸發後續中斷流程,並繞過協議棧,通過UIO技術將網卡收到的報文拷貝到應用層處理,報文不再經過內核協議棧,減少了中斷。

Linux的協議棧是什麽呢?

Linux網絡協議棧基於分層的設計思想,總***分為四層,從下往上依次是:物理層,鏈路層,網絡層,應用層。Linux網絡協議棧其實是源於BSD的協議棧,它向上以及向下的接口以及協議棧本身的軟件分層組織的非常好。Linux的協議棧基於分層的設計思想,總***分為四層,從下往上依次是:物理層,鏈路層,網絡層,應用層。物理層主要提供各種連接的物理設備,如各種網卡,串口卡等;鏈路層主要指的是提供對物理層進行訪問的各種接口卡的驅動程序,如網卡驅動等;網路層的作用是負責將網絡數據包傳輸到正確的位置,最重要的網絡層協議當然就是IP協議了,其實網絡層還有其他的協議如ICMP,ARP,RARP等,只不過不像IP那樣被多數人所熟悉;傳輸層的作用主要是提供端到端,說白壹點就是提供應用程序之間的通信,傳輸層最著名的協議非TCP與UDP協議末屬了;應用層,顧名思義,當然就是由應用程序提供的,用來對傳輸數據進行語義解釋的“人機界面”層了,比如HTTP,SMTP,FTP等等,其實應用層還不是人們最終所看到的那壹層,最上面的壹層應該是“解釋層”,負責將數據以各種不同的表項形式最終呈獻到人們眼前。Linux網絡核心架構Linux的網絡架構從上往下可以分為三層,分別是:用戶空間的應用層。內核空間的網絡協議棧層。物理硬件層。其中最重要最核心的當然是內核空間的協議棧層了。Linux網絡協議棧結構Linux的整個網絡協議棧都構建與LinuxKernel中,整個棧也是嚴格按照分層的思想來設計的,整個棧***分為五層,分別是:

1,系統調用接口層,實質是壹個面向用戶空間應用程序的接口調用庫,向用戶空間應用程序提供使用網絡服務的接口。

2,協議無關的接口層,就是SOCKET層,這壹層的目的是屏蔽底層的不同協議(更準確的來說主要是TCP與UDP,當然還包括RAWIP,SCTP等),以便與系統調用層之間的接口可以簡單,統壹。簡單的說,不管我們應用層使用什麽協議,都要通過系統調用接口來建立壹個SOCKET,這個SOCKET其實是壹個巨大的sock結構,它和下面壹層的網絡協議層聯系起來,屏蔽了不同的網絡協議的不同,只吧數據部分呈獻給應用層(通過系統調用接口來呈獻)。

3,網絡協議實現層,毫無疑問,這是整個協議棧的核心。這壹層主要實現各種網絡協議,最主要的當然是IP,ICMP,ARP,RARP,TCP,UDP等。這壹層包含了很多設計的技巧與算法,相當的不錯。

4,與具體設備無關的驅動接口層,這壹層的目的主要是為了統壹不同的接口卡的驅動程序與網絡協議層的接口,它將各種不同的驅動程序的功能統壹抽象為幾個特殊的動作,如open,close,init等,這壹層可以屏蔽底層不同的驅動程序。

5,驅動程序層,這壹層的目的就很簡單了,就是建立與硬件的接口層。可以看到,Linux網絡協議棧是壹個嚴格分層的結構,其中的每壹層都執行相對獨立的功能,結構非常清晰。其中的兩個“無關”層的設計非常棒,通過這兩個“無關”層,其協議棧可以非常輕松的進行擴展。在我們自己的軟件設計中,可以吸收這種設計方法。

為什麽內核態轉發性能低?

現在很多人都在詬病Linux內核協議棧收包效率低,不管他們是真的懂還是壹點都不懂只是聽別人說的,反正就是在壹味地懟Linux內核協議棧,他們的武器貌似只有DPDK。

但是,即便Linux內核協議棧收包效率真的很低,這是為什麽?有沒有辦法去嘗試著優化?而不是動不動就DPDK。

我們從最開始說起。

Linux內核作為壹個通用操作系統內核,脫胎於UNIX那壹套現代操作系統理論。

但壹開始不知道怎麽回事將網絡協議棧的實現塞進了內核態,從此它就壹直在內核態了。既然網絡協議棧的處理在內核態進行,那麽網絡數據包必然是在內核態被處理的。無論如何,數據包要先進入內核態,這就涉及到了進入內核態的方式:

外部可以從兩個方向進入內核-從用戶態系統調用進入或者從硬件中斷進入。

也就是說,系統在任意時刻,必然處在兩個上下文中的壹個:

進程上下文

中斷上下文(在非中斷線程化的系統,也就是任意進程上下文)

收包邏輯的協議棧處理顯然是自網卡而上的,它顯然是在中斷上下文中,而數據包往用戶進程的數據接收處理,顯然是在應用程序的進程上下文中,數據包通過socket在兩個上下文中被轉接。

在socket層的數據包轉接處,必然存在著壹個隊列緩存,這是壹個典型的生產者-消費者模型,中斷上下文的終點作為生產者將數據包入隊,而進程上下文作為消費者從隊列消費數據包

dpdk下用socket編程,詳細講解壹下?

DPDK沒有協議棧,兩種方式,壹種使用第三方有基於DPDK開發的開源的TCP/IP協議棧,另外壹種方式將收發報文通過linuxTUN/TAP設備轉到linux內核協議棧中處理

  • 上一篇:Taylor Swift的Tim McGraw 的吉他譜,高分!!!
  • 下一篇:html5入門教程(八)history詳解
  • copyright 2024編程學習大全網