linux内核网络揭秘《一》 “每日读书”

本文详细介绍了Linux内核中常见的编码模式,特别是内存管理和缓存技术,如kmalloc/kfree、内存缓存的使用、sk_buff缓存、邻居协议映射、路由表缓存机制,以及如何通过kmem_cache和hash表来提高性能和防御拒绝服务攻击。
摘要由CSDN通过智能技术生成

常见编码模式

与其他内核功能类似每种网络功能只是内核各种功能之一因此必须适当公平使用内存CPU以及其他各种共享资源多数功能内核中并非代码片段根据功能而定或多或少其他内核组建交互因此类似功能都会尽可能采用类似机制实现(已经发明的东西没有必要再重新发明一次)

有些内核组件有一些共同需求必须分配同一种数据结构类型几个实例必须记录某种数据结构实例引用避免不安全内存回收诸如此类下面几个小节我们将说明linux处理这类需求常见做法

内存缓存

内核分别使用kmallockfree函数分配释放一个内存块malloc free类似内核组建同一种数据结构类型分配几个实例instance 是很常见事情分配回收经常发生相关内核组件初始化函数fib_hash_init 通常会分配一块特殊内存缓存分配之用当一个内存被映射释放实际上返回到当初分配同一个缓存

内核维护专属内存缓存一些网络数据结构例子包括

套接字缓冲区描述符

这个缓存net/core/sk_buff.cskb_init分配用于分配sk_buff缓冲区描述符sk_buff结构可能网络子系统分配回收注册次数最高

邻居协议映射

每个邻居协议使用一个缓冲区分配存储L3层L2地址映射数据结构

参见二十七

路由表

路由代码使用两块缓存用于定义路径两个数据结构以下用于处理内存缓存关键内核函数

kmem_cache_create

kmem_cache_destroy

创建销毁一个缓存

kmem_cache_alloc

kmem_cache_free

缓存分配以及回收一个缓冲通常调用包裹函数wrapper 实现分配回收一个缓存缓冲区包裹函数较高管理用于处理分配回收请求例如kfree_skb 要求释放一个sk_buff 缓冲区是一个实例只有所有缓冲引用已经释放而且相关子系统也罢所有必要清理工作都做完之后才回去调用kmem_cache_free.

给定缓冲区所能分配实例树木限制通常kmem_cache_alloc 包裹函数决定但是有些时候可以通过/proc 参数进行配置

有关内存缓存实现以及厚片分配器slab_allocator 之间接口细节参考《深入理解linux内核》一书

缓存hash

使用缓存提高性能很常见事情网络代码中L3L2之间映射以及路由表使用缓存

缓存查询函数通常有一个输入参数出发缓存命中cache miss 是否应该缓冲创建添加一个新的元素没有这个参数查询函数岁时不命中元素新增进来

缓存通常三列表(即hash表)实现内核提供一组数据类型单向双向列表用来构建简单hash有些输入经过hash得到相同标准处理方式就是将其放入一个列表中查询这个列表所花时间采用hash关键字(key)查询所花时间长得多因此hash相同输入树木缩到最小一直都是很重要事情

hash查询时间(无论是否使用缓存)拥有子系统关键参数可以实现一种机制增加hash大小使得冲突列表(collision list)平均长度得以下降平均查询时间得以改善参见三十四基于子网掩码hash容量动态调整一节实例

你也会发现有些子系统在关键字key添加一个随机分子使元素分散缓存bucket中呢这是为了减少拒绝服务攻击损害这种攻击hash元素集中一个bucket

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值