linux与freebsd中tcp协议栈实现之比较,Linux与FreeBSD中TCP协议栈实现之比较

作为两个最有名的开源操作系统,Linux和FreeBSD是网管们的首选。Linux以开放性和众多的驱动支持著称,而FreeBSD有着优良的UNIX传统,是公认的最稳定的操作系统。那么,在这两个操作系统间,该如何选择呢?幸好,我们有源码,可以从协议栈的实现中寻找答案。

TCP/IP协议栈是网络中广泛使用的事实网络通信标准。最初的TCP实现源自4.4BSDlite,在Linux兴起后,也不可避免得支持它。但Linux的实现自成体系,仅与传统实现保持接口上的兼容,下面我们将针对源码级的实现,来分析一下两者的异同。但是,对于Linux和FreeBSD这样优秀的系统来说,已经无所谓何优何劣,有的仅仅是实现策略与侧重点上的不同而已。

从进程的角度上讲,可以调用send,sendto,sendmsg来发送一段数据,来可以使用文件系统中的write和writev来发送数据。同理,接收数据可以使用相应的recv,recvmsg,recvfrom,也可以使用文件系统提供的read,readv来接收一段数据。对于接收来说,这是异步进行的,也就是说,这是中断驱动的,在以后的分析中,我们要注意这点。为简单起见,同时不失一般性,我们将分析TCP协议的输入输出全过程,并以已对LINUX及FreeBSD的实现作一对比。

首先我们来看FreeBSD上的协议实现,这也是最正统的实现。下面是完整的输入输出路径。

47016.htm498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' style="width: 366px; height: 265px" border="0" alt="" width="456" height="329" src="http://images.51cto.com/files/uploadimg/20111108/1647280.jpg" />

首先来看左边的输出,不管应用程序调用哪个输出函数,最终都要调用sosend来完成输出。Sosend将从用户空间把数据复制进内核管理的m_buf数据结构,m_buf是FreeBSD的TCP实现使用的数据缓冲结构。在sosend完成数据复制后,将调用TCP的输出函数,tcp_output要做的事情是分配一个新的m_buf来保存tcp头,并计算相应的数据校验码,在下一步的ip_output中,同样也要进行数据校验工作,并进行数据路由选择。最终ether_output将通过if_start来调用具体的硬件驱动程序来完成数据发送。在某个网卡的驱动中,ex_start将负责将数据从内核的m_buf缓冲复制进硬件自己的缓冲区,以完成数据发送工作。在这整个过程中,数据被复制两次,并且也被遍历两次(计算校验码),这也是主要的影响效率的地方。

再来讨论右边的输入,当网卡收到数据时,中断处理程序ex_intr将被调用。驱动通过ex_rx_intr将数据从硬件缓冲复制进m_buf数据结构中,并调用ether_input来进一步处理。ether_input通过ether_demux进行分用。如果是一个Ip包,将通过软中断调用ip_fastforward进行数据校验,并判断是否要转发,如果失败,将进行ip_input进行完整的处理。在in_input中,同样要判断是否要进行转发,如果不用,调用tcp_input进行进一步处理。在tcp_input中,进行数据校验和验证后,有一个叫做首部预测算法的优化,可以加快数据处理速度。进行完所有的操作后,如果是用户数据,将唤醒用户进程进行处理。同理,用户可以使用多个函数进行数据接收,而soreceive将负责将数据从m_buf转移至用户进程缓冲。

可以看出,在FreeBSD中,发送和接收数据,所进行的操作差不多,都要进行两次数据复制和两次数据遍历,这也是最大的影响效率的地方。两次数据复制似乎无可避免,下面我们来看看Linux是怎么做的。

47016.htm498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' style="width: 382px; height: 335px" border="0" alt="" width="463" height="416" src="http://images.51cto.com/files/uploadimg/20111108/1647281.jpg" />

可以看到,在LINUX上的实现稍显复杂。让我们首先从发送开始分析。在LINUX上,socket被实现为一

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值