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

一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

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

麥辣雞腿堡 ? 來(lái)源:技術(shù)簡(jiǎn)說(shuō) ? 作者:董旭 ? 2023-07-31 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

端口哈希桶

在inet_csk_get_port函數(shù)中的變量聲名中有如下幾個(gè)結(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是用來(lái)封裝各種協(xié)議的綁定哈希表,具體定義如下所示,這個(gè)結(jié)構(gòu)體在[Linux內(nèi)核角度分析服務(wù)器Listen細(xì)節(jié)中介紹過(guò),具體地,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代表著各個(gè)桶的哈希隊(duì)列,用來(lái)鏈接具有同一哈希值的哈希元素

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

具體每個(gè)桶結(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;
};

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

圖片

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

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

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

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

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41421
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213748
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    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)核教程

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

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

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

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

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

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

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

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

    Linux內(nèi)核配置編譯分析的設(shè)計(jì)方案
    發(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è)計(jì)方案

    linux內(nèi)核是什么_linux內(nèi)核學(xué)習(xí)路線

    Linux內(nèi)核是一個(gè)操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux
    發(fā)表于 09-16 15:49 ?2841次閱讀

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

    本文主要闡述了linux內(nèi)核參數(shù)設(shè)置及linux內(nèi)核的功能。
    發(fā)表于 09-17 14:40 ?1515次閱讀
    <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源代碼分析

    我們?cè)?b class='flag-5'>分析linux內(nèi)核中斷剖析時(shí),簡(jiǎn)單的聊了一下SOFTIRQ, 而沒(méi)有進(jìn)行深入分析. Linux內(nèi)核
    發(fā)表于 06-23 15:22 ?847次閱讀

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

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