图书-深入理解Linux内核网络
2018-04-23 11:07:24 79 举报
AI智能生成
登录查看完整内容
《深入理解Linux内核网络》是一本关于Linux内核网络的专业书籍,它详细介绍了Linux内核网络的工作原理和实现细节。这本书涵盖了从基本概念到高级主题的全面内容,包括套接字编程、协议栈实现、网络设备驱动等。读者可以通过阅读这本书来深入了解Linux内核网络的各个方面,掌握如何编写高效的网络应用程序,以及如何优化网络性能。总之,《深入理解Linux内核网络》是一本值得一读的图书,它将为您带来宝贵的知识和技能。
作者其他创作
大纲/内容
4章通知链notify chain
全局介绍
代码相关实现
主动方是产生事件的notifyer_block->notify_call 回调函数是要执行的函数
接受方是链注册notifier_chain_register()
10章帧的接收
轮询收包模式NAPI
net_rx_action() -> 关联软中断NET_RX_SOFTIRQ
轮询的总体介绍
2 处理收到的包
net_rx_action()
2 对于不支持NAPI的设备从积压队列process_backlog中取下包
3 对包进行协议栈处理__netif_receive_skb(skb)
6章 PCI层和网络接口
涉及的数据结构
pci_device_id 指的是PCI设备生产商的设备标识
pci_driver PCI设备的驱动结构
char *name 驱动程序名称
PCI NIC设备驱动程序的注册
8章设备的注册和初始化
alloc_netdev() 分配net_device结构
net_device 结构的组织
dev_base 是所有net_device的全局链表
设备注册状态的通知
1通过register_netdevice_notifier 注册标识关注此通知
设备注册通过register_netdevice()
设备的引用计数
register_netdevice() 时refcnt =1dev_hold和dev_put分别增加和减少引用计数
上层网络功能
流量控制TC功能Traffic Control
宏观介绍
实现基本概念:过滤器(Filter)分类器(Classic)数据包队列(Queue)
使用流量控制器工具
通用步骤介绍:
给网卡分配一个队列
在该队列上建立分类
根据需要配置子队列和子分类
具体命令介绍:
为网卡创建队列
命令格式:tc qdisc [add | change | replace | link] dev DEV[parent qdisk-id |root] [handle qdisc-id] qdisc [qdisc specific parameters
具体命令举例: 为网卡eth0创建一个类型是htb的队列tc qdisc add dev eth0 root handle 1:htb default 11
为队列创建类别
命令格式:tc class [add | change | replace] dev DEV parent qdisc-id [classid class-id] qdisc [qdisc specific parameters]
具体命令举例:
为类别创建过滤器
命令格式:tc filter [add | change | replace] dev DEV [parent qdisc-id | root]
具体命令举例:tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:11
图书-深入理解Linux内核网络
2章关键数据结构
sk_buff 数据包管理结构
unsigned char *head;unsigned char *end;
指向的是内存分配的起始head和结束end
unsigned char *data:unsigned char *tail
指向的实际数据的有效起始位置(data)和结束位置(tail)
sturct net_device *dev
struct net_device *input_dev
TCP/IP分层结构union {...} h -> L4层union {...} nh -> L3层union {...} mac -> L2层
char cb[40] 保存私有信息存储空间
unsigned char cloned 表示结构是否被克隆过
管理函数
分配内存alloc_skb会分配2部分内存1 分配sk_buff结构内存2 分配数据包的内存
缓冲区sk_buff的克隆和拷贝-> P49
例外情况: skb_copy()和pskb_copy的用途和区别
1 pskb_copy() 只重新拷贝skb_buff和部分数据包数据不包含分片结构
把队列清空 skb_queue_purge()
遍历队列中的每一个元素 skb_queue_walk
net_device 网络设备结构
配置相关
char name[] 网卡设备名
unsigned long base_addr 设备自由内存映射到I/O内存起始地址
unsigned int rirq 设备的中断编号
unsigned char dev_addr[] 设备的链路层地址举例: Ethernet类型是6字节
int promiscuity 混杂模式
通用结构
函数指针
struct ethtool_ops *ethtool_ops用于设置和读取设备的配置
int (*do_ioctl) 用于向设备发出命令
5章 网络设备初始化
设备的注册初始化
NIC初始化的基本目标:驱动程序如何分配建立设备/内核通讯所需的资源
IRQ 中断
request_irq() 给1个中断设置回调处理函数
free_irq() 删除中断的回调处理函数
I/O端口和内存注册
设备处理层初始化 net_dev_init -> P104
dst_init() 路由结构的初始化
协议处理函数ptype_base的初始化
7部分路由
32章 Linux的实现
路由主要的数据结构
struct fib_node 1条路由表项存储的是route add添加的1条路由信息
struct fn_zone 表示相同长度子网掩码的1组路由举例: 24位的区(zone) 路由10.0.1.0/24和10.0.2.0/24
struct fib_table 表示1张路由表
struct fib_info 不同路由表项之间可以共享的参数存储在这里
struct fib_nh 表示下一跳举例: route add 10.81.0.0/24 nexthop via 10.80.2.1下一跳就是10.80.2.1
struct dst_entry 协议无关的路由表缓存
struct dst_ops 使用的徐函数表
struct rtable 表示1条路由表缓存项的数据结构
struct rtengry 处理用户态的请求route add当使用route add命令添加/删除路由表项请求时所使用的数据结构
35章路由查找
无论那个方向的路由都通过 fib_lookup() 查找路由
33章路由的缓存DST
路由缓存的用途是加速路由查找的速度缓存的核心结构是协议无关的目的地址缓存DST(Protocol Indepent Destination Cache)
外部系统与DST交互通过dst_ops回调函数完成
核心数据结构
struct rtable 包含2部分1 与协议相关的数据结构2 与协议无关的数据结构dst_entry
2 路由缓存中独立与协议的结构struct dst_entry { net_device *dev; 出口设备(将包报送到目的地的发送设备) int (*input) (struct sk_buff *) ; 表示处理入口包的函数 int (*output) (struct sk_buff *); 表示处理出口包的函数 struct dst_ops *ops; 处理dst_entry结构的VFT}
2 ip_route_output_key() 由本机生成的向外发出的包
36章重要数据结构
struct flowi union { struct flowi4 struct flowi6
18章IPv4(因特网)
P413 大蓝图IP内核协议战的关键函数
对本书的总结性的介绍
1 本书参照的linux内核代码是2.6.11
2 而我现在的分析是基于最新的linux内核4.15版本我现在添加的许多标志性函数和结构都是
0 条评论
回复 删除
下一页