Skip to main content

 路由器设置 > 新闻资讯 >

我们学的是Unix而不是网络编程

2014-03-18 00:28 浏览:
一直以来我一直以为操作系统内核是高大上的东西,但是实际上用户态的应用才是!

上周的一次技术交流中,一家网络加速卡厂商声称他们的协议栈是用户态的协议栈,用来提高性能,我对其产品直接就泄了气,然而会后,我查阅了相关的资料,找到一篇文章《 千万并发的秘密-内核是问题的根本》http://www.oschina.net/translate/the-secret-to-10-million-concurrent-connections-the-kernel,写出了我的心声,原来我一直都是这么认为的,只是一直都不敢承认罢了,为何不敢承认,那是因为我酷爱内核。我对那家厂商泄气表达了我深深的虚伪,内在的分裂!

文中说”我们学的是Unix而不是网络编程“,对《Unix网络编程》一书给出了正确的评价,告诉我们,我们被平台牵累了,我们一直在面对的都是操作系统的接口如何使用的技术,而不是真正的编程,真正的天马行空般超乎想象的编程。一个又一个的应用编程框架或者中间件在提出的时候,说的是”如何能让我们不必关注实现细节而精心处理我们自己的业务逻辑“,这篇文章能让人理解这句话的好意。

历史地看网络编程,是先有了UNIX,再有了TCP/IP和BSD socket,当然要把网络编程往UNIX里面硬塞,曾几何时,一直到现在,做网络编程的不懂UNIX会被人耻笑,当然,Linux某种意义上已经代替了UNIX。UNIX的哲学包括机制和策略分离这一真理,它在映射成这个信条之前是数据和控制的分离这个箴言,这个箴言如今已经淹没在网络设备中,比如路由器,其数据面和控制面是合在一起的,当该箴言再次唤醒其信徒的时候,SDN就出现了。是对UNIX理念的误解,导致了网络设备将控制面和数据面合在在一起而并非利益使然,这种误解甚至影响了UNIX本身。要知道UNIX理念影响了几乎所有的操作系统以及网络设备的设计,其中包括Mirosoft Windows以及Cisco的IOS。我之所以说是一种误解而并非背叛,是因为UNIX的理念可能从来就没有被真正理解过。也许,这是对宏内核的误解导致的对UNIX的误解。

UNIX的宏内核思想影响面甚大,然而它的本意并非将所有的操作都塞进内核,而是仅仅将机要操作塞进内核,保持内核的紧凑性与高效性,因为模块之间的交流是需要成本的,宏内核思想不讲解耦合(但在实现机制上,还是模块化的)。可是如何定义什么是机要操作,考虑以下的服务:
制定一套合理的经济政策;
制定一套合理的税收计划;
生产棉布;
制作一件面料考究的羊毛西服;
提供价值¥160的发型;
..
请问哪些是机要操作?对于普通民众而言,比如我,根本就没有西服,头发一年理一次,但是对于贵族而言,除了最后一条,其它的可能都是机要操作...很难定义机要操作,所以这种定义法很容易将所有的东西都塞进UNIX。《UNIX网络编程》讲述的是,你仅需要写一个很小的轻量级的服务器就可以让UNIX做一切繁复的工作。一件颇具说服力的事可以帮助《千万并发的秘密-内核是问题的根本》的作者表达一下深深的恶意,那就是Linux曾经在内核中实现了一个WEB服务器,多么巨大的一个玩笑,或者说是对宏内核多么巨大的一个讽刺...我们要记住的是,UNIX并没有让后来者把所有的东西塞进内核,只是说,内核要保留控制权。

我们不妨换一个思路,回到UNIX最初的思路,从控制权角度来看,哪些是属于控制面的,也许你能说出一大堆,进程调度,资源管理,文件系统...网络协议栈。不过,好像我们所有人一直以来都把网络视为例外,网络IO即不是块设备IO也不是字符设备IO,按照UNIX一切皆文件的观念,我们没法给网络一个合理的位置。socket接口的是一个完整的协议栈,而不是什么设备,我们不得不面对网络参数的调整,为此我们加了多少次班,这正是网络IO和其它设备IO相比所处的尴尬位置。

直接和网卡接口是不是更自由些,从此我们摆脱了协议栈的束缚,然而我们必须自己实现协议栈,前些日子我就想过这些,主要是为了解决手机上面操作网络无权限的问题,我当时想得是一个关于自由的问题而不是性能问题,而《秘密》一文说的正是性能问题,回顾那个厂商的介绍,他们的产品在用户态进行数据包的协议栈处理,最大限度的使用了网络协处理器等硬件加速功能,让人感叹,请问,使用操作系统内核的协议栈,如何把处理转到协处理器上?!回答使用Netfilter已经过时了!我一直都想玩玩用Netfilter将处理转到一块卡上,但是我发现我过时了,如今的回答是,直接把内核协议栈旁路掉!如今,真的有这样的技术,其中之一叫做PF_RING,实际上就是一个抓包机制,将数据包直接从链路层获取,然后你想怎么处理就怎么处理,刚刚试了一下,挺好用,和uIP结合,简直太猛了。当然,我可没有千万级并发的测试环境,我说的猛仅仅是它竟然真的可以工作!

说说性能问题。性能和内核无关,你不要指望从32位的Linux 2.6.8换到64位的Linux 2.6.32内核在性能上会有一个突破,也不要指望拼出Linux和Windows内核对性能提升效果的优劣,关键还是在于应用程序!WHY?因为性能是一个高端私人定***务,内核这种基础设施是不负责这种高定服务的。想出高性能,实际上一种艺术行为,涉及到方方面面的微调,绝对是高端大气上档次的行为,你指望内核能帮你做到这些吗?在微内核的世界,这是可能的,但是千万别把你的偏好转向微内核,干嘛非要内核搞定一切呢?干嘛不自己搞定啊!就算自己搞不定,把思想或者想法放出去,总会有人搞定的啊!不管是宏内核还是微内核,都不宜把高定的东西往里面塞,否则,对于宏内核而言,它就变成了屎壳郎滚的球,对于微内核而言,它就变成了蜘蛛织的网...