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

    文章

    1309

    浏览量

    39850
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
收藏 人收藏

    评论

    相关推荐

    一文详解Linux内核源码组织结构

    概要:本文内容包含Linux源码树结构分析Linux Makefile分析、Kconfig文件分析L
    的头像 发表于 05-10 19:28 5342次阅读

    [linux内核及其内核源码分析].CRYSTALWEB

    [linux内核及其内核源码分析].CRYSTALWEB
    发表于 08-04 00:17

    linux内核分析及编程

    linux内核分析及编程
    发表于 04-20 08:26

    linux内核分析及编程--

    本帖最后由 lee_st 于 2018-5-19 10:26 编辑 linux内核分析及编程--
    发表于 05-09 09:49

    Linux内核分析笔记总结

    孟宁老师这门课并没有完整的分析Linux内核中代码,而是针对关键部分进行了讲解分析,个人认为内核代码也是存在二八定律的情况,少部分关键代码经
    发表于 07-18 06:00

    Linux内核源码之我见——内核源码的分析方法

    的代码高手。透过阅读Linux内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。我也是通过一个项目接触了Linux
    发表于 05-11 07:00

    Android内核分析

    介绍Android 移动平台系统架构,通过对Android 源代码的分析,将其与标准Linux 内核(2.6.27)源代码相比较,详细解析Android 内核的功能更新,
    发表于 10-29 16:17 115次下载

    linux内核启动内核解压过程分析

    linux启动时内核解压过程分析,一份不错的文档,深入了解内核必备
    发表于 03-09 13:39 1次下载

    Linux内核源代码情景分析(全册高清带书签)

    Linux内核源代码情景分析(全册高清带书签)
    发表于 01-14 15:20 50次下载

    基于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内核提权攻击研究

    提权攻击,内核提权攻击仍是Linux系统面临的一个重要威胁。内核提权攻击一般通过利用内核提权漏洞进行攻击。针对内核提权攻击,
    发表于 11-24 11:46 0次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>提权攻击研究

    Linux内核源代码情景分析(全册高清带书签)pdf下载

    Linux内核源代码情景分析需要的拿走吧
    发表于 01-04 16:57 8次下载

    Linux内核配置编译分析的设计方案

    Linux内核配置编译分析的设计方案
    发表于 07-08 16:53 18次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>配置编译<b class='flag-5'>分析</b>的设计方案

    Linux内核GPIO操作函数的详解分析

    本文档的主要内容详细介绍的是Linux内核GPIO操作函数的详解分析免费下载。
    发表于 01-22 16:58 28次下载