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周期。

相关推荐
Cloud_Air7543 分钟前
从零开始使用SSH链接目标主机(包括Github添加SSH验证,主机连接远程机SSH验证)
运维·ssh
李詹8 分钟前
Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?
服务器·游戏·ddos
你熬夜了吗?11 分钟前
spring中使用netty-socketio部署到服务器(SSL、nginx转发)
服务器·websocket·spring·netty·ssl
joke_xiaoli38 分钟前
tomcat Server 连接服务器 进展
java·服务器·tomcat
Hello.Reader43 分钟前
基于 Nginx 的 WebSocket 反向代理实践
运维·websocket·nginx
北冥有鱼被烹1 小时前
【微知】/proc中如何查看Linux内核是否允许加载内核模块?(/proc/sys/kernel/modules_disabled)
linux·服务器
qq_273900231 小时前
CentOS系统防火墙服务介绍
linux·运维·centos
小余吃大鱼2 小时前
CentOS中在线安装Docker(超详细)
linux·docker·centos
程序员JerrySUN2 小时前
驱动开发硬核特训 · Day 19:字符设备驱动实战(控制 LED)
linux·驱动开发
小灰灰__2 小时前
Linux安装ffmpeg7.1操作说明
linux·运维·服务器