linux核心網路協議棧 網絡卡報文收發(十六)

2021-10-08 01:19:39 字數 617 閱讀 6966

linux版本: 3.10.103

網絡卡驅動: ixgbev

網絡卡驅動預設採用的是napi的報文處理方式。即中斷+輪詢的方式,網絡卡收到乙個報文之後會產生接收中斷,並且遮蔽中斷,直到收夠了netdev_max_backlog個報文(預設300)或者收完網絡卡上的所有報文之後,重新開啟中斷。

網絡卡啟用時會呼叫netdev上的open函式ixgbe_open,完成工作如下:

ixgbe_close函式所做的事情:

輪詢函式ixgbe_poll主要是處理接收傳送任務:

ixgbe_rx_skb最終會處理過gro之後呼叫到netif_receive_skb,此處忽略rps。

netif_receive_skb最終呼叫__netif_receivve_skb_core進入協議棧處理各種協議。

注:因為網絡卡接收報文後最終經過四層的時候,會將報文根據協議幾元組找到對應的sock結構,放入佇列。上層呼叫read或者recv的時候都是從socket對應的sock結構佇列上取資料。

虛擬機器收包流程如下:

qemu虛擬機器通訊流程圖:

核心網路協議棧offload功能盤點

tso tcp segmentation offload的縮寫,只針對tcp包傳送,超過 mtu 大小的報文不需要在協議棧分段,直接offload到網絡卡,由網絡卡硬體實現分段,降低 cpu 負載。除了tso,還有乙個lso large segment offload lso的定義相對於tso更加寬...

Linux核心網路協議棧7 socket埠管理

一 前情回顧 上一節 socket 位址繫結 中提到,應用程式傳遞過來的埠在核心中需要檢查埠是否可用 if sk sk prot get port sk,snum 按照前面的例子來分析,這裡是呼叫了 tcp prot 結構變數中的 get prot 函式指標,該函式位於net ipv4 inet c...

Linux核心網路協議棧8 socket監聽

幾個問題 了解以下幾個問題的同學可以直接忽略下文 1 listen 庫函式主要做了什麼?2 什麼是最大併發連線請求數?3 什麼是等待連線佇列?socket 監聽相對還是比較簡單的,先看下應用程式 listen server sockfd,5 其中,第乙個引數 server sockfd為服務端 so...