struct socket 結構詳解

2022-06-15 08:48:14 字數 2463 閱讀 5555

使用者使用socket系統呼叫編寫應用程式時,通過乙個數字來表示乙個socket,所有的操作都在該數字上進行,這個數字稱為套接字描述符。在系統呼叫 的實現函式裡,這個數字就會被對映成乙個表示socket的結構體,該結構體儲存了該socket的所有屬性和資料。在核心的協議中實現中,關於表示 socket的結構體,是乙個比較複雜的東西,下面一一介紹。 

struct socket。 

這是乙個基本的bsd socket,我們呼叫socket系統呼叫建立的各種不同型別的socket,開始建立的都是它,到後面,各種不同型別的socket在它的基礎上進行 各種擴充套件。struct socket是在虛擬檔案系統上被建立出來的,可以把它看成乙個檔案,是可以被安全地擴充套件的。下面是其完整定義: 

c**  

struct socket ;  

state用於表示socket所處的狀態,是乙個列舉變數,其型別定義如下: 

c**  

typedef enum socket_state;  

該成員只對tcp socket有用,因為只有tcp是面向連線的協議,udp跟raw不需要維護socket狀態。 

flags是一組標誌位,在核心中並沒有發現被使用。 

ops是協議相關的一組操作集,結構體struct proto_ops的定義如下: 

c**  

struct proto_ops ;  

協議棧中總共定義了三個strcut proto_ops型別的變數,分別是myinet_stream_ops, myinet_dgram_ops, myinet_sockraw_ops,對應流協議, 資料報和原始套介面協議的操作函式集。 

type是socket的型別,對應的取值如下: 

c**  

enum sock_type ;  

sk是網路層對於socket的表示,結構體struct sock比較龐大,這裡不詳細列出,只介紹一些重要的成員, 

sk_prot和sk_prot_creator,這兩個成員指向特定的協議處理函式集,其型別是結構體struct proto,該結構體也是跟struct proto_ops相似的一組協議操作函式集。這兩者之間的概念似乎有些混淆,可以這麼理解,struct proto_ops的成員操作struct socket層次上的資料,處理完了,再由它們呼叫成員sk->sk_prot的函式,操作struct sock層次上的資料。即它們之間存在著層次上的差異。struct proto型別的變數在協議棧中總共也有三個,分別是mytcp_prot,myudp_prot,myraw_prot,對應tcp, udp和raw協議。 

sk_state表示socket當前的連線狀態,是乙個比struct socket的state更為精細的狀態,其可能的取值如下:    

c**  

enum ;  

struct inet_sock。 

這是inet域專用的乙個socket表示,它是在struct sock的基礎上進行的擴充套件,在基本socket的屬性已具備的基礎上,struct inet_sock提供了inet域專有的一些屬性,比如ttl,組播列表,ip位址,埠等,下面是其完整定義:

c**  

struct inet_sock  cork;  

};  

struct raw_sock 

這是raw協議專用的乙個socket的表示,它是在struct inet_sock基礎上的擴充套件,因為raw協議要處理icmp協議的過濾設定,其定義如下: 

c**  

struct raw_sock ;  

struct udp_sock 

這是udp協議專用的乙個socket表示,它是在struct inet_sock基礎上的擴充套件,其定義如下: 

c**  

struct udp_sock ;  

struct inet_connection_sock 

看完上面兩個,我們覺得第三個應該就是struct tcp_sock了,但事實上,struct tcp_sock並不直接從struct inet_sock上擴充套件,而是從struct inet_connection_sock基礎上進行擴充套件,struct inet_connection_sock是所有面向連線的socket的表示,關於該socket,及下面所有tcp相關的socket,我們在分析 tcp實現時再詳細介紹,這裡只列出它們的關係。 

strcut tcp_sock 

這是tcp協議專用的乙個socket表示,它是在struct inet_connection_sock基礎進行擴充套件,主要是增加了滑動視窗協議,避免擁塞演算法等一些tcp專有屬性。 

struct inet_timewait_sock 

struct tcp_timewait_sock 

在struct inet_timewait_sock的基礎上進行擴充套件。 

struct inet_request_sock 

struct tcp_request_sock 

在struct inet_request_sock的基礎上進行擴充套件。 

struct socket 結構詳解

使用者使用socket系統呼叫編寫應用程式時,通過乙個數字來表示乙個socket,所有的操作都在該數字上進行,這個數字稱為套接字描述符。在系統呼叫 的實現函式裡,這個數字就會被對映成乙個表示socket的結構體,該結構體儲存了該socket的所有屬性和資料。在核心的協議中實現中,關於表示 socke...

struct socket 結構詳解

使用者使用socket系統呼叫編寫應用程式時,通過乙個數字來表示乙個socket,所有的操作都在該數字上進行,這個數字稱為套接字描述符。在系統呼叫 的實現函式裡,這個數字就會被對映成乙個表示socket的結構體,該結構體儲存了該socket的所有屬性和資料。在核心的協議中實現中,關於表示 socke...

mysql多索引結構 MySQL 索引結構詳解

innodb的主鍵索引 primary key 是cluster形式的 聚簇索引 innodb的非主鍵索引 secondary index 是普通的b tree索引。兩種索引在root node和branch node是一樣的,在leaf node就不一樣了。primary key存放的是表的實際資...