Linux內(nèi)核網(wǎng)絡基礎-TCP相關的幾個關鍵結構體-小記
Linux內(nèi)核網(wǎng)絡源碼中經(jīng)??吹降膸讉€與TCP相關的關鍵結構體如下圖所示,本文圍繞下面這個圖展開分析,分別介紹各個結構體以及關系

上圖關系可以這樣描述:
<span>struct inet_sock</span>繼承自<span>struct sock</span>
<span>struct inet_connection_sock</span>繼承自struct inet_sock
<span>struct tcp_sock</span>繼承自struct inet_connection_sock
四個結構的關系具有面向?qū)ο蟮奶卣?,通過層層繼承,實現(xiàn)了類的復用;內(nèi)核中網(wǎng)絡相關的很多函數(shù),參數(shù)往往都是struct sock,?函數(shù)內(nèi)部依照不同的業(yè)務邏輯,將struct sock轉(zhuǎn)換為不同的業(yè)務結構?;這樣做的好處:
簡化接口的設計復雜度;
使用基類作為參數(shù),類似于面向?qū)ο笾械亩鄳B(tài)特性,能夠有效的增強接口的穩(wěn)定性、提升擴展性。
分別看一下這幾個結構體如下:
struct tcp_sock的結構體成員大都是與tcp協(xié)議本身相關的關鍵字段,可以看到該結構體的的一個成員即為struct inet_connection_sock結構體,即struct tcp_sock從struct inet_connection_sock結構體的基礎上繼承而來,增加了一些tcp協(xié)議相關的字段,如滑動窗口協(xié)議,擁塞算法等一些TCP專有的屬性。
【文章福利】小編推薦自己的Linux內(nèi)核技術交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ??


繼續(xù)看結構體,如下所示,它的一個域是 ,即struct inet_connection_sock結構體從struct inet_sock的基礎上繼承而來,增加了一些面向連接需要的字段。struct inet_connection_sock``struct inet_sock
如下所示,可以看到結構體,可以看到該結構的第一個成員是結構體,即struct inet_sock是struct sock從的基礎上基礎而來,增加了一些INET域?qū)S械囊恍傩?,比如TTL,組播列表,IP地址,端口等。struct inet_sock``struct sock
struct sock結構體如下所示,是最基礎的sock結構體,也是網(wǎng)絡中最核心的結構體。
看到這個結構體很自然想到struct socket結構體,如下所示,經(jīng)常會有人問struct socket與struct sk有什么關聯(lián)?
struct socket是通用BSD的socket定義,面向上層,struct sock面向下層,struct sock結構體定義非常大,根據(jù)使用的不通協(xié)議而掛入到struct socket,之所以從socket中分離出sock一個這樣重要的結構是因為socket是通用的套接字結構體,而sock與具體使用的協(xié)議相關??偠灾阎匾椃旁谂c應用系統(tǒng)關系密切的結構 struct socket里,其他(如struct sock)因為要占用大量的內(nèi)存空間,而將這此結構變量分離出來放在另外一些結構中,再讓兩個結構體彼此關聯(lián)。
既然提到了這四個結構體的繼承關系,文章看到也提到說這種繼承關系的便利,如內(nèi)核中網(wǎng)絡相關的很多函數(shù),參數(shù)往往都是struct sock, 函數(shù)內(nèi)部依照不同的業(yè)務邏輯,將struct sock轉(zhuǎn)換為不同的業(yè)務結構, 下面分析幾個不同結構體直接互相轉(zhuǎn)換的函數(shù):
struct sock與struct inet_sock之間:
struct sock與struct inet_connection_sock之間
struct sock與struct tcp_sock之間
總之:tcp_sock,inet_connection_sock,inet_sock這幾個結構體的第一個成員全都是struct sock;一層層繼承下來,每一層都有自己的擴展,而且這些結構體在申請大小的時候都是按照最大值sizeof(struct tcp_sock)申請的,所以強轉(zhuǎn)也不會越界。
