網路協議棧是由若干個層組成的,網路資料的流程主要是指在協議棧的各個層之間的傳遞。在第
7.2節裡介紹了
tcp網路程式設計的流程,乙個
tcp伺服器的流程按照建立
socket()
,繫結(
bind()
)位址埠,偵聽埠
listen()
,接收連線
accept()
,傳送資料
send()
,接收資料
recv()
,關閉socket()
的順序來進行。與此對應核心的處理過程也是按照此順序進行的,網路資料在核心中的處理過程主要是在網絡卡和協議棧之間進行:從網絡卡接收資料,交給協議棧處理;協議棧將需要傳送的資料通過網路發出去。
圖16.3
總結了各層間在網路輸入輸出時的層間呼叫關係。由圖中可以看出,資料的流向主要有兩種。應用層輸出資料時,資料按照自上而下的順序,依次通過插口層、協議層和介面層;當有資料到達的時候,自下而上依次通過介面層、協議層和插口層的方式,在核心層傳遞。
圖16.3
網路輸入輸出的各層間呼叫
應用層的
socket
的初始化、繫結(
bind
)、銷毀通過呼叫核心層的
socket()
函式進行資源的申請、銷毀。
傳送資料的時候,將資料由插口層傳遞給協議層,協議層在
udp層新增
udp的首部、
tcp層新增
tcp的首部、
ip層新增
ip的首部,介面層的網絡卡則新增乙太網相關的資訊後,通過網絡卡的傳送程式傳送到網路上。
接收資料的過程是乙個相反的過程,當有資料到來的時候,網絡卡的中斷處理程式將資料從乙太網網絡卡的
fifo
對列中接收到核心,傳遞給協議層,協議層在
ip層剝離
ip的首部、
udp層剝離
udp的首部、
tcp層剝離
tcp的首部後傳遞給插口層,插口層查詢
socket
的標示後,將資料送給使用者層匹配的
socket。圖
16.4
為linux
核心層的網路協議棧的架構檢視。最上面是使用者空間層,應用層的程式位於此處。最底部是物理裝置,例如乙太網網絡卡等,提供網路資料的連線、收發。中
間是核心層,即網路協議棧子系統。流經網路棧內部的是
socket
緩衝區(由結構
sk_buffs
接連),它負責在源和匯點之間傳遞報文資料。在
16.1.4
節中會對
sk_buff
的結構進行
介紹。圖16.4linux
核心網路協議棧架構
頂部(參見圖
16.4
)是系統呼叫介面,它為使用者空間的應用程式提供了一種訪問核心網路子系統的介面。位於其下面的是乙個協議無關層,它提供了一種通用方法來使用底層傳輸層協議。然後是實際協議,在
linux
中包括內嵌的協議
tcp、
udp,當然還有
ip。然後是另外乙個網路裝置協議無關層,提供了與各個裝置驅動程式通訊的通用介面,最下面是裝置驅動程式本身。
核心中讀寫檔案
在使用者態,可以使用open,close,read,write等系統呼叫來訪問檔案。那麼核心中呢?使用filp open等函式進行操作,但是這些操作又有些需要注意的地方。在實際應用中,我們可以把系統執行的一些狀態記錄到記憶體中,但記憶體畢竟小,而且在系統重啟後,資料會丟失。那麼是否可以在核心中開啟乙...
Java核心中的核心 多型
一句話概括多型 也叫動態繫結 在執行期間,判斷其引用的實際型別,根據其實際的型別,呼叫對應的方法。多型可以幫助我們的程式的顆擴充套件性達到極致。多型的三個必要條件 1 要有繼承。2 子類要重寫父類的方法。3 父類的引用指向子類的物件。根據以下的 來理解 class animal 在animal類裡面...
IoC容器 Spring核心中的核心
spring 容器是 spring 框架的核心。容器將建立物件,把它們連線在一起,配置它們,並管理他們的整個生命週期從建立到銷毀。spring 容器使用依賴注入 di 來管理組成乙個應用程式的元件。這些物件被稱為 spring bean。1 spring主要容器包括beanfactory sprin...