sk_prot- >h.hashinfo; struct inet_bind_hashbucket * head ; struct inet_bind_bucket * tb = NULL ; 其中strcut inet_hashinfo是用來封裝各種協議的綁定哈希表,具體定義如下所示,這個結構體在[Linux內核角度分析服務器Listen細節中介紹過,具體地,struct inet_bind_hashbcket是bind相關的哈希桶,bhash_size是bind哈希桶的大小。 struct inet_hashinfo { struct inet_ehash_bucket * ehash ; spinlock_t *ehash_locks; unsigned" />

吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核分析 端口哈希桶

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

端口哈希桶

在inet_csk_get_port函數中的變量聲名中有如下幾個結構體:

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

其中strcut inet_hashinfo是用來封裝各種協議的綁定哈希表,具體定義如下所示,這個結構體在[Linux內核角度分析服務器Listen細節中介紹過,具體地,struct inet_bind_hashbcket是bind相關的哈希桶,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;
};

具體每個桶結構是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;
};

初次看到這幾個結構體可能比較亂,下面用圖進行描述:

圖片

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

在struct inet_bind_bucket中有一個關鍵的成員:signed char fastreuse

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40425
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210399
收藏 人收藏

    評論

    相關推薦

    一文詳解Linux內核源碼組織結構

    概要:本文內容包含Linux源碼樹結構分析Linux Makefile分析、Kconfig文件分析L
    的頭像 發表于 05-10 19:28 ?5820次閱讀

    linux內核分析及編程

    linux內核分析及編程
    發表于 04-20 08:26

    linux內核分析及編程--

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

    Linux內核教程

    本章學習目標掌握LINUX內核版本的含義理解并掌握進程的概念掌握管道的概念及實現了解內核的數據結構了解LINUX內核的算法掌握
    發表于 04-10 16:59 ?0次下載

    Android內核分析

    介紹Android 移動平臺系統架構,通過對Android 源代碼的分析,將其與標準Linux 內核(2.6.27)源代碼相比較,詳細解析Android 內核的功能更新,
    發表于 10-29 16:17 ?116次下載

    linux內核啟動內核解壓過程分析

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

    基于Linux 2.6內核Makefile分析

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

    關于Linux 2.6內核Makefile的分析

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

    Linux最新2.6內核的Makefile體系詳細資料分析

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

    Linux內核配置編譯分析的設計方案

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

    linux內核是什么_linux內核學習路線

    Linux內核是一個操作系統(OS)內核,本質上定義為類Unix。它用于不同的操作系統,主要是以不同的Linux發行版的形式。Linux
    發表于 09-16 15:49 ?2675次閱讀

    linux內核參數設置_linux內核的功能有哪些

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

    Linux內核GPIO操作函數的詳解分析

    本文檔的主要內容詳細介紹的是Linux內核GPIO操作函數的詳解分析免費下載。
    發表于 01-22 16:58 ?28次下載

    Linux內核SoftIrq源代碼分析

    我們在分析linux內核中斷剖析時,簡單的聊了一下SOFTIRQ, 而沒有進行深入分析. Linux內核
    發表于 06-23 15:22 ?639次閱讀

    Linux內核分析 bind端口選擇

    端口選擇 繼續看inet_csk_get_port函數: 在端口選擇前, 先確定當前該socket的“屬性”,即是否可以端口復用,是否在TCP_LISTEN狀態,以便后面插入到隊列時
    的頭像 發表于 07-31 11:08 ?1000次閱讀
    德州扑克怎么分钱| 百乐门娱乐| 威尼斯人娱乐城最新地址| 真人游戏豆瓣| 真钱现金斗地主| 广东百家乐官网桌布| 百家乐官网画面| 皇冠百家乐在线游戏| 大发888娱乐场下| 广宗县| 包赢百家乐官网的玩法技巧和规则 | 屏边| 巴特百家乐官网的玩法技巧和规则| 百家乐开和几率| 太阳城| 百家乐官网园搏彩论坛| 百家乐3宜3忌| 金矿百家乐的玩法技巧和规则| 99棋牌游戏| 百家乐官网赌博技巧论坛| 百家乐单注打法| 临朐县| 百家乐娱乐官方网| 娱乐城代理| 赌场百家乐官网是如何玩| 百家乐群html| 海滨湾国际娱乐城| 顶尖百家乐官网的玩法技巧和规则| 百家乐软件| 百家乐官网游戏程序出售| 娱网百家乐补丁| 武功县| 永利高百家乐会员| 马牌娱乐场| 24山风水| 总统娱乐城能赢钱吗| 飞天百家乐官网的玩法技巧和规则| 威尼斯人娱乐城真人游戏| 百家乐官网如何视频| 24山方位| 优博网|