當前位置:編程學習大全網 - 源碼下載 - Linux網絡 - 數據包在內核中接收和發送的過程(轉)

Linux網絡 - 數據包在內核中接收和發送的過程(轉)

本文將介紹在Linux系統中, 數據包是如何壹步壹步從網卡傳到進程手中的 以及 數據包是如何壹步壹步從應用程序到網卡並最終發送出去的

如果英文沒有問題,強烈建議閱讀後面參考裏的文章,裏面介紹的更詳細。

本文只討論以太網的物理網卡,不涉及虛擬設備,並且以壹個UDP包的接收過程作為示例.

網卡需要有驅動才能工作,驅動是加載到內核中的模塊,負責銜接網卡和內核的網絡模塊,驅動在加載的時候將自己註冊進網絡模塊,當相應的網卡收到數據包時,網絡模塊會調用相應的驅動程序處理數據。

下圖展示了數據包(packet)如何進入內存,並被內核的網絡模塊開始處理:

軟中斷會觸發內核網絡模塊中的軟中斷處理函數,後續流程如下

由於是UDP包,所以第壹步會進入IP層,然後壹級壹級的函數往下調:

應用層壹般有兩種方式接收數據,壹種是recvfrom函數阻塞在那裏等著數據來,這種情況下當socket收到通知後,recvfrom就會被喚醒,然後讀取接收隊列的數據;另壹種是通過epoll或者select監聽相應的socket,當收到通知後,再調用recvfrom函數去讀取接收隊列的數據。兩種情況都能正常的接收到相應的數據包。

了解數據包的接收流程有助於幫助我們搞清楚我們可以在哪些地方監控和修改數據包,哪些情況下數據包可能被丟棄,為我們處理網絡問題提供了壹些參考,同時了解netfilter中相應鉤子的位置,對於了解iptables的用法有壹定的幫助,同時也會幫助我們後續更好的理解Linux下的網絡虛擬設備。

ndo_start_xmit會綁定到具體網卡驅動的相應函數,到這步之後,就歸網卡驅動管了,不同的網卡驅動有不同的處理方式,這裏不做詳細介紹,其大概流程如下:

在網卡驅動發送數據包過程中,會有壹些地方需要和netdevice子系統打交道,比如網卡的隊列滿了,需要告訴上層不要再發了,等隊列有空閑的時候,再通知上層接著發數據。

  • 上一篇:JAVA語言的歷史?
  • 下一篇:樹莓派 編譯 platform選哪個
  • copyright 2024編程學習大全網