您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 浅析Linux内核网络子系统_陈轶飞
rstevens2008athotmail.com浅析Linux网络子系统陈轶飞rstevens2008athotmail.comLinux网络子系统•作用:使Linux成为一个可扩展的网络操作系统–支持多协议族:INET,INET6,UNIX...–支持多种类型的网络设备:以太网卡、无线网卡...•领略顶级大师作品,成为C高手的绝佳参考–开闭原则•对扩展开放:可增加新的协议族、协议、网络设备•对修改封闭:而无需改动框架的代码–面向接口编程•无处不在的函数指针–依赖倒置原则•依赖于抽象的接口,而不是具体的实现。•net_protocol_family,net_device–高性能–模块化,高可维护性;框架化,高可扩展性•各种网络技术汇聚与此,成为网络高手的绝佳参考–IPv4,IPv6,IPSec,策略路由,QoS,网桥,...rstevens2008athotmail.com从应用层编程开始•简单的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));–recvfrom(sock,...);rstevens2008athotmail.com网络子系统架构INETNetfilterQoSWiFiGPRSINET6UNIX...rstevens2008athotmail.com系统调用层sys_socketcall()sys_socketsys_sendmsg()sys_recvmsg()socket()sendmsg()recvmsg()rstevens2008athotmail.com套接口层•作用:–为上层应用提供协议无关的通用网络编程接口•遵循BSDsocket规范,如connect,recvmsg,sendmsg•–为下层各种协议提供族接口和机制,使具体协议族可以注册到系统中•核心数据结构–structnet_protocol_family•inet_family_ops–structsocket–structsock–structinet_protosw–structproto_ops–structprotorstevens2008athotmail.comsocket创建•每个协议族都要实现自己的创建socket的函数–inet_create()–inet6_create()–unix_create()•inet_create()•socket创建完毕后,数据结构之间的关系建立起来,后续的数据发送和接收通道打开。rstevens2008athotmail.comsocket()流程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,protocolstructinet_protoswsk-sk_prot-init()rstevens2008athotmail.comsocket创建后...structtask_struct...files...structfiles_struct...fd_array[0]fd_array[1]...structfile...private_dataf_op...structsocket...opsfilesock...structsock...sk_socketsk_protstructproto_opsconnectacceptsendmsgrecvmsg...structprotoconnctacceptsendmsgrecvmsg用户空间只看到socketfd内核空间创建了复杂的数据结构,并建立起它们之间的关系rstevens2008athotmail.com套接口层主要流程图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()rstevens2008athotmail.comINET协议族:传输层•作用:–实现传输层协议•TCP•UDP•RAWrstevens2008athotmail.com传输层:UDP输出流程inet_sendmsg()sk-sk_prot-sendmsg()udp_sendmsg()udp_push_pending_frames()raw_sendmsg()tcp_sendmsg()notcork?Routingsystemip_route_output_flow()rstevens2008athotmail.com传输层: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()sk-sk_sleepskb_copy_datagram_iovec()copySKBtouserspacrstevens2008athotmail.comINET协议族:网络层•作用:L3层协议处理–提供与传输层的接口–路由–分片–邻居发现–netfilter•核心数据结构:–structnet_protocol•handler()rstevens2008athotmail.com网络层:IP输出流程Netfilter(NF_IP_LOCAL_OUT)Netfilter(NF_IP_POST_ROUTING)dst_output()ip_push_pending_frames()ip_queue_xmit()skb-dst-output()ip_fragment()ip_mc_output()ip_output()ip_finish_output()ip_finish_output2ip_append_data()sk-sk_write_queueNeighbouringsystemneigh-arp_queuerstevens2008athotmail.com网络层:IP输入流程ip_rcv()ip_rcv_finish()dst_input()skb-dst-input()ip_forward()ip_local_deliver()ip_local_deliver_finish()Netfilter(NF_IP_PRE_ROUTING)Netfilter(NF_IP_LOCAL_IN)Netfilter(NF_IP_FORWARD)ip_forward_finish()ipprot-handler()Routingsystemip_route_input()rstevens2008athotmail.com路由子系统•作用:–输入选路:确定数据包是本地处理还是转发–输出选路:确定输出接口和下一跳地址•两层架构:–路由缓存:提高路由性能–路由表(FIB):缓存不命中,则查找路由表•策略路由•核心数据结构–structrtable:协议相关的缓存信息(IPv4源地址、目的地址)–structdst_entrystructdst_entrystructdst_entrystructdst_entry:协议无关的缓存信息,嵌套在rtable中•input()数据包的输出处理函数•output()数据包的输入处理函数–structflowi:cachelookupkeysrstevens2008athotmail.com路由子系统接口:输出选路•根据路由表,找到下一跳的的地址及对应的输出设备。•找到前进的方向:ip_output•设置dst_entry-neigh,关联邻居子系统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()rrrrtttthhhh----uuuu....ddddsssstttt....iiiinnnnppppuuuutttt====iiiipppp____llllooooccccaaaallll____ddddeeeelllliiiivvvveeeerrrr;;;;rrrrtttthhhh----uuuu....ddddsssstttt....oooouuuuttttppppuuuutttt====iiiipppp____oooouuuuttttppppuuuutttt;;;;__mkroute_output()NOrstevens2008athotmail.com路由子系统接口:输入选路•根据源地址、目的地址、tos、输入接口从缓存查找rtable,设置skb-dst•找到前进方向:–ip_local_deliver–ip_forwardfib_lookup()ip_route_input()ip_route_input_slow()ip_mkroute_input()rth=dst_alloc()rrrrtttthhhh----uuuu....ddddsssstttt....iiiinnnnppppuuuutttt====iiiipppp____llllooooccccaaaallll____ddddeeeelllliiiivvvveeeerrrr;;;;rrrrtttthhhh----uuuu....ddddsssstttt....iiiinnnnppppuuuutttt====iiiipppp____ffffoooorrrr====iiiipppp____oooouuuuttttppppuuuutttt;;;;it_intern_hash()arp_bind_neighbour()__neigh_lookup_errno()neigh_lookup()lookupfromroutecachfound?found?__mkroute_input()neigh_create()found?NONONOrstevens2008athotmail.com邻居子系统•作用:–从邻居获取下一跳的L2层地址•两层架构:–协议无关层:–协议相关层:支持多种邻居协议•IPv4:ARP•IPv6:n
本文标题:浅析Linux内核网络子系统_陈轶飞
链接地址:https://www.777doc.com/doc-5588612 .html