免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1544 | 回复: 0
打印 上一主题 下一主题

深入理解Linux网络内幕(中文版)-PART I -通用背景-(第一章 介绍) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-08 14:18 |只看该作者 |倒序浏览
博客:
帘卷西风
  译者:billux
这一部分内容是你顺利的理解本书其余章节所必须的。如果你已经熟悉了Linux内核,亦或者你是一个老道的软件工程师,那么你会非常快的过完这些章节。而对于其他读者,我建议先熟悉这一部分内容然后再开始本书的其他部分:
第一章,介绍
本章的主旨在于介绍一些常见的编程模式和技巧,这些模式与技巧你将在网络部分源码中经常碰到。
第二章,重要的数据结构
在这一章中,你将看到网络部分代码中用到的两个重要数据结构的详细描述:socket缓冲结构sk_buff和网络设备结构net_device。
第三章,用户空间到内核的接口
本书中讨论的每一个Linux网络特征,都以介绍用户空间工具怎样与内核通讯的小节为终结。这一章的信息将帮助你更好的理解这些小节。
第一章 介绍
研究一个大工程的源代码,就好像进入了一个有着自己的风俗和语言的陌生新大陆。预先学习一些主要的当地习俗,并且试着与当地居民交流而不是避而远之,这都是非常有用的。
本章主要为你介绍一些通用的编程模式和技巧,你将在网络部分代码中经常碰到他们。
如果可能的话,我鼓励你,试着通过用户空间的工具与一块特定网络部分代码进行交互。如果你的Linux发行版还没有安装这些工具,或假如你只是简单的想将他们升级到最新版本,那么在这章,我将告诉你一些信息哪里能下载到那些工具。
我还会介绍一些工具,他们可以使你轻松的穿越庞大的源代码。最后,我将简短的介绍一下为什么一些内核特征没有被整合进官方发布版中,虽然他们已经在Linux社区中被广泛使用。

基本术语
这一小节,我将介绍一些本书中广泛使用的术语与缩写词。

8位元在网络领域通常被称为octets。然而,在本书,我将使用更为通用的术语字节(byte)。毕竟,本书描述的是内核的行为而不是网络抽象,而且内核开发人员也更习惯于使用字节。

向量(vector)和数组(array)将被交互的使用。

当提及TCP/IP协议栈的层次时,我将分别使用缩写L2,L3,L4来代替数据链路层,网络层和传输层。缩写中的数字基于著名的(也许现在已不恰当)七层OSI模型。在绝大多数例子中,L2将成为以太的同义词,L3则代表了IPv4或IPV6,而L4则是UDP,TCP,ICMP等协议。当我要提及一种具体的协议时,我会使用它的名字(比如TCP)而不是术语"Ln层协议"。

在不同的章节,我们将看到数据包是如何被网络栈的不同层协议所接受和发送。在这些上下文中,接受包(ingress)和输入包(input)将被交换使用。而发送包(egress)和输出包(output)也是一样。数据包的发送与接受也可以分别用RX和TX来表示。

数据包有不同的名称,比如帧(frame),包(packet),段(segment),以及消息(message),这个取决于数据包所处的层(详细介绍参考第十三章)。表1-1总结了你会在本书中看到的主要的缩写。

-------------------------------------------------------------------------------
Table1-1. 本书中经常使用的缩写
缩写             意义
L2              数据链路层(如,以太)
L3              网络层(如,IP)
L4              传输层(如,UDP/TCP/ICMP)
BH              下半部(译:熟悉linux中断的朋友都应该清楚)
IRQ             中断
RX              接收
TX              发送
-------------------------------------------------------------------------------

通用编码模式
就像其他内核特征一样,每一个网络特征就是内核中的一个居民。那么,他必须合理、公平的使用内存、CPU以及其他所有的共享资源。大多数的特征并不是被写成一个内核的孤立单元,而是或多或少的依赖于内核的其他模块。因此,他们试图尽可能的遵循相似的机制来实现相似的功能(没有必要重新发明轮子)。

一些需求对于某些内核模块是非常普通的,比如分配一些数据结构的空间,跟踪数据结构的引用计数以避免不安全的内存释放等。在下面的子节中,我我们将看到Linux处理这些需求的一般方法。我也将介绍一些通常的编程技巧,他们是你在浏览内核源码的过程中经常会遇到的。

本书使用子系统这个抽象的术语来描述由一些文件实现的一些主要特征,如IP或路由,这些特征通常只有同一个人进行维护。在剩余的章节中,我将使用术语内核模块来代表这些子系统,因为这里讨论的习惯将被应用于大多数的内核部分,而不是仅限于网络部分。

内存高速缓存
内核分别使用函数kmalloc和kfree来分配和释放内存块。这两个函数的用法与用户空间库libc中的malloc和free颇为相似。想详细了解kmalloc和kfree,请参阅《Linux设备驱动程序》(O'Reilly)。

对于内核模块来说分配几个某种数据结构的实例是非常平常的事。当这种分配和释放会经常的发生时,相关内核模块的初始化例程(例如,与路由表相关的fib_hash_init函数)通常会分配一块用于分配的特殊内存缓存。当一个内存块被释放时,它事实上又被返回到它在分配前所在地方去。

网络部分的数据结构由内核维护的高速缓存有:

Socket缓存描述符
   这个高速缓存,由net/core/sk_buff.c中的skb_init函数分配,用来分配sk_buff缓存描述符。sk_buff结构体可能是网络部分中分配和释放频率最高的了。
相邻协议图
   每一个相邻协议用一个高速缓存分配数据结构用来存储L3到L2的查询表。参考第二十七章。
路由表
   路由代码使用两种数据结构的高速缓存来定义路由。参考第三十二章。

下面是一些用来处理高速缓存的关键内核函数:
kmem_cache_create
kmem_cache_destroy
   创建和销毁一个高速缓存。
kmem_cache_alloc
kmem_cache_free
   从高速缓存中分配一个缓存以及返回一个缓存到高速缓存中去。这两个函数通常经过封装函数进行调用,封装函数在更高的层次上管理分配和释放的请求。比如,释放一个sk_buff实例的函数kfree_skb只有当所有对该实例的引用都已经被释放,所有必须的清理工作都已经被相应的子系统(例如,防火墙)完成了才会最终调用kmem_cache_free进行释放。

一个高速缓存能分配的实例数通常由kmem_cache_alloc相应的封装函数来限制,而有时这个数量又可以通过调整/proc中的参数来改变。

想要更详细的了解内存高速缓存是如何实现的,以及他们怎样与高速slab分配器衔接,请参阅《深入理解linux内核》(O'Reilly)。

高速缓存和hash表
使用高速缓存来提高执行效率是非常普遍的。在网络部分代码,有L3-L2的查询表缓存(比如IPV4中使用的ARP高速缓存),路由表高速缓存等。

高速缓存查找例程经常使用一个输入参数来指示,当高速缓存中没有所要查找的元素时,是创建该元素并添加到高速缓存还是什么都不做。其他的一些查找例程总是简单的添加不存在的元素。

高速缓存经常以hash表的形式来实现。内核提供了一组数据类型,如单向和双向链表,来构建简单的hash表。处理hash到同一个元素的标准方法是将他们放进一个链表。历遍一个链表比使用hash关键字的查找要费时的多,所以减少hash到同一元素的输入数是非常重要的。

当hash表的查询时间在所属子系统中是一个严格的参数时,应该实现一种机制增加hash表的长度,这样冲突链表的平均长度将会减小而平均查询时间将得到改善。参阅第三十四章中“per-mask hash表动态变化尺寸”一节。

你可能也会发现一些子系统,如邻层,增加一个随即的组件(规则的变化)到键中,来分散高速缓存中的元素。这个有助于减少“拒绝服务”(DoS)攻击(其目标在于将一个hash表中的元素集中到一个键中)的危害。参阅第二十七章“高速缓存”一节。

引用计数
当一段代码试图访问一个已经被释放了的数据结构时,内核将非常的“不舒服”,而用户对于内核所的反应也不可能会“舒服”。为了避免这些危险的问题,同时也是为了使垃圾收集机制更加简单和高效(见本章后面“垃圾收集”一节),大多数数据结构维护了一个引用计数器。好的内核成员每一次保存与释放数据结构时
都会分别增加和减少该计数器。对于每一种需要引用计数的数据结构,使用该数据结构内核模块通常会输出两个函数用来增加和减少引用计数。这样的函数通常分别被命名为xxx_hold和xxx_release。有的时候,释放函数会用xxx_put来代替。(例如对于net_device数据结构的dev_put函数)。

如有错误,请及时纠正,待续...


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/3198/showart_181078.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP