Linux網路(網路模型和收發流程)

2022-07-25 13:03:20 字數 1305 閱讀 2687

為了解決網路互聯中異構裝置的相容性問題,並解耦複雜的網路包處理流程,國際標準化組織制定的開放式系統互聯通訊參考模型(open system interconnection reference model),簡稱為 osi 網路模型。osi 模型把網路互聯的框架分為應用層、表示層、會話層、傳輸層、網路層、資料鏈路層以及物理層等七層,每個層負責不同的功能。其中,

應用層,負責為應用程式提供統一的介面。

表示層,負責把資料轉換成相容接收系統的格式。

會話層,負責維護計算機之間的通訊連線。

傳輸層,負責為資料加上傳輸表頭,形成資料報。

網路層,負責資料的路由和**。

資料鏈路層,負責 mac 定址、錯誤偵測和改錯。

物理層,負責在物理網路中傳輸資料幀。

但是 osi 模型還是太複雜了,也沒能提供乙個可實現的方法。所以,在 linux 中,我們實際上使用的是另乙個更實用的四層模型,即 tcp/ip 網路模型。tcp/ip 模型,把網路互聯的框架分為應用層、傳輸層、網路層、網路介面層等四層,其中,

應用層,負責向使用者提供一組應用程式,比如 http、ftp、dns 等。

傳輸層,負責端到端的通訊,比如 tcp、udp 等。

網路層,負責網路包的封裝、定址和路由,比如 ip、icmp 等。

網路介面層,負責網路包在物理網路中的傳輸,比如 mac 定址、錯誤偵測以及通過網絡卡傳輸網路幀等。

當乙個網路幀到達網絡卡後:

網絡卡會通過 dma 方式,把這個網路包放到收包佇列中;然後通過硬中斷,告訴中斷處理程式已經收到了網路包。

網絡卡中斷處理程式會為網路幀分配核心資料結構(sk_buff),並將其拷貝到 sk_buff 緩衝區中;然後再通過軟中斷,通知核心收到了新的網路幀。

接下來,核心協議棧從緩衝區中取出網路幀,並通過網路協議棧,從下到上逐層處理這個網路幀。比如,

最後,應用程式就可以使用 socket 介面,讀取到新接收到的資料了。為了更清晰表示這個流程,我畫了一張圖,這張圖的左半部分表示接收流程,而圖中的粉色箭頭則表示網路包的處理路徑。

當應用程式要傳送資料報時:  

首先,應用程式呼叫 socket api(比如 sendmsg)傳送網路包。由於這是乙個系統呼叫,所以會陷入到核心態的套接字層中。套接字層會把資料報放到 socket 傳送緩衝區中。

接下來,網路協議棧從 socket 傳送緩衝區中,取出資料報;再按照 tcp/ip 棧,從上到下逐層處理。比如,

最後,驅動程式通過 dma ,從發包佇列中讀出網路幀,並通過物理網絡卡把它傳送出去。

常見網路流模型

描述 n 個人,每個人有乙個狀態,存在 m 對朋友,每個人可以翻轉狀態,求翻轉次數 衝突的朋友對數的最小值 模型 原點向 0 狀態的人連一條 inf 的邊,1 狀態向匯點連一條 inf 的邊,朋友之間連一條流量為 1 的邊,求最小割 描述 有 n 行,m 列,每個格仔上有乙個數,不能選任意兩個有公共...

網路收發之cycleBuf

1 pragma once 23 include 4 include 56 class cyclebuffer722 23virtual cyclebuffer 2430 31 32 剩餘空間數 33int32 t space 3437 38 獲取buf的總大小 39int32 t capatity...

網路流模板與經典模型

1.模板 dinic模板 常規的最大流模板,演算法效率能滿足大部分題 include include include includeusing namespace std define ll long long const ll n 10007 const ll m 200007 const ll ...