linux内核网络分析 用户空间工具 “每日读书”

有多种不同的工具可以用于配置linux众多可用的网络功能,如本章开头所述,你可以通过使用这些工具对内核巧妙的处理,以便于学习以及发现做这样的修改后的影响。

下面是在本书中将会经常涉及的工具:

iputils

除了经常使用的ping命令外,iputils还包括arping(用于产生ARP请求),网络路由器发现

守护函数rdisc以及其他程序

net-tools

这是一组网络工具,其中有著名的ifconfig, route, netstats以及arp,还有ipmaddr, iptunnel, ether-wake和netplugd等。

IPROUTE2

这是新一代的网络配置套件,同一个多用途的命令ip,这个套件可以配置IP地址以及路由,

还有其他各种高级功能,如邻居协议等等。

IPROUTE2的源代码可以从http://linux-net.osdl.org/index.php/iproute2下载,而其他组件可以从大多数linux发行版本的下载服务器上下载。

大多数linux发行版中都默认包含这些组件,当你不了解内核代码如何处理来自用户空间的命令时,看看用户空间工具的源代码,以了解用户所下达的命令是如何打包并传给内核的。

在下列URL中,可以发现很好的文档,说明如何使用上述工具,包括邮件列表mailing list

如果想追踪网络代码的最新修改,可以关注下列邮件列表

linux网络开发论坛档案库

第二章 关键数据结构

linux网络代码中有些关键数据结构随处可见,本章介绍下列数据结构,同时说明操作这些数据结构的一些函数和宏。

struct sk_buff

一个封包就存储在这里,所有的网络分层都会使用这个结构来存储报头,有关用户数据的信息,以及用来协调其工作的其他内部信息。

struct net_device

在linux内核中每种网络设备都用这个数据结构表示,包括软硬件的配置信息,第八章详细描述了net_device数据结构分配的时机以及分配的方式。

linux网络所用的另一个关键数据结构是struct sock,用于存储套接字的网络信息,因为本书不涉及套接字,故本章没有吧sock包含在内。

套接字缓冲区:sk_buff结构。

这可能是linux网络代码中最重要的数据结构,代表已经接受或者政要传输的数据的包头,此结构定义在include/linux/skbuff.h 头文件中,巨大的变量堆组成,

在内核的进化历程中,这个结构多次变动,不断增加新选项,同时也重组了现存的字段,使得布局更为清晰,其字段可粗略划分为下列几种类型。

布局layout

通用General

功能专用 Feature-specific

管理函数

多个不同的网络分层MAC 或者L2分层上的另一种链路层协议,L3的IP以及L4的TCP或者UDP都会使用这个结构, 而且当该结构从一个分层传到另一个分层时,其不同的字段会随之发生变化,L4在传给L3之前会附加一个报头.而L3再传给L2之前又会加上一个自己的包头,附加包头比起把数据从一个分层拷贝到另一个分层更为高效,由于要在一个缓冲区开端新增空间--也就是要改变指向该缓冲区的变量,--是一种复杂的运算,内核提供了skb_reserve函数,来执行这一操作,所以,当缓冲区往下传经每个分层时,每层的协议首先要做的就是调用skb_reserve 函数,为该协议的包头预留空间,后续,数据预留和对齐,

skb_reserve,skb_put,skb_push以及skb_pull 中国呢,我们会看到的一个实例,说明缓冲区穿越每个分层时,内核如何确保缓冲区头部有足够的空间预留下来,允许每个分层都能加

上自己的包头。

当缓冲区网上经传每个网络分层时,每个源自于旧分层的包头就不再有用处,例如,L2包头只由处理L2协议的设备驱动程序使用,所以对L3而言并无用处,不过,并没有把L2的包头从缓冲区中删除,而是把志向有效载荷开端的指针向前移动到L3包头的开端。这样只需要很少的CPU周期。

相关推荐
Tisfy13 小时前
服务器 - 从一台服务器切换至另一台服务器(损失数十条访客记录)
运维·服务器
Ronin30513 小时前
【Linux系统】日志与策略模式
linux·策略模式·日志
qq_2642208913 小时前
Nginx优化与 SSL/TLS配置
运维·nginx
猎板PCB黄浩14 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造
ZzzK,14 小时前
JAVA虚拟机(JVM)
java·linux·jvm
Aspiresky15 小时前
浅析Linux进程信号处理机制:基本原理及应用
linux·运维·信号处理
全栈工程师修炼指南15 小时前
告别手动构建!Jenkins 与 Gitlab 完美协作,根据参数自动化触发CI/CD流水线实践
运维·ci/cd·自动化·gitlab·jenkins
ajassi200015 小时前
linux C 语言开发 (八) 进程基础
linux·运维·服务器
..过云雨16 小时前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
matlab的学徒16 小时前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat