使用者使用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存放的是表的實際資...