浅析linux内核网络子系统_陈轶飞

上传人:kms****20 文档编号:45780286 上传时间:2018-06-19 格式:PDF 页数:36 大小:253.65KB
返回 下载 相关 举报
浅析linux内核网络子系统_陈轶飞_第1页
第1页 / 共36页
浅析linux内核网络子系统_陈轶飞_第2页
第2页 / 共36页
浅析linux内核网络子系统_陈轶飞_第3页
第3页 / 共36页
浅析linux内核网络子系统_陈轶飞_第4页
第4页 / 共36页
浅析linux内核网络子系统_陈轶飞_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《浅析linux内核网络子系统_陈轶飞》由会员分享,可在线阅读,更多相关《浅析linux内核网络子系统_陈轶飞(36页珍藏版)》请在金锄头文库上搜索。

1、rstevens2008 at 浅析Linux网络子系统陈轶飞rstevens2008 at Linux网络子系统 作用:使Linux成为一个可扩展的网络操作系统 支持多协议族:INET, INET6, UNIX. 支持多种类型的网络设备: 以太网卡、无线网卡. 领略顶级大师作品,成为C高手的绝佳参考 开闭原则 对扩展开放: 可增加新的协议族、协议、网络设备 对修改封闭: 而无需改动框架的代码 面向接口编程 无处不在的函数指针 依赖倒置原则 依赖于抽象的接口,而不是具体的实现。 net_protocol_family, net_device高性能 模块化,高可维护性;框架化,高可扩展性 各种网

2、络技术汇聚与此,成为网络高手的绝佳参考 IPv4, IPv6, IPSec, 策略路由, QoS, 网桥, .rstevens2008 at 从应用层编程开始 简单的UDP发送程序 sock = socket(AF_INET, SOCK_DGRM, 0); sendto(sock, .) 简单的UDP接收程序 sock = socket(AF_INET, SOCK_DGRM, 0); bind(sock, .); recvfrom(sock, ); 简单的抓包程序,模拟 tcpdump sock = socket(AF_PACKET, RAW, htons(ETH_P_IP); recvfro

3、m(sock, .);rstevens2008 at 网络子系统架构INET NetfilterQoS WiFi GPRS INET6UNIX.rstevens2008 at 系统调用层sys_socketcall()sys_socketsys_sendmsg()sys_recvmsg()socket()sendmsg()recvmsg()rstevens2008 at 套接口层 作用: 为上层应用提供协议无关协议无关的通用网络编程接口 遵循BSD socket规范,如connect, recvmsg, sendmsg http:/en.wikipedia.org/wiki/BSD_socke

4、t 为下层各种协议提供族接口和机制,使具体协议族可 以注册到系统中 核心数据结构 struct net_protocol_family inet_family_ops struct socket struct sock struct inet_protosw struct proto_ops struct protorstevens2008 at socket创建 每个协议族都要实现自己的创建socket的函 数 inet_create() inet6_create() unix_create() inet_create() socket创建完毕后,数据结构之间的关系建 立起来,后续的数据发送

5、和接收通道打开。rstevens2008 at socket()流程sys_socket() sock_create()_sock_socket()pf-create()sock_map_fd()sock_alloc()sk-sk_prot-hash()sk_alloc()inet_create()sock_alloc_fd()sock_attach_fd()fd_install()get_unused_fd()get_empty_filp()type, protocolstruct inet_protoswsk-sk_prot-init()rstevens2008 at socket创建后.

6、struct task_struct. files .struct files_struct. fd_array0 fd_array1 .struct file. private_data f_op .struct socket. ops file sock .struct sock. sk_socket sk_protstruct proto_opsconnect accept sendmsg recvmsg .struct protoconnct accept sendmsg recvmsg用户空间只看到 socket fd 内核空间创建了复杂的数据结 构,并建立起它们之间的关系rstev

7、ens2008 at 套接口层主要流程图sock_create()sock_sendmsg()sock_recvmsg()sock_common_recvmsg()_sock_recvmsg()sock-ops-recvmsg()sk-sk_prot-recvmsg()_sock_sendmsg()sock-ops-sendmsg()_sock_create()pf-create()rstevens2008 at INET协议族:传输层 作用: 实现传输层协议 TCP UDP RAWrstevens2008 at 传输层:UDP输出流程inet_sendmsg()sk-sk_prot-send

8、msg()udp_sendmsg()udp_push_pending_frames()raw_sendmsg()tcp_sendmsg()not cork?Routing systemip_route_output_flow()rstevens2008 at 传输层:UDP输入流程udp_rcv()_udp4_lib_rcv()udp_queue_rcv_skb()sock_queue_rcv_skb)sk-sk_receive_queueskb_recv_datagram()udp_recvmsg()tcp_recvmsg()raw_recvmsg()icmp_rcv()tcp_v4_rcv

9、()sk-sk_sleepskb_copy_datagram_iovec()copy SKB to userspacrstevens2008 at INET协议族:网络层 作用:L3层协议处理 提供与传输层的接口 路由 分片 邻居发现 netfilter 核心数据结构: struct net_protocol handler()rstevens2008 at 网络层:IP输出流程Netfilter(NF_IP_LOCAL_OUT)Netfilter(NF_IP_POST_ROUTING)dst_output()ip_push_pending_frames()ip_queue_xmit()skb

10、-dst-output()ip_fragment()ip_mc_output()ip_output()ip_finish_output()ip_finish_output2ip_append_data()sk-sk_write_queueNeighbouringsystemneigh-arp_queuerstevens2008 at 网络层:IP输入流程ip_rcv()ip_rcv_finish()dst_input()skb-dst-input()ip_forward()ip_local_deliver()ip_local_deliver_finish()Netfilter(NF_IP_PR

11、E_ROU TING)Netfilter(NF_IP_LOCA L_IN)Netfilter(NF_IP_FORWA RD)ip_forward_finish()ipprot-handler()Routing systemip_route_input()rstevens2008 at 路由子系统 作用: 输入选路: 确定数据包是本地处理还是转发 输出选路: 确定输出接口和下一跳地址 两层架构: 路由缓存: 提高路由性能 路由表(FIB): 缓存不命中,则查找路由表 策略路由 http:/www.tldp.org/HOWTO/Adv-Routing- HOWTO/index.html 核心数据结

12、构 struct rtable: 协议相关的缓存信息( IPv4源地址、目的地址) struct dst_entrystruct dst_entrystruct dst_entrystruct dst_entry: 协议无关的缓存信息,嵌套在 rtable中 input() 数据包的输出处理函数 output() 数据包的输入处理函数 struct flowi: cache lookup keysrstevens2008 at 路由子系统接口: 输出选路 根据路由表, 找到下一跳的 的地址及对应 的输出设备。 找到前进的方 向: ip_output 设置 dst_entry- neigh, 关

13、联 邻居子系统ip_route_output_flow()_ip_route_output_key()ip_route_output_slow()it_intern_hash()arp_bind_neighbour()_neigh_lookup_errno()neigh_lookup()neigh_create()found?found?NOip_mkroute_output()fib_lookup()found?NOrth = dst_alloc() r r r rt t t th h h h- - - - u u u u. . . .d d d ds s s st t t t. . . .

14、i i i in n n np p p pu u u ut t t t = = = = i i i ip p p p_ _ _ _l l l lo o o oc c c ca a a al l l l_ _ _ _d d d de e e el l l li i i iv v v ve e e er r r r; ; ; ; r r r rt t t th h h h- - - - u u u u. . . .d d d ds s s st t t t. . . .o o o ou u u ut t t tp p p pu u u ut t t t = = = = i i i ip p p p

15、_ _ _ _o o o ou u u ut t t tp p p pu u u ut t t t; ; ; ;_mkroute_output()NOrstevens2008 at 路由子系统接口: 输入选路 根据源地址、 目的地址、tos、 输入接口从缓 存查找 rtable,设置 skb-dst 找到前进方 向: ip_local_del iver ip_forwardfib_lookup()ip_route_input()ip_route_input_slow()ip_mkroute_input()rth = dst_alloc() r r r rt t t th h h h- - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号