linux内核网络监听哈希表介绍

本文深入解析Linux内核2.4.0中用于管理监听和连接socket的两个哈希表:tcp_listening_hash和tcp_ehash。文章介绍了它们的定义、初始化、元素增删以及哈希函数的工作原理,强调了哈希表在快速查找服务器监听和已建立连接套接字中的作用。
摘要由CSDN通过智能技术生成

以下基于linux内核 2.4.0 源码(转载请注明出处)

松哥 jccz_zys@tom.com

 

    网络通信过程中,服务器必然提供监听socket响应客户端连接请求,也必然提供连接socket与客户端进行交互。一台主机上有不止一个的socket服务器,如ftptelnet服务器等,他们初始都处于监听状态,等待连接请求的到来。linux中为了管理这两类socket提供了两个哈希链表:tcp_listening_hashtcp_ehash,下面主要分析下监听哈希表,顺带说下连接hash表。

一、链表定义

    include/net/tcp.h中定义了tcp_hashinfo结构,包含了tcp协议所涉及到的一些哈希表信息,这两个哈希表以tcp_hashinfo的成员形式出现,如下所示:

   

    extern struct tcp_hashinfo {

       /* 结构成员用于tcp状态迁移图中的相关状态:

        *          TCP_ESTABLISHED <= sk->state < TCP_CLOSE

        * 前半部份用于非超时状态,后半部份仅用于超时状态

        */

       struct tcp_ehash_bucket *__tcp_ehash;

 

       /* tcp的绑定哈希表,用于快速bind/connect*/

       struct tcp_bind_hashbucket *__tcp_bhash;

 

       int __tcp_bhash_size;

       int __tcp_ehash_size;

 

       /* 所有在监听状态的socket都存放在下面的哈希表中,其中键key为本地监听端口*/

       struct sock *__tcp_listening_hash[TCP_LHTABLE_SIZE];

 

       /*下面的成员缓冲区对齐*/

       rwlock_t __tcp_lhash_lock /*监听哈希表访问锁*/

              __attribute__((__aligned__(SMP_CACHE_BYTES)));

       atomic_t __tcp_lhash_users;

       wait_queue_head_t __tcp_lhash_wait;

       /*上述三个成员主要用于用户通过/proc/ne获取监听套接字(间接访问监听哈希表时)信息时异步处理*/

       spinlock_t __tcp_portalloc_lock;

    } tcp_hashinfo;

    接下来定义了一些宏以简化引用:

    #define tcp_ehash   (tcp_hashinfo.__tcp_ehash) /*连接哈希链表*/

    #define tcp_bhash   (tcp_hashinfo.__tcp_bhash) /*地址bind哈希链表*/

    #define tcp_ehash_size   (tcp_hashinfo.__tcp_ehash_size) /*连接哈希链表长度

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值