sk_prot- >h.hashinfo; struct inet_bind_hashbucket * head ; struct inet_bind_bucket * tb = NULL ; 其中strcut inet_hashinfo是用來封裝各種協(xié)議的綁定哈希表,具體定義如下所示,這個結(jié)構(gòu)體在[Linux內(nèi)核角度分析服務(wù)器Listen細(xì)節(jié)中介紹過,具體地,struct inet_bind_hashbcket是bind相關(guān)的哈希桶,bhash_size是bind哈希桶的大小。 struct inet_hashinfo { struct inet_ehash_bucket * ehash ; spinlock_t *ehash_locks; unsigned" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核分析 端口哈希桶

麥辣雞腿堡 ? 來源:技術(shù)簡說 ? 作者:董旭 ? 2023-07-31 11:03 ? 次閱讀

端口哈希桶

在inet_csk_get_port函數(shù)中的變量聲名中有如下幾個結(jié)構(gòu)體:

struct inet_hashinfo *hinfo = sk- >sk_prot- >h.hashinfo;
struct inet_bind_hashbucket *head;
struct inet_bind_bucket *tb = NULL;

其中strcut inet_hashinfo是用來封裝各種協(xié)議的綁定哈希表,具體定義如下所示,這個結(jié)構(gòu)體在[Linux內(nèi)核角度分析服務(wù)器Listen細(xì)節(jié)中介紹過,具體地,struct inet_bind_hashbcket是bind相關(guān)的哈希桶,bhash_size是bind哈希桶的大小。

struct inet_hashinfo {
 struct inet_ehash_bucket *ehash;
 spinlock_t   *ehash_locks;
 unsigned int   ehash_mask;
 unsigned int   ehash_locks_mask;
 struct inet_bind_hashbucket *bhash;

 unsigned int   bhash_size;
 struct inet_listen_hashbucket listening_hash[INET_LHTABLE_SIZE]
     ____cacheline_aligned_in_smp;
};

struct inet_bind_hashbcket哈希桶的具體定義如下,其中chain代表著各個桶的哈希隊列,用來鏈接具有同一哈希值的哈希元素

struct inet_bind_hashbucket {
 spinlock_t  lock;
 struct hlist_head chain;
};

具體每個桶結(jié)構(gòu)是struct inet_bind_bucket:

struct inet_bind_bucket {
 possible_net_t  ib_net;
 unsigned short  port;
 signed char  fastreuse;
 signed char  fastreuseport;
 kuid_t   fastuid;
#if IS_ENABLED(CONFIG_IPV6)
 struct in6_addr  fast_v6_rcv_saddr;
#endif
 __be32   fast_rcv_saddr;
 unsigned short  fast_sk_family;
 bool   fast_ipv6_only;
 struct hlist_node node;
 struct hlist_head owners;
};

初次看到這幾個結(jié)構(gòu)體可能比較亂,下面用圖進(jìn)行描述:

圖片

由上圖所示,每個綁定的端口號經(jīng)過哈希計算都會掛在相應(yīng)的chain鏈表上,chain鏈表上是一個個的桶結(jié)構(gòu),同一個chain上的節(jié)點(diǎn)具有相同的哈希值(通過端口號計算),桶結(jié)構(gòu)inet_bind_bucket包含對應(yīng)的端口號port、owners等信息,owners對應(yīng):該端口號對應(yīng)的tcp_sock實(shí)例,如果該port支持復(fù)用,那么owners可能掛著多個tcp_sock節(jié)點(diǎn)。

在struct inet_bind_bucket中有一個關(guān)鍵的成員:signed char fastreuse

為了避免每次都遍歷 inet_bind_bucket 的 owners 字段 來獲知是否所有的 sock 都設(shè)置了 sk_reuse 字段,并且不是在 TCP_LISTEN 狀態(tài)。在 inet_bind_bucket 結(jié)構(gòu)體中設(shè)置了 fastreuse 字段。如果 owners 沒有元素,那么這 個字段為真。此后每次添加一個新的 sock 到 owners 中的時候,如果它設(shè)置了 sk_reuse 并且不在 TCP_LISTEN 狀態(tài),就維持 fastreuse 為真,否則設(shè)置它為假。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40293
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209535
收藏 人收藏

    評論

    相關(guān)推薦

    一文詳解Linux內(nèi)核源碼組織結(jié)構(gòu)

    概要:本文內(nèi)容包含Linux源碼樹結(jié)構(gòu)分析Linux Makefile分析、Kconfig文件分析、L
    的頭像 發(fā)表于 05-10 19:28 ?5765次閱讀

    linux內(nèi)核分析及編程

    linux內(nèi)核分析及編程
    發(fā)表于 04-20 08:26

    linux內(nèi)核分析及編程--

    本帖最后由 lee_st 于 2018-5-19 10:26 編輯 linux內(nèi)核分析及編程--
    發(fā)表于 05-09 09:49

    Linux內(nèi)核分析筆記總結(jié)

    孟寧老師這門課并沒有完整的分析Linux內(nèi)核中代碼,而是針對關(guān)鍵部分進(jìn)行了講解分析,個人認(rèn)為內(nèi)核代碼也是存在二八定律的情況,少部分關(guān)鍵代碼經(jīng)
    發(fā)表于 07-18 06:00

    Linux內(nèi)核教程

    本章學(xué)習(xí)目標(biāo)掌握LINUX內(nèi)核版本的含義理解并掌握進(jìn)程的概念掌握管道的概念及實(shí)現(xiàn)了解內(nèi)核的數(shù)據(jù)結(jié)構(gòu)了解LINUX內(nèi)核的算法掌握
    發(fā)表于 04-10 16:59 ?0次下載

    Android內(nèi)核分析

    介紹Android 移動平臺系統(tǒng)架構(gòu),通過對Android 源代碼的分析,將其與標(biāo)準(zhǔn)Linux 內(nèi)核(2.6.27)源代碼相比較,詳細(xì)解析Android 內(nèi)核的功能更新,
    發(fā)表于 10-29 16:17 ?116次下載

    linux內(nèi)核啟動內(nèi)核解壓過程分析

    linux啟動時內(nèi)核解壓過程分析,一份不錯的文檔,深入了解內(nèi)核必備
    發(fā)表于 03-09 13:39 ?1次下載

    基于Linux 2.6內(nèi)核Makefile分析

    基于2.4內(nèi)核的,可以說關(guān)于2.6內(nèi)核Makefile相關(guān)的文章鳳毛麟角,筆者抽時間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對
    發(fā)表于 09-18 19:09 ?0次下載
    基于<b class='flag-5'>Linux</b> 2.6<b class='flag-5'>內(nèi)核</b>Makefile<b class='flag-5'>分析</b>

    關(guān)于Linux 2.6內(nèi)核Makefile的分析

    的介紹文章都是基于2.4內(nèi)核的,可以說關(guān)于2.6內(nèi)核Makefile相關(guān)的文章鳳毛麟角,筆者抽時間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對
    發(fā)表于 11-02 10:12 ?1次下載

    Linux最新2.6內(nèi)核的Makefile體系詳細(xì)資料分析

    基于2.4內(nèi)核的,可以說關(guān)于2.6內(nèi)核Makefile相關(guān)的文章鳳毛麟角,筆者抽時間完成了這篇分析文章,讓讀者迅速熟悉Linux最新Makefile體系,從而加深對
    發(fā)表于 09-06 08:00 ?0次下載

    Linux內(nèi)核配置編譯分析的設(shè)計方案

    Linux內(nèi)核配置編譯分析的設(shè)計方案
    發(fā)表于 07-08 16:53 ?18次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>配置編譯<b class='flag-5'>分析</b>的設(shè)計方案

    linux內(nèi)核參數(shù)設(shè)置_linux內(nèi)核的功能有哪些

    本文主要闡述了linux內(nèi)核參數(shù)設(shè)置及linux內(nèi)核的功能。
    發(fā)表于 09-17 14:40 ?1375次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>參數(shù)設(shè)置_<b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>的功能有哪些

    Linux內(nèi)核GPIO操作函數(shù)的詳解分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是Linux內(nèi)核GPIO操作函數(shù)的詳解分析免費(fèi)下載。
    發(fā)表于 01-22 16:58 ?28次下載

    Linux內(nèi)核SoftIrq源代碼分析

    我們在分析linux內(nèi)核中斷剖析時,簡單的聊了一下SOFTIRQ, 而沒有進(jìn)行深入分析. Linux內(nèi)核
    發(fā)表于 06-23 15:22 ?597次閱讀

    Linux內(nèi)核分析 bind端口選擇

    端口選擇 繼續(xù)看inet_csk_get_port函數(shù): 在端口選擇前, 先確定當(dāng)前該socket的“屬性”,即是否可以端口復(fù)用,是否在TCP_LISTEN狀態(tài),以便后面插入到隊列時
    的頭像 發(fā)表于 07-31 11:08 ?962次閱讀