LINUX内核网络协议栈
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int priority; };
系统有两个内核输出函数供增加/删除处理函数:
int nf_register_hook(struct nf_hook_ops *reg); void nf_unregister_hook(struct nf_hook_ops *reg);
注册的NF hooks列表
struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];
struct net_device *dev; NULL 意味所有设备
int (*func) (...); 处理函数地址
void *data; 私有数据
struct list_head list;
};
系统有两个内核输出函数供增加/删除协议处理函数: void dev_add_pack(struct packet_type *pt) void dev_remove_pack(struct packet_type *pt)
ip_local_deliver_finish: 根据传输层协议查找该
协议入口函数
ip_local_deliver:本地包, 并进行碎片重组
ip_route_input_slow :在路由表中查找路由
ip_route_input:在缓存中查找路由
ip_rcv_finish:接收处理完成之前的一些操作
register_netdevice
注册发送函数指针 hard_start_xmit
设置中断号及中断处理 函数ei_interrupt() (接 收处理)
网络层通过函数 dev_queue_xmit() 调 用注册函数 hard_start_xmit发送
接收包
调用netif_rx
将接收数据组 成以太帧
软中断处理机制
接收包列表 目标MAC 源MAC 协议类型
AAAA BBBB ETP_P_IP CCCC DDDD ETP_P_ARP
……
协议函数表
ETP_P_IP ip_rcv
ETP_P_ARP arp_rcv
……
……
网络层
应用程序往 socket发送包
发往传输层
发往网络层
内部包 发往传输层 发往socket 放到应用程
ip_rcv:进行IP包的校验
网络层对传输层协议的管理
struct inet_protocol {
unsigned char protocol; UDP、TCP、ICMP、IGMP等 int (*hander) (...); 处理函数地址 };
系统有两个内核输出函数供增加/删除处理函数:
void inet_add_protocol(struct inet_protocol *prot); int inet_del_protocol(struct inet_protocol *prot);
网卡
LINUX应用层 LINUX内核
包发送接收总体示意图
应用程序往 socket发送包
发往传输层
发往网络层
内部包 发往传输层 发往socket 放到应用程
序buffer
包到达网卡
否 本机 包? 是
发往网络层
丢包
转发 包?
否
外部包
查找路由
丢包
包发往网卡
包发往网络
网卡驱动
初始化
发送包
struct device
struct packet_type ipproto; myproto.type = htons(ETH_P_IP); myproto.func = ip_rcv; myproto.dev = NULL; myproto.data = NULL; dev_add_pack (&ipproto)
以太协议处理机制
目标IP AAAA CCCC EEEE
源IP BBBB DDDD FFFF
……
协议类型 UDP TCP ICMP
协议函数表
UDP
udp_rcv
TCP
tcp_v4_rcv
ICMP
icmp_rcv
……
……
网络层发送函数栈
ip_build_xmit:填充IP头
尚未路由
ip_build_xmit_slow: 查找发送路由
增加新的NF hook
大纲
总体架构 网卡驱动(数据链路层) 数据链路层与网络层接口 网络层(IP) 一个重要的技术:NETFILTER 传输层(TCP/UDP) 传输层与应用层的接口 总结
总体框架
网络socket应用程序
BSD Socket
INET Socket
TCP
UDP
网络层(IP协议)
网卡驱动与网络层接口
网卡驱动
调用中断处 理函数
产生中断
系统检测到 数据
网卡驱动与网络层接口
发送:dev_queue_xmit 包校验 流控 调用网卡驱动发送函数
接收:netif_rx 放入接收包队列 触发软中断,导致软中断函数运行
增加IP协议处理
struct packet_type
{
unsigned short
type; htons(ether_type:IP、ARP)
序buffer
包到达网卡
否 本机 包? 是
发往网络层
丢包
转发 包?
否 外部包
查找路由
包发往网卡
包发往网络
丢包
缓存 中?是
返回 入口
百度文库
否 数据库 查找
放到缓 存中
网络层接收函数栈
ip_finish_output:发送到网卡
ip_forward_finish:转发之前一 些操作,主要是IP选项、碎片
ip_forward:转发包,并处理TTL
已路由
碎片检查
dev_queue_xmit:发送到网卡
NetFilter :NF HOOKS
关键结构: nf_hook_ops
struct nf_hook_ops {
struct list_head list;
nf_hookfn *hook; handler address int pf; family (AF_INET, AF_INET6, AF_IPX, ...) int hooknum; (NF_IP_*, NF_IP6_*, NF_IPX_*, ...)
AF_UNSPEC (0)
AF_UNIX
(1)
AF_INET
(2)
AF_AX25
(3)
AF_IPX (4)
AF_APPLETALK(5)
NF_IP_PRE_ROUTING (0) NF_IP_LOCAL_IN (1) NF_IP_FORWARD (2) NF_IP_LOCAL_OUT (3) NF_IP_POST_ROUTING(4)
系统有两个内核输出函数供增加/删除处理函数:
int nf_register_hook(struct nf_hook_ops *reg); void nf_unregister_hook(struct nf_hook_ops *reg);
注册的NF hooks列表
struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];
struct net_device *dev; NULL 意味所有设备
int (*func) (...); 处理函数地址
void *data; 私有数据
struct list_head list;
};
系统有两个内核输出函数供增加/删除协议处理函数: void dev_add_pack(struct packet_type *pt) void dev_remove_pack(struct packet_type *pt)
ip_local_deliver_finish: 根据传输层协议查找该
协议入口函数
ip_local_deliver:本地包, 并进行碎片重组
ip_route_input_slow :在路由表中查找路由
ip_route_input:在缓存中查找路由
ip_rcv_finish:接收处理完成之前的一些操作
register_netdevice
注册发送函数指针 hard_start_xmit
设置中断号及中断处理 函数ei_interrupt() (接 收处理)
网络层通过函数 dev_queue_xmit() 调 用注册函数 hard_start_xmit发送
接收包
调用netif_rx
将接收数据组 成以太帧
软中断处理机制
接收包列表 目标MAC 源MAC 协议类型
AAAA BBBB ETP_P_IP CCCC DDDD ETP_P_ARP
……
协议函数表
ETP_P_IP ip_rcv
ETP_P_ARP arp_rcv
……
……
网络层
应用程序往 socket发送包
发往传输层
发往网络层
内部包 发往传输层 发往socket 放到应用程
ip_rcv:进行IP包的校验
网络层对传输层协议的管理
struct inet_protocol {
unsigned char protocol; UDP、TCP、ICMP、IGMP等 int (*hander) (...); 处理函数地址 };
系统有两个内核输出函数供增加/删除处理函数:
void inet_add_protocol(struct inet_protocol *prot); int inet_del_protocol(struct inet_protocol *prot);
网卡
LINUX应用层 LINUX内核
包发送接收总体示意图
应用程序往 socket发送包
发往传输层
发往网络层
内部包 发往传输层 发往socket 放到应用程
序buffer
包到达网卡
否 本机 包? 是
发往网络层
丢包
转发 包?
否
外部包
查找路由
丢包
包发往网卡
包发往网络
网卡驱动
初始化
发送包
struct device
struct packet_type ipproto; myproto.type = htons(ETH_P_IP); myproto.func = ip_rcv; myproto.dev = NULL; myproto.data = NULL; dev_add_pack (&ipproto)
以太协议处理机制
目标IP AAAA CCCC EEEE
源IP BBBB DDDD FFFF
……
协议类型 UDP TCP ICMP
协议函数表
UDP
udp_rcv
TCP
tcp_v4_rcv
ICMP
icmp_rcv
……
……
网络层发送函数栈
ip_build_xmit:填充IP头
尚未路由
ip_build_xmit_slow: 查找发送路由
增加新的NF hook
大纲
总体架构 网卡驱动(数据链路层) 数据链路层与网络层接口 网络层(IP) 一个重要的技术:NETFILTER 传输层(TCP/UDP) 传输层与应用层的接口 总结
总体框架
网络socket应用程序
BSD Socket
INET Socket
TCP
UDP
网络层(IP协议)
网卡驱动与网络层接口
网卡驱动
调用中断处 理函数
产生中断
系统检测到 数据
网卡驱动与网络层接口
发送:dev_queue_xmit 包校验 流控 调用网卡驱动发送函数
接收:netif_rx 放入接收包队列 触发软中断,导致软中断函数运行
增加IP协议处理
struct packet_type
{
unsigned short
type; htons(ether_type:IP、ARP)
序buffer
包到达网卡
否 本机 包? 是
发往网络层
丢包
转发 包?
否 外部包
查找路由
包发往网卡
包发往网络
丢包
缓存 中?是
返回 入口
百度文库
否 数据库 查找
放到缓 存中
网络层接收函数栈
ip_finish_output:发送到网卡
ip_forward_finish:转发之前一 些操作,主要是IP选项、碎片
ip_forward:转发包,并处理TTL
已路由
碎片检查
dev_queue_xmit:发送到网卡
NetFilter :NF HOOKS
关键结构: nf_hook_ops
struct nf_hook_ops {
struct list_head list;
nf_hookfn *hook; handler address int pf; family (AF_INET, AF_INET6, AF_IPX, ...) int hooknum; (NF_IP_*, NF_IP6_*, NF_IPX_*, ...)
AF_UNSPEC (0)
AF_UNIX
(1)
AF_INET
(2)
AF_AX25
(3)
AF_IPX (4)
AF_APPLETALK(5)
NF_IP_PRE_ROUTING (0) NF_IP_LOCAL_IN (1) NF_IP_FORWARD (2) NF_IP_LOCAL_OUT (3) NF_IP_POST_ROUTING(4)