套接字的秘密 socket與sock

2021-10-23 14:10:34 字數 2424 閱讀 9341

那麼如何把套接字和檔案聯絡起來呢? 答案就是通過下面這張圖。

其中task_struct表示乙個程序,files_struct中的fd_array表示該程序開啟的所有描述符,對於套接字來說,與其他型別檔案的區別就是最終f_op指向的是socket_file_ops。不過,可以看到,這裡的socket_file_ops只有一些通用的操作,並沒有sendrecv。特有的操作通過socketcall()區分的。

終於到今天的主角了。實際上,對每乙個新建立的套接字,核心協議棧都會建立struct socketstruct sock兩個資料結構。這兩個結構就像孿生兄弟,struct socket面向使用者空間,struct sock面向核心空間。

struct socket

struct socket簡化版的結構如下

其中task_struct表示乙個程序,files_struct中的fd_array表示該程序開啟的所有描述符,對於套接字來說,與其他型別檔案的區別就是最終f_op指向的是socket_file_ops。不過,可以看到,這裡的socket_file_ops只有一些通用的操作,並沒有sendrecv。特有的操作通過socketcall()區分的。

終於到今天的主角了。實際上,對每乙個新建立的套接字,核心協議棧都會建立struct socketstruct sock兩個資料結構。這兩個結構就像孿生兄弟,struct socket面向使用者空間,struct sock面向核心空間。

struct socket

struct socket簡化版的結構如下

struct socket ;

其中type表示協議,這是在建立套接字的時候的protocol引數確定的

int socket(int domain, int type, int protocol);
file指標指向上面那張圖中的struct file結構,通過它,socket便與檔案系統關聯了起來。

sk指向孿生的兄弟sock結構。

socket結構中最重要的要數ops指標了,根據協議型別,它指向一種特定協議的實現。比如tcp的就是inet_stream_ops,icmp、udp協議對應inet_dgram_ops,rawip對應的是inet_sockraw_ops同樣地,這些也都在建立套接字的時候就決定了。

struct proto_ops的簡化版本的結構如下

inetsw中註冊的每種協議都有opsprot兩個字段,前者與struct socket結構關聯到一起,後者與struct sock關聯到一起。在inet_create中,struct socketops欄位和struct socksk_prot欄位被賦值。

以我們建立的套接字型別是tcp為例,此時struct socketstruct sock的關係如下

套接字 Socket 定義

套接字介面可分為三類 公認埠 註冊埠 動態和 或私有埠 套接字,簡單的說就是通訊的兩方的一種約定,用套接字中的相關函式來完成通訊過程 應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要通過同乙個 tcp協議埠傳輸資料...

socket 套接字通訊

要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...

套接字(socket) 埠

套接字 socket socket可以看成在兩個程式進行通訊連線中的乙個端點,乙個程式將一段資訊寫入socket中,該socket將這段資訊傳送給另外乙個socket中,使這段資訊能傳送到其他程式中。套接字,是支援tcp ip的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,...