國際標準化組織(ISO)制定了開放式系統互聯通信參考模型(OSI模型),該模型分為七層,包括應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層和物理層
然而,由于OSI模型過于復雜,實際應用中更常用的是TCP/IP模型,它簡化為四層:應用層、傳輸層、網絡層和網絡接口層
Linux系統正是基于TCP/IP模型來實現其網絡協議棧的
一、TCP/IP模型概述 1.應用層:提供用戶所需的各種服務,如HTTP、DNS、FTP等
2.傳輸層:提供端到端的通信功能,確保數據包的順序傳送及數據的完整性
主要協議有TCP和UDP
3.網絡層:解決主機到主機的通信問題,負責數據包的路由、轉發和分片
主要協議有IP、ICMP等
4.網絡接口層:負責數據在主機和網絡之間的交換,具體協議由參與互連的各網絡自行定義
二、Linux網絡協議棧 Linux網絡協議棧類似于TCP/IP的四層結構
數據包的發送和接收都遵循這一結構,從用戶態的應用程序到內核態的網絡協議棧,再到硬件網卡,每一層都有其特定的職責和處理流程
三、Linux鏈路層發包流程 在Linux系統中,網絡數據包的發送是一個復雜但有序的過程,涉及多個層次和組件的協同工作
以下是詳細的發送流程: 1.應用程序調用Socket接口 發送過程始于應用程序調用Socket接口發送數據包的請求
這是一個系統調用,會從用戶態陷入到內核態的套接字層
2.數據拷貝到內核態sk_buff 套接字層會申請一個內核態的sk_buff內存,將用戶待發送的數據拷貝到sk_buff內存,并將其加入到Socket發送緩沖區等待網絡協議棧的處理
3.協議棧逐層處理 網絡協議棧從Socket發送緩沖區中取出數據包,然后按照TCP/IP協議棧的分層(傳輸層、網絡層、網絡接口層),從上到下逐層進行處理
-傳輸層:在傳輸層,會為數據包添加TCP頭(如果使用TCP協議),同時拷貝一個新的sk_buff副本
這是因為sk_buff在到達網卡發送完成的時候會被釋放掉,而TCP協議支持重傳,為確保網絡包可靠傳輸,在收到對方的ACK之前,這個sk_buff不能被刪除
-網絡層:在網絡層,主要工作包括選取路由(確認下一跳的IP)、填充IP頭、netfilter過濾、對超過MTU大小的數據包進行分片
處理完這些工作后會交給網絡接口層處理
-網絡接口層:網絡接口層會進行物理地址尋址,以找到下一跳的MAC地址,填充幀頭和幀尾,將其放到發送隊列中
然后觸發軟中斷告訴網卡驅動程序:隊列中有新的網絡包需要發送
4.驅動程序通過DMA發送數據 驅動程序收到通知會通過DMA(Direct Memory Access,直接內存訪問),從發送包隊列中讀出網絡幀,并通過DMA將數據寫入網卡的FIFO(First In First Out,先進先出)發送隊列
5.網卡設備發送數據包 網卡設備從FIFO發送隊列中取出數據包,將其發送到網絡
當發送完成的時候,網卡設備會觸發一個硬中斷來釋放內存,主要是釋放sk_buff內存和清理RingBuffer內存
6.傳輸層釋放sk_buff 最