li
  当前位置:主页 > 操作系统Redhat Linux > 文章内容
li
Linux网络代码导读v0.2
来源: www.ixdba.net  作者: IXDBA.NET技术社区    时间:2008-02-23   阅读:2  
本文章共7957字,分6页,当前第1页,快速翻页:
 
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
| -------------------------------------------


阅读更多内容1 · 2 · 3 · 4 · 5 · 6 · 下一页>>


  上一篇: Linux内核2.4.x的网络接口源码的...   下一篇: 红旗Linux 5.0/4.1桌面版的开关机...
li
 §相关评论  
 热点文章

·使用pam_abl防止SSH遭暴力破解
·redhat linux 5上telnet的开启
·linux命令行下如何更换使用的s
·xhost unable to open display
·文件系统出现不一直的原因和基
·linux系统下磁带机的简单操作命
·tar与磁带机操作命令
·linux系统建立终端和登录系统
·如何配置/etc/fstab或autofs让
·如何安装和升级一个RPM软件包?
·如何在新添加的磁盘上创建EXT3
li
 编辑推荐
·使用pam_abl防止SSH遭暴力破解
·redhat linux 5上telnet的开启
·linux命令行下如何更换使用的s
·xhost unable to open display
·文件系统出现不一直的原因和基
·linux系统下磁带机的简单操作命
·tar与磁带机操作命令
·linux系统建立终端和登录系统
·如何配置/etc/fstab或autofs让
·如何安装和升级一个RPM软件包?
·如何在新添加的磁盘上创建EXT3
li
 相关篇章
·Linux内核2.4.x的网络接口源码的...
·Linux应用程序移植到64位系统 (...
·Linux中的应用软件安装
·Linux终端机的中文显示:jmcce计...
·Linux Netfilter实现机制和扩展技...
·在Linux中安装和设置Nmap
·让Linux用起来跟Windows无异! (...
·让Linux用起来跟Windows无异!(1...
·用rsync从Linux到Windows远程备份...
·避其锋芒 Linux操作系统入侵实例
·红旗Linux 5.0/4.1桌面版的开关机...
·Linux内核2.4.x的网络接口源码的...
·经典文档:Linux网络服务器配置详...
·如何共享两台Linux操作系统的根目...
·Linux Apache Mysql PHP典型配置
·经典文档:Linux网络服务器配置详...
·安装红帽子Linux的几点注意
·Linux档案系统管理(第一篇)
·经典文档:Linux网络服务器配置详...
·Linux档案系统管理 (第二篇)
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接