Linux网络代码导读v0.2

2001年08月19日 17:38:00
                          Linux网络代码导读v0.2发布日期:作者:yawl > yawl@nsfocus.com < 主页:http://www.nsfocus.com     1 前言许多人在分析linux代码时对网络部分(主要是src/linux/net,src/linux/include/net及src/linux/include/linux目录下的文件)比较感兴趣,确实,尽管已经从书本上学到了大量的TCP/IP原理,不读源码的话,头脑中还是建立不起具体的印象。而分析这部分代码的一个问题便是代码众多而资料很少。这篇文章的目的就是勾勒出一个框架,让读者能够大致能够了解TCP/IP究竟是怎么工作的。以前见到的许多代码分析都是基于2.0内核的,在新的内核中许多函数变了名字,这尤其给初学者带来了困难,本文是以2.4.0-test9的代码作例子,这样对照代码时可能更清晰些。其实网络部分的代码我只对防火墙部分一行行仔细分析过,其他许多地方也只是一知半解,如果理解有误,欢迎指正。建议在看本文的同时,用source insight(www.soucedyn.com)建立一个项目,同时看代码,这样可能效果更好点。我也用过其他的一些工具,但在分析大量的代码的时候,没有一个工具比它更方便的了。2 正文ISO的七层模型都非常熟悉了,当然,对于internet,用四层模型更为适合。在这两份模型里,网络协议以层次的形式出现。而LINUX的内核代码中,严格分出清楚的层次却比较困难,因为除了一些"内核线程(kernel thread外)",整个内核其实是个单一的进程。因此所谓"网络层",只是一组相关的函数,而各层之间大多通过一般的函数调用的方式完成交互。而从逻辑上,网络部分的代码更应该这样分层更为合理:.BSD socket层:这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。    这一部分的文件主要有:/net/socket.c /net/protocols.c etc.INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。    文件主要有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc.TCP/UDP层:处理传输层的操作,传输层用struct inet_protocol和struct proto两个结构表示。    文件主要有:/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c        /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c         /net/ipv4/tcp_timer.c etc       .IP层:处理网络层的操作,网络层用struct packet_type结构表示。     文件主要有:/net/ipv4/ip_forward.c ip_fragment.c ip_input.c ip_output.c etc..数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中,    驱动程序都在/driver/net目录下。        网络部分还有很多其他文件,如防火墙,路由等,一般根据看到名字便能猜测出相应的处理,此处不再赘述。        现在我要给出一张表,全文的内容就是为了说明这张表(如果你觉得我在文章中的语言比较乏味,尽可抛掉他们,结合这张表自己看代码)。在我最初看网络部分代码时,比较喜欢《linux kernel internals》的第八章的一段,其中有一个进程A通过网络远程向另一进程B发包的例子,详细介绍了一个数据包如何从网络堆栈中走过的过程。我觉得这样可以更迅速的帮助读者看清森林的全貌,因此本文参照这种结构来叙述。^|       sys_read                fs/read_write.c|       sock_read               net/socket.c|       sock_recvmsg            net/socket.c|       inet_recvmsg            net/ipv4/af_inet.c|       udp_recvmsg             net/ipv4/udp.c|       skb_recv_datagram       net/core/datagram.c|       -------------------------------------------|       sock_queue_rcv_skb      include/net/sock.h|       udp_queue_rcv_skb       net/ipv4/udp.c|       udp_rcv                 net/ipv4/udp.c|       ip_local_deliver_finish net/ipv4/ip_input.c|       ip_local_deliver        net/ipv4/ip_input.c|       ip_recv                 net/ipv4/ip_input.c|       net_rx_action           net/dev.c|       -------------------------------------------|       netif_rx                net/dev.c|       el3_rx                  driver/net/3c309.c|       el3_interrupt           driver/net/3c309.c==========================|       sys_write               fs/read_write.c|       sock_writev             net/socket.c                    |       sock_sendmsg            net/socket.c|       inet_sendmsg            net/ipv4/af_inet.c|       udp_sendmsg             net/ipv4/udp.c|       ip_build_xmit           net/ipv4/ip_output.c|       output_maybe_reroute    net/ipv4/ip_output.c|       ip_output               net/ipv4/ip_output.c|       ip_finish_output        net/ipv4/ip_output.c|       dev_queue_xmit          net/dev.c|       --------------------------------------------|       el3_start_xmit          driver/net/3c309.cV我们假设的环境如下:有两台主机通过互联网联在一起,其中一台机子运行这一个进程A,另外一台运行进程B,进程A将向进程B发出一条信息,比如"Hello",而B接受此信息。TCP处理本身非常复杂,为了便于叙述,在后面我们将用UDP作为例子。2.1 建立套接字在数据发送之前,要建立一个套接字(socket),在两边的程序中都会调用如下语句:...int sockfd;sockfd=socket(AF_INET,SOCK_DGRAM,0);...这是个系统调用,因此会通过0x80中断进入系统内核,调用内核中的相应函数.当寻找系统调用在内核中的对应流程时,一般前面加入"sys_"再找就是了,如对fork来说,就是调用sys_fork。但是socket相关调用有些特殊,所有的这类调用都是通过一个入口,即sys_socketcall进入系统内核,然后再通过参数调用具体的sys_socket,socket_bind等函数。sys_socket会调用sock_create产生一个struct socket结构(见include/linux/net.h),每个套接字在内核中都有一个这样的结构对应,在初始化了此结构的一些通用成员后(如分配inode,根据第二个参数为type项赋值等),会根据其一个参数作响应的调度,即这一句:...net_families[family]-
  
  
   
   Linux Kernel Internals< 2nd Edition[3.] Network Buffers And Memory Management  Alan Coxhttp://www2.linuxjournal.com/lj-issues/issue30/1312.html[4.] 浙大源码分析报告《Linux网络设备分析》潘纲 [5.] Linux IP Networking--A Guide to the Implementation and Modification of theLinuxPoptocol Stack        Glenn Herrin May 31,2000 http://www.movement.uklinux.net/linux-net.pdf                版权所有,未经许可,不得转载             欢迎访问我们的站点http://www.nsfocus.com/                  中联绿盟给您安全的保障
  
  


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3500


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值