快速业务通道

Linux与FreeBSD中TCP协议栈实现之比较

作者 佚名技术 来源 网络技术 浏览 发布时间 2012-05-24
个文件系统,这样可以通过vfs的write来调用,也可以直接使用send来调用,它们最终都是调用sock_sendmsg。Sock_sendmsg通过它的内核版本__sock_sendmsg直接调用tcp_sendmsg来发送数据。在tcp_sendmsg中,同时完成数据复杂和数据校验,这样节省了一次遍历操作,这也是和FreeBSD不同的地方。Linux使用skb结构来管理数据缓冲,这和FreeBSD的m_buf大同小异。当复制完数据后,使用tcp_push来进行下一步发送。Tcp_push通过__tcp_push_pending_frames来调用tcp_write_xmit将数据填入tcp的发送缓冲区。这里的填充仅是指针引用而已。下一步,tcp_transmit_skb将数据放入IP的发送队列。Ip_queue_xmit函数完成IP包头的设置以及数据效验,并调用ip_output进入下一步发送。如果不用分片,将使用ip_finish_output继续发送。在这里,填充数据的以太网包头后调用dev_queue_xmit函数来进一步处理。Dev_queue_xmit函数将数据转移至网络核心层的待发送队列,调用具体的驱动程序cp_start_xmit来完成数据的最终发送。最后的cp_start_xmit做的事情和freebsd的相应函数差不多,检查数据,并复制进硬件缓冲。

当接收到一个数据包的时候,网卡会产生中断,这样网卡驱动的cp_interrupt会被调用。cp_interrupt做的事情很少,只进行必要的检查后就返回了,更多的事情通过cp_rx_poll来完成,cp_rx_poll在软中断中被调用,这样做是为了提高驱动的处理效率。Cp_rx_poll做的事情主要就是把申请并将数据复制进一个skb缓冲中。netif_rx函数将数据从这个队列中转移至网络核心层队列中,netif_receive_skb从这里接收数据,调用ip_rcv来处理。Ip_rc和ip_rcv_finish一起检查数据,得到包的路由,并调用相应的input函数来完成路由,在这里就是ip_local_deliver,ip_local_deliver完成IP包的重组后,使用ip_local_deliver_finish来进入tcp的处理流程,tcp_v4_rcv完成数据校验以及一些简单的检查,主要的工作在tcp_v4_do_rcv中完成。tcp_v4_do_rcv先判断是否正常的用户数据,如果是则用tcp_rcv_established处理,否则用tcp_rcv_state_process来更新连接的状态机。tcp_rcv_established中同样有首部预测。如果一切顺便,将唤醒等待在tcp_recvmsg中的用户进程。后者将数据从skb缓冲中复制进用户进程缓冲。并进行逐级返回。

通过以上分析不难看出,Linux的代码比较混乱,可读性没有FreeBSD的好,比如说,Linux省略了以太网层,而且在接收数据中有多次异步操作,也许这将会影响内核的稳定性,FreeBSD的代码就比较清晰,程序处理一目了然,可读性也高,最稳定的操作系统名不虚传。这也可以从两个操作系统的起源得到解释。Linux起源于互联网时代,由众多爱好者一起完成,并没有一个完整的规划,代码也多次经过变动,而作者水平也参次不齐,造成现在的样子。而FreeBSD系出名门,一直由一个独立的小组进行维护,多年来更新不大,只有少许优化,所以代码的可读性非常高。但从另一方面讲,不断更新的Linux在代码方面比较激进,比如Linux使用skb缓冲效率要较FreeBSD使用的m_buf为高,这里限于篇幅,就不再具体分析了。而且linux发送数据时,在复制数据的同时完成的tcp的效验,这样就节省了一次数据的遍历操作。也提高了效率。

通过以上比较我们不难得出结论,如果效率为先,则Linux当为首推,如果稳定至上,FreeBSD应该为不二之选。不过,这两个操作系统都是非常优秀并久经考验,之间的差别也仅存于字面分析上。无论选择哪个,都不会让您后悔,不是吗?

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号