Linux基礎之網絡包收發流程

網絡包的接收流程

  1. 網絡數據包(Frame)到達網卡,按照FIFO順序存入網卡的接受隊列;
  2. 網卡通過DMA方式將接受隊列的數據拷貝到內核緩衝區sk_buffer;
  3. 當數據拷貝完成後,網卡通過硬件中斷(IRQ)通知CPU有新的網絡數據到來,CPU執行驅動程序(NIC Driver)的處理邏輯:
    3.1 禁用網卡的中斷。這樣做的目的是避免CPU被頻繁的中斷,當網卡接收到新的數據時直接寫內存就可以了,不要再通知CPU;
    3.2 啓動軟中斷。這步結束後,硬件中斷處理函數就結束返回了。由於硬中斷處理程序執行的過程中不能被中斷,所以如果它執行時間過長,會導致CPU沒法響應其它硬件的中斷,於是內核引入軟中斷,這樣可以將硬中斷處理函數中耗時的部分移到軟中斷處理函數裏面來慢慢處理。
  4. 軟中斷處理,將sk_buffer中的數據轉換爲skb格式。內核中的ksoftirqd進程專門負責軟中斷的處理,當它收到軟中斷後,就會調用相應軟中斷所對應的處理函數,對於網卡驅動模塊拋出的軟中斷,ksoftirqd的最終處理邏輯是將網卡寫入到內存中的數據包轉換成內核網絡模塊能識別的skb格式,然後將數據交給協議棧處理;
  5. TCP/IP協議層逐層處理。
    5.1 在鏈路層檢查報文的合法性,找出上層協議的類型(比如 IPv4 還是 IPv6),再去掉幀頭、幀尾,然後交給網絡層。
    5.2 網絡層取出 IP 頭,判斷網絡包下一步的走向,比如是交給上層處理還是轉發。當網絡層確認這個包是要發送到本機後,就會取出上層協議的類型(比如 TCP 還是 UDP),去掉 IP 頭,再交給傳輸層處理。
    5.3 傳輸層取出 TCP 頭或者 UDP 頭後,根據 < 源 IP、源端口、目的 IP、目的端口 > 四元組作爲標識,找出對應的 Socket,並把數據拷貝到 Socket 的接收緩存中。
      待內存中的所有數據包被處理完成後(即poll函數執行完成),啓用網卡的硬中斷,這樣下次網卡再收到數據的時候就會通知CPU;
  6. 應用程序通過read()從套接字緩衝區讀取數據;
    在這裏插入圖片描述

網卡數據如何寫入到內存?

  1. 驅動程序啓動時創建和初始化Ring Buffer,存儲的是sk_buff緩衝區的描述符(物理地址和大小等);
  2. 當網絡報到達時,從Ring Buffer獲取指向的sk_buff,通過DMA將數據寫入該地址;
  3. 等sk_buff中的數據交由上層協議棧處理後,Ring Buffer中的描述更新爲新分配的sk_buff;

圖片來源

overruns VS dropped

  二者是對網絡包接受過程的不同階段的錯誤統計,overruns反映了網絡包進入網卡的接受隊列過程中發生的錯誤數;dropped反映了數據從網卡拷貝到內存過程中發生的錯誤數。可通過ifconfig命令查看監控指標。

On Linux ifconfig gets the raw data statistics from /proc/net/dev. The values there (with ifconfig destination in brackets added) are described by an article Exploring the /proc/net/ Directory as:
  errs (Errors): The total number of transmit or receive errors detected by the device driver.
  drop (Dropped): The total number of packets dropped by the device driver.
  fifo (Overruns): The number of FIFO buffer errors.
  frame (Frame): The number of packet framing errors.
  carrier (Carrier): The number of carrier losses detected by the device driver.

網絡包的發送流程

  1. 應用程序調用 Socket API發送網絡包,套接字層把數據包放到 Socket 發送緩衝區中;
  2. TCP/IP協議棧處理。
  3. 協議棧處理完成後產生軟中斷通知驅動程序,發送隊列中有新的網絡幀需要發送;
  4. 最後,驅動程序通過 DMA ,從發包隊列中讀出網絡幀,並通過物理網卡把它發送出去。
    在這裏插入圖片描述

參考:

  1. 網卡驅動收發包過程圖解
  2. Linux網絡 - 數據包的接收過程
  3. 網卡的 Ring Buffer 詳解
  4. 數據包如何從物理網卡到達雲主機的應用程序?
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章