logo资料库

Linux内核网络栈源代码情景分析.pdf

第1页 / 共823页
第2页 / 共823页
第3页 / 共823页
第4页 / 共823页
第5页 / 共823页
第6页 / 共823页
第7页 / 共823页
第8页 / 共823页
资料共823页,剩余部分请下载后查看
Linux内核网络栈源代码情景分析
第1部分 网络栈总体架构
第0章 网络栈总体架构分析
0.1 网络栈本质及其分层架构
0.2 系统调用接口到内核的请求传递
0.2.1 第一层入口:accept.S文件
0.2.2 第二层入口:socket.S文件
0.2.3 第三层入口:entry.S文件
第2部分 网络协议
第1章 网络协议头文件分析
1.1 etherdevice.h头文件
1.2 icmp.h头文件
1.3 if.h头文件
1.4 if_arp.h头文件
1.5 if_ether.h头文件
1.6 if_plip.h头文件
1.7 if_slip.h头文件
1.8 igmp.h头文件
1.9 in.h头文件
1.10 inet.h头文件
1.11 interrupt.h头文件
1.12 ip.h头文件
1.13 ip_fw.h头文件
1.14 ipx.h头文件
1.15 net.h头文件
1.16 netdevice.h头文件
1.17 notifier.h头文件
1.18 ppp.h头文件
1.19 route.h头文件
1.20 skbuff.h头文件
1.21 socket.h头文件
1.22 sockios.h头文件
1.23 tcp.h头文件
1.24 timer.h头文件
1.25 udp.h头文件
1.26 un.h头文件
1.27 本章小结
第3部分 网络栈实现分析
第2章 BSD socket层实现分析
2.1 protocols.c文件
2.2 socket.c文件
2.2.1 头文件声明、全局变量定义、相关函数声明
2.2.2 move_addr_to_kernel和move_addr_to_user函数
2.2.3 get_fd函数
2.2.4 socki_lookup和sockfd_lookup函数
2.2.5 sock_alloc函数
2.2.6 sock_release_peer、sock_release和sock_close函数
2.2.7 网络套接字普通文件接口函数
2.2.8 sock_awaitconn函数
2.2.9 sock_socket函数
2.2.10 sock_socketpair函数
2.2.11 sock_bind函数
2.2.12 sock_listen函数
2.2.13 sock_accept函数
2.2.14 sock_connect函数
2.2.15 sock_getsockname和sock_getpeername函数
2.2.16 sock_send和sock_sendto函数
2.2.17 sock_recv和sock_recvfrom函数
2.2.18 sock_setsockopt和sock_getsockopt函数
2.2.19 sock_shutdown函数
2.2.20 sock_fcntl函数
2.2.21 sys_socketcall函数
2.2.22 sock_register和sock_unregister函数
2.2.23 proto_init函数
2.2.24 sock_init函数
2.2.25 socket_get_info函数
2.2.26 socket.c文件小结
第3章 INET socket层实现分析
3.1 af_inet.c文件
3.1.1 头文件声明、相关宏及变量定义
3.1.2 sk_inuse函数
3.1.3 get_new_socknum函数
3.1.4 put_sock和remove_sock函数
3.1.5 destroy_sock函数
3.1.6 inet_fcntl函数
3.1.7 inet_setsockopt和inet_getsockopt函数
3.1.8 inet_autobind函数
3.1.9 inet_listen函数
3.1.10 def_callback1、def_callback2和def_callback3函数
3.1.11 inet_create和inet_dup函数
3.1.12 closing和inet_release函数
3.1.13 inet_bind函数
3.1.14 inet_error函数
3.1.15 inet_connect函数
3.1.16 inet_socketpair函数
3.1.17 inet_accept函数
3.1.18 inet_getname函数
3.1.19 inet_recvfrom、inet_recv和inet_read函数
3.1.20 inet_send、inet_write和inet_sendto函数
3.1.21 inet_shutdown函数
3.1.22 inet_select和inet_ioctl函数
3.1.23 get_sock和get_sock_raw函数
3.1.24 INET层操作函数集定义
3.1.25 inet_proto_init函数
3.1.26 af_inet.c文件小结
第4章 传输层实现分析
4.1 tcp.c文件
4.1.1 头文件声明、相关变量及宏定义
4.1.2 tcp_set_state函数
4.1.3 tcp_select_window函数
4.1.4 tcp_find_established、tcp_dequeue_established和tcp_accept函数
4.1.5 tcp_close_pending函数
4.1.6 tcp_time_wait函数
4.1.7 TCP协议超时重传处理函数集
4.1.8 tcp_err函数
4.1.9 tcp_readable函数
4.1.10 tcp_listen_select函数
4.1.11 tcp_select函数
4.1.12 tcp_ioctl函数
4.1.13 tcp_check和tcp_send_check函数
4.1.14 tcp_send_skb函数
4.1.15 tcp_dequeue_partial、tcp_send_partial和tcp_enqueue_partial函数
4.1.16 tcp_send_ack函数
4.1.17 tcp_build_header函数
4.1.18 tcp_write函数
4.1.19 tcp_sendto函数
4.1.20 tcp_read_wakeup和tcp_write_wakeup函数
4.1.21 cleanup_rbuf函数
4.1.22 tcp_read_urg函数
4.1.23 tcp_read函数
4.1.24 tcp_close_state函数
4.1.25 tcp_send_fin函数
4.1.26 tcp_shutdown函数
4.1.27 tcp_recvfrom函数
4.1.28 tcp_reset函数
4.1.29 tcp_options函数
4.1.30 default_mask和tcp_init_seq函数
4.1.31 tcp_conn_request函数
4.1.32 tcp_close函数
4.1.33 tcp_write_xmit函数
4.1.34 tcp_ack函数
4.1.35 tcp_fin函数
4.1.36 tcp_data函数
4.1.37 tcp_check_urg和tcp_urg函数
4.1.38 tcp_accept函数
4.1.39 tcp_connect函数
4.1.40 tcp_sequence函数
4.1.41 tcp_std_reset函数
4.1.42 tcp_send_probe0函数
4.1.43 tcp_setsockopt和tcp_getsockopt函数
4.1.44 tcp_rcv函数
4.1.45 TCP协议操作函数集定义
4.1.46 tcp.c文件小结
4.2 tcp.h头文件
4.3 udp.c文件
4.3.1 头文件声明、变量及宏定义和函数声明
4.3.2 udp_err函数
4.3.3 udp_check和udp_send_check函数
4.3.4 udp_send、udp_sendto和udp_write函数
4.3.5 udp_ioctl函数
4.3.6 udp_recvfrom和udp_read函数
4.3.7 udp_connect函数
4.3.8 udp_close函数
4.3.9 udp_rcv函数
4.3.10 udp_deliver函数
4.3.11 UDP协议操作函数集定义
4.4 udp.h头文件
4.5 sock.h头文件
4.6 sock.c文件
4.6.1 头文件声明、相关宏定义
4.6.2 sock_setsockopt和sock_getsockopt函数
4.6.3 sock_wmalloc和sock_rmalloc函数
4.6.4 sock_rspace和sock_wspace函数
4.6.5 sock_wfree和sock_rfree函数
4.6.6 sock_alloc_send_skb函数
4.6.7 sock_queue_rcv_skb函数
4.6.8 release_sock函数
4.7 datagram.c文件
4.7.1 skb_recv_datagram函数
4.7.2 skb_free_datagram函数
4.7.3 skb_copy_datagram函数
4.7.4 datagram_select函数
4.8 icmp.c文件
4.8.1 头文件声明、变量定义
4.8.2 icmp_send函数
4.8.3 icmp_unreach函数
4.8.4 icmp_redirect函数
4.8.5 icmp_echo函数
4.8.6 icmp_timestamp函数
4.8.7 icmp_info函数
4.8.8 icmp_address函数
4.8.9 icmp_rcv函数
4.8.10 icmp_ioctl函数
4.8.11 icmp.c文件小结
4.9 icmp.h头文件
4.10 igmp.c文件*
4.10.1 igmp_stop_timer、igmp_start_timer、igmp_timer_exp ire、igmp_init_timer和random函数
4.10.2 igmp_send_report函数
4.10.3 igmp_heard_report和igmp_heard_query函数
4.10.4 ip_mc_map函数
4.10.5 ip_mc_filter_add和ip_mc_filter_del函数
4.10.6 igmp_group_dropped和igmp_group_added函数
4.10.7 igmp_rcv函数
4.10.8 ip_mc_inc_group和ip_mc_dec_group函数
4.10.9 ip_mc_join_group和ip_mc_leave_group函数
4.10.10 ip_mc_drop_device函数
4.10.11 ip_mc_allhost函数
4.10.12 ip_mc_drop_socket函数
4.10.13 igmp.c文件小结
4.11 snmp.h头文件
4.12 protocol.h头文件
4.13 protocol.c文件
4.14 proc.c文件
第5章 网络层实现分析
5.1 route.h头文件
5.2 route.c文件
5.2.1 头文件声明、系统变量定义
5.2.2 rt_del函数
5.2.3 ip_rt_flush函数
5.2.4 default_mask和guess_mask函数
5.2.5 get_gw_dev函数
5.2.6 ip_rt_add函数
5.2.7 bad_mask函数
5.2.8 rt_new函数
5.2.9 rt_kill函数
5.2.10 rt_get_info函数
5.2.11 ip_rt_route和ip_rt_local函数
5.2.12 ip_get_old_rtent函数
5.2.13 ip_rt_ioctl函数
5.2.14 route.c文件小结
5.3 ip.h头文件
5.4 ip.c文件
5.4.1 头文件声明、变量定义
5.4.2 ip_ioctl函数
5.4.3 strict_route、loose_route和ip_route_check函数
5.4.4 build_options函数
5.4.5 ip_send和ip_build_header函数
5.4.6 do_options函数
5.4.7 ip_compute_csum和ip_send_check函数
5.4.8 ip_frag_create函数
5.4.9 ip_find函数
5.4.10 ip_free函数
5.4.11 ip_expire函数
5.4.12 ip_create函数
5.4.13 ip_done函数
5.4.14 ip_glue函数
5.4.15 ip_defrag函数
5.4.16 ip_fragment函数
5.4.17 ip_forward函数
5.4.18 ip_rcv函数
5.4.19 ip_loopback函数
5.4.20 ip_queue_xmit函数
5.4.21 ip_mc_procinfo函数
5.4.22 ip_setsockopt和ip_getsockopt函数
5.4.23 ip_rt_event函数
5.4.24 ip_init函数
5.4.25 ip.c文件小结
5.5 ip_fw.c文件
5.5.1 头文件声明、宏及系统变量定义
5.5.2 port_match函数
5.5.3 ip_fw_chk函数
5.5.4 zero_fw_chain函数
5.5.5 free_fw_chain函数
5.5.6 add_to_chain和del_from_chain函数
5.5.7 check_ipfw_struct函数
5.5.8 ip_acct_cnt函数
5.5.9 ip_acct_ctl,ip_fw_ctl函数
5.5.10 ip_chain_procinfo函数
5.5.11 ip_acct_procinfo、ip_fw_blk_procinfo和ip_fw_fwd_pro cinfo函数
5.5.12 ip_fw.c文件小结
5.6 raw.c文件
5.6.1 raw_err函数
5.6.2 raw_rcv函数
5.6.3 raw_sendto和raw_write函数
5.6.4 raw_close函数
5.6.5 raw_init函数
5.6.6 raw_recvfrom和raw_read函数
5.6.7 RAW协议操作函数集定义
5.6.8 raw.c文件小结
5.7 raw.h头文件
5.8 packet.c文件
5.8.1 packet_rcv函数
5.8.2 packet_sendto和packet_write函数
5.8.3 packet_close函数
5.8.4 packet_init函数
5.8.5 packet_recvfrom和packet_read函数
5.8.6 PACKET协议操作函数集定义
5.8.7 packet.c文件小结
第6章 链路层实现分析
6.1 dev_mcast.c文件
6.1.1 dev_mc_add函数
6.1.2 dev_mc_upload函数
6.1.3 dev_mc_delete函数
6.1.4 dev_mc_discard函数
6.2 p8022.h头文件
6.3 p8022call.h头文件
6.4 datalink.h头文件
6.5 p8022.c文件
6.5.1 find_8022_client函数
6.5.2 p8022_rcv函数
6.5.3 p8022_datalink_header函数
6.5.4 802.2协议模块注册
6.5.5 register_8022_client函数
6.5.6 p8022.c文件小结
6.6 psnap.h头文件
6.7 psnapcall.h头文件
6.8 psnap.c文件
6.8.1 find_snap_client函数
6.8.2 snap_rcv函数
6.8.3 snap_datalink_header函数
6.8.4 snap_proto_init函数
6.8.5 register_snap_client函数
6.9 eth.c文件
6.9.1 eth_setup函数
6.9.2 eth_header和eth_rebuild_header函数
6.9.3 eth_type_trans函数
6.9.4 eth.c文件小结
6.10 eth.h头文件
6.11 p8023.c文件
6.11.1 p8023_datalink_header函数
6.11.2 make_8023_client函数
6.12 arp.c文件
6.12.1 ARP缓存表项表示结构及系统变(常)量定义
6.12.2 arp_check_expire函数
6.12.3 arp_release_entry函数
6.12.4 arp_device_event函数
6.12.5 arp_send函数
6.12.6 arp_expire_request函数
6.12.7 arp_send_q函数
6.12.8 arp_destroy函数
6.12.9 arp_rcv函数
6.12.10 arp_find函数
6.12.11 arp_get_info函数
6.12.12 arp_lookup函数
6.12.13 arp_req_set和arp_req_get函数
6.12.14 arp_ioctl函数
6.12.15 ARP协议注册、初始化
6.12.16 arp.c文件小结
6.13 arp.h头文件
6.14 devinit.c文件
6.14.1 Ip_get_mask函数
6.14.2 ip_chk_addr函数
6.14.3 ip_my_addr函数
6.14.4 ip_dev_check函数
6.14.5 devinit.c文件小结
6.15 dev.c文件
6.15.1 头文件声明、系统变量定义
6.15.2 dev_add_pack和dev_remove_pack函数
6.15.3 dev_get、dev_open和dev_close函数
6.15.4 register_netdevice_notifier和unregister_netdevice_notifier函数
6.15.5 dev_queue_xmit函数
6.15.6 netif_rx和dev_rint函数
6.15.7 dev_transmit和dev_tint函数
6.15.8 in_net_bh和net_bh函数
6.15.9 dev_ifconf函数
6.15.10 sprintf_stats和dev_get_info函数
6.15.11 bad_mask函数
6.15.12 dev_ifsioc函数
6.15.13 dev_ioctl函数
6.15.14 dev_init函数
6.15.15 dev.c文件小结
网络栈实现小结
第4部分 网络设备驱动程序
第7章 网络设备驱动程序分析
7.1 关键变量、函数定义及网络设备驱动初始化
7.2 网络设备驱动程序结构
7.3 本章小结
第5部分 系统网络栈初始化
第8章 系统网络栈初始化
8.1 网络栈初始化流程
8.2 数据包传送通道解析
8.3 本章小结
附录A TCP协议可靠性数据传输实现原理分析
主要参考文献
Linux内核网络栈源代码情景分析 曹桂平 编 著 人民邮电出版社 北京
内 容 提 要 本书主要对Linux 1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux网络协议结构。 本书共分为5个部分。具体内容包括网络栈总体架构分析、网络协议头文件分析、BSD socket层实现分析、INET socket层实现分析、网络层实现分析、链路层实现分析、网络设备驱动程序分析、系统网络栈初始化等内容。 本书适合Linux网络开发人员及Linux内核爱好者阅读。 Linux内核网络栈源代码情景分析  编 著 曹桂平 责任编辑 黄 焱  人民邮电出版社出版发行 北京市崇文区夕照寺街14号 邮编 100061 电子函件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 三河市海波印务有限公司印刷  开本:7871092 1/16 印张:51.75 字数:1 236千字 2010年1月第1版 印数:1 – 3 500册 2010年1月河北第1次印刷 ISBN 978-7-115-21626-7 定价:89.00元 读者服务热线:(010)67132692 印装质量热线:(010)67129223 反盗版热线:(010)67171154
序 序 早在2001年年初我创办《永远的UNIX》(fanqiang.com)网站时,就梦想有一天能将众多技术高手的工作经验集结成册,使广大网友在实际应用中能随手翻查。那时候国内爱好者的学习热情很高,为了给网友提供一个更易于互动交流的平台,我在2001年年底创建了www.chinaunix.net社区网站(简称CU)。 经过8年的发展,在广大CUer的支持下,CU社区的注册用户已经超过百万,ChinaUnix已经成为全球最大、人气最旺的以交流Linux、UNIX和开源技术为主的中文社区。CU网站聚集了大量富有工作经验的系统架构师、软件工程师、DBA和网络架构工程师等,她已经成为广大开源技术爱好者学习、工作和生活中不可缺少的伙伴。 随着网站一点点壮大,网友也不断成长起来。大量的版主利用业余时间义务解答网友问题、维护论坛版块秩序、服务广大网友。很多网友将自己的学习、工作经验发帖分享出来,更有网友花费大量时间将自己多年的经验整理成书,供更多的人学习、分享。他们的成长是国内技术社区成长的基础,也必将推动国内技术社区的进一步发展。 今天,在CU管理员瑞儿mm(周平)、人民邮电出版社的李大微经理、黄焱编辑和广大CU作者们的共同努力下,这套“ChinaUnix技术图书大系”终于和大家见面了,非常感谢人民邮电出版社的鼎立支持!人民邮电出版社是工业和信息化部主管的大型专业出版社,他们出版了一系列优秀的Linux/UNIX图书,在读者中有着巨大的影响力。希望“ChinaUnix技术图书大系”的出版能够为Linux、UNIX和开源技术在中国的普及、推广做出应有的贡献。 借此序,再次感谢一直以来关心和支持过ChinaUnix的网友、版主以及所有朋友们! ChinaUnix网站创始人 樊强(CU网名:fanqiang) 2009年7月
前言1 前 言 对于很多初学者而言,研习老代码似乎会让人看不起,他们会觉得最“酷”的事莫过于捧着最新版本的内核源代码去“啃”。而且,很多人会对学习老代码的作用非常怀疑,毕竟这些代码已成为历史,现在运行的系统代码较之那些之前的老代码已经是“面目全非”,基本上已经找不到老代码的影子了,因此很多人会对学习这些老代码的必要性产生怀疑。 然而,分析内核的早期代码可以让我们更好地把握问题的实质。因为早期代码更注重实际功能的实现,而辅助功能的代码很少或者基本没有。例如早期代码并没有专门的函数集去处理sk_buff结构的操作问题,只在需要分配或操作该结构时直接编码操作;而现在这些“直接的编码”被分离出来,成为专门的操作函数集。从内核的演变来看,这是必要的,但同时也会使代码变得越来越复杂。 对于一个初学者来说,在对内核代码组织不熟悉的情况下,经常会找不到一个被调用函数的位置在什么地方,而只能通过使用查找工具来回翻看。这样的话不一会儿便会产生疲劳,甚至会对系统内核的庞大复杂感到恐惧,从而削减了学习的积极性。因此,分析早期的核心代码一方面可以帮读者更直接地抓住问题的实质,另一方面也可以帮助他们将注意力集中于对问题本质的理解上。 因此,本文选择了Linux 1.2.13内核所包含的网络部分代码进行分析(注意网络部分代码与内核代码的演变是分离的,如Linux1.2.8网络代码与1.2.13是一样的,而两者之间的内核显然是有差异的)。Linux 1.2.13网络部分所有实现代码仍然是集中在一个文件夹中(net文件夹),在此之后(1.3.0内核版本)的网络部分代码在net文件夹下进行了细分。除此之外,对于某些协议(如TCP/IP)的实现也从之前的一个单一文件变成了几个独立文件以加强层次和功能关系。为了消除结构上不必要的复杂性并保持功能实现上的完整性,本书选择Linux 1.2.13内核版本网络代码进行分析是比较适宜的。 各种版本Linux源码(包括本书分析所用的Linux 1.2.13内核版本)可到如下网站:http://www.kernel.org/进行下载。 本书阅读方式 本书篇幅较大,对此,作者推荐如下的阅读方式:首先将本书除去协议实现分析的部分(即除去本书第3部分内容)读完,然后读者可以按照本书的文件组织方式进行文件源码的分析,对于不懂的地方再查阅本书对应文件分析。最关键的一点是,读者需要自始至终保持自己独立思考的能力,不要被书本的内容拖着走。总之,要理解网络栈的实现,必须要形成自己的思考能力,而本书的内容最终只会是一个引导者。 最后一点有必要提及的是,由于本书分析的是一个早期的内核版本,所以它提供的只是一个起点。如果你能够很好地理解本书分析的1.2.13版本,那么以后所有版本的内容对你来说都将不成问题。学习早期版本的目的正在于此:通过一个早期版本降低学习和理解的难度,在掌握本质之后,挑战最新版本也就不再困难。
Linux内核网络栈源代码情景分析2 如果你没有时间研究最新版本的网络栈实现源代码(毕竟它太庞大了),那么阅读本书绝对能够使你获益匪浅。 本书内容 对于Linux1.2.13网络栈代码的实现,本文采用了两种分析方式:第一种是按部就班地逐文件逐函数地进行分析,此种分析方式较少涉及各种协议之间的关联性;第二种是从结构上和层次上进行分析,着重阐述数据包接收和发送通道,分析数据包在传输路线上的各个处理函数,此时将不针对某个函数作具体分析,只是简单交待功能之后,继续关注数据上下的传输过程。在第一种分析方法的基础上辅以第二种分析方法,可以使读者更好地理解和掌握这部分的知识。 本书共分为5个部分。 第1部分,从网络栈总体架构上进行分析,讨论网络栈分层标准模型以及与本版本网络栈实现的具体对应关系。 第2部分,着重介绍网络协议所涉及的各个头文件,即对include/linux子目录下的相关文件进行分析。 第3部分,分析网络协议的具体实现代码,包括BSD socket层实现分析、INET socket层实现分析、传输层实现分析、网络层实现分析、链路层实现分析等内容。本部分代码都集中于net子目录下,其内容也是本书的重点。 第4部分,介绍网络设备驱动层的相关内容,包括网络设备的初始化过程以及驱动程序的结构,这部分代码在drivers子目录下。 第5部分,介绍系统网络栈的初始化流程,并详细介绍了网络数据包的上下传送通道,从而再次从整体实现上进行把握。 另外,本书的附录A中还对TCP协议的可靠性数据传输实现原理进行了分析。 本书约定 本书共包括5个部分,其中第2、3部分是本书的重点。第2部分主要介绍网络协议的各个头文件,第3部分主要是分析网络协议的实现源代码,在这里,为了方便分析,且便于读者阅读,我们以每个文件为单位,对源代码进行了编号。 致谢 我首先要感谢我的家人。每当我在生活中碰到困境的时候,总是能够感受到你们的支持,是你们,帮助我勇敢地面对人生道路上一个又一个困难。同时,在此书漫长的编写过程中,你们也始终是鞭策我不断前进的动力。 我还要感谢人民邮电出版社的编辑。他们在本书的出版过程中提出了诸多宝贵的修改意见,并帮助改正了书中的各种错误之处,最终使得本书能够与广大读者见面,在此我深表感谢。 另外我还要感谢ChinaUnix论坛上诸多网友对本书的认可和支持,特别是scutan网友的推荐,使得本书有这个机会能够以纸质的方式与读者们见面,在此我一并表示感谢。
前言3 鉴于作者能力有限,书中难免会有错漏之处,还请广大读者指正。大家可以通过以下邮件地址与我进行联系:ingdxdy@gmail.com。 曹桂平 2009.10
目录1 目 录 第1部分 网络栈总体架构 第0章 网络栈总体架构分析 ..................... 2 0.1 网络栈本质及其分层架构 ............ 3 0.2 系统调用接口到内核的请求 传递 ................................................ 6 0.2.1 第一层入口:accept.S 文件 ...................................10 0.2.2 第二层入口:socket.S 文件 ...................................10 0.2.3 第三层入口:entry.S 文件 ...................................15 第2部分 网 络 协 议 第1章 网络协议头文件分析 ................... 18 1.1 etherdevice.h头文件 .................... 20 1.2 icmp.h头文件 .............................. 21 1.3 if.h头文件 .................................... 28 1.4 if_arp.h头文件 ............................. 31 1.5 if_ether.h头文件 .......................... 34 1.6 if_plip.h头文件 ........................... 36 1.7 if_slip.h头文件 ............................ 37 1.8 igmp.h头文件 .............................. 38 1.9 in.h头文件 ................................... 41 1.10 inet.h头文件 .............................. 45 1.11 interrupt.h头文件 ....................... 46 1.12 ip.h头文件 ................................. 49 1.13 ip_fw.h头文件 ........................... 57 1.14 ipx.h头文件 ...............................62 1.15 net.h头文件 ................................67 1.16 netdevice.h头文件 .....................73 1.17 notifier.h头文件 .........................85 1.18 ppp.h头文件...............................89 1.19 route.h头文件 .......................... 112 1.20 skbuff.h头文件 ........................ 115 1.21 socket.h头文件 ........................ 122 1.22 sockios.h头文件 ....................... 125 1.23 tcp.h头文件 .............................. 127 1.24 timer.h头文件 .......................... 136 1.25 udp.h头文件............................. 138 1.26 un.h头文件............................... 140 1.27 本章小结 .................................. 140 第3部分 网络栈实现分析 第2章 BSD socket层实现分析 .............. 144 2.1 protocols.c文件 ......................... 145 2.2 socket.c文件 .............................. 146 2.2.1 头文件声明、全局变量 定义、相关函数声明 ..... 148 2.2.2 move_addr_to_kernel和 move_addr_to_user函数 ... 150 2.2.3 get_fd函数 ...................... 150 2.2.4 socki_lookup和 sockfd_lookup函数 ......... 151 2.2.5 sock_alloc函数 ............... 153
Linux内核网络栈源代码情景分析2 2.2.6 sock_release_peer、 sock_release和sock_close 函数 ................................. 153 2.2.7 网络套接字普通文件接口 函数 ................................. 158 2.2.8 sock_awaitconn函数 ....... 160 2.2.9 sock_socket函数 ............. 162 2.2.10 sock_socketpair函数 ..... 164 2.2.11 sock_bind函数 .............. 165 2.2.12 sock_listen函数............. 166 2.2.13 sock_accept函数 ........... 167 2.2.14 sock_connect函数 ......... 168 2.2.15 sock_getsockname和 sock_getpeername函数 .... 170 2.2.16 sock_send和sock_sendto 函数 ................................ 171 2.2.17 sock_recv和 sock_recvfrom函数 ....... 172 2.2.18 sock_setsockopt和 sock_getsockopt函数 .... 173 2.2.19 sock_shutdown函数 ...... 174 2.2.20 sock_fcntl函数 .............. 175 2.2.21 sys_socketcall函数 ....... 175 2.2.22 sock_register和 sock_unregister函数 ..... 178 2.2.23 proto_init函数 ............... 179 2.2.24 sock_init函数 ................ 179 2.2.25 socket_get_info函数 ..... 180 2.2.26 socket.c文件小结 .......... 181 第3章 INET socket层实现分析 .............. 182 3.1 af_inet.c文件 .............................. 183 3.1.1 头文件声明、相关宏及 变量定义 ......................... 189 3.1.2 sk_inuse函数 .................. 190 3.1.3 get_new_socknum函数 .... 192 3.1.4 put_sock和remove_sock 函数 ................................. 194 3.1.5 destroy_sock函数 ........... 196 3.1.6 inet_fcntl函数 ................. 198 3.1.7 inet_setsockopt和 inet_getsockopt函数 ....... 199 3.1.8 inet_autobind函数 .......... 200 3.1.9 inet_listen函数 ............... 201 3.1.10 def_callback1、 def_callback2和 def_callback3函数 ........ 202 3.1.11 inet_create和inet_dup 函数 ............................... 202 3.1.12 closing和inet_release 函数 ............................... 207 3.1.13 inet_bind函数 ............... 209 3.1.14 inet_error函数 .............. 212 3.1.15 inet_connect函数 ......... 212 3.1.16 inet_socketpair函数...... 216 3.1.17 inet_accept函数 ............ 217 3.1.18 inet_getname函数 ........ 219 3.1.19 inet_recvfrom、 inet_recv和inet_read 函数 ............................... 221 3.1.20 inet_send、inet_write和 inet_sendto函数 ............ 222 3.1.21 inet_shutdown函数 ...... 223 3.1.22 inet_select和 inet_ioctl函数 ............... 224 3.1.23 get_sock和 get_sock_raw函数 ........ 226 3.1.24 INET层操作函数集 定义 ............................... 230 3.1.25 inet_proto_init函数 ...... 231 3.1.26 af_inet.c文件小结 ........ 233 第4章 传输层实现分析 ......................... 234 4.1 tcp.c文件 ................................... 235 4.1.1 头文件声明、相关变量及 宏定义 ............................. 241 4.1.2 tcp_set_state函数 ........... 242 4.1.3 tcp_select_window函数.... 243 4.1.4 tcp_find_established、 tcp_dequeue_established和
分享到:
收藏