轉載:http://blog.csdn.net/hilyoo/article/details/4455031
Linux的網路介面分為四部分:網路裝置介面,網路介面核心,網路通訊協定族,網路介面socket層。
可參考:
http://lxr.linux.no/linux+v2.6.30.4/net/
網路裝置介面部分主要負責從物理介質接收和發送資料,實現的檔案在linu/driver/net目錄下面。
網路介面核心部分是整個網路介面的關鍵部位,它為網路通訊協定提供統一的發送介面,屏蔽各種各樣的物理介質,同時有負責把來自下層的包向合適的協議配送。它是網路介面的中樞部份。它的主要實現檔案在linux/net/core目錄下,其中linux/net/core/dev.c為主要管理檔案。
網路通訊協定族部分是各種具體協議實現的部份。Linux支援TCP/IP,IPX,X.25,AppleTalk等的協議,各種具體協議實現的源碼在linux/net/目錄下相應的名稱。在這裡主要討論TCP/IP(IPv4)協議,實現的源碼在linux/net/ipv4,其中linux/net/ipv4/af_inet.c是主要的管理檔案。
網路介面Socket層為使用者提供的網路服務的編程介面,主要的源碼在linux/net/socket.c
發送:
應用程式調用系統調用,將資料發送給socket
socket檢查資料類型,調用相應的send函數
send函數檢查socket狀態、協議類型,傳給傳輸層
tcp/udp(傳輸層協議)為這些資料建立資料結構,加入協議頭部,比如連接埠號碼、檢驗和,傳給下層(網路層)
ip(網路層協議)添加ip頭,比如ip地址、檢驗和
如果資料包大小超過了mtu(最大資料包大小),則分區;ip將這些資料包傳給鏈路層
鏈路層寫到網卡隊列
網卡調用響應中斷驅動程式,發送到網路
接收:
資料包從網路到達網卡,網卡接收幀,放入網卡buffer,在向系統發送插斷要求
cpu調用相應中斷函數,這些中斷處理常式在網卡驅動中
中斷處理函數從網卡讀入記憶體,交給鏈路層
鏈路層將包放入自己的隊列,置非強制中斷標誌位
進程調度器看到了標誌位,調度相應進程
該進程將包從隊列取出,與相應協議匹配,一般為ip協議,再將包傳遞給該協議接收函數
ip層對包進行錯誤偵測,無錯,路由
路由結果,packet被轉寄或者繼續向上層傳遞
如果發往本機,進入鏈路層
鏈路層再進行錯誤偵測,尋找相應連接埠關聯socket,包被放入相應socket接收隊列
socket喚醒擁有該socket的進程,進程從系統調用read中返回,將資料拷貝到自己的buffer,返回使用者態。