分类:
2010-10-27 16:57:50
这个问题其实没有什么意思,知道了问题的答案能表明一个人技术水平有多高吗?不能!这个问题有答案以及有意义吗?答案都是没有!那我还为何一直对这个问题死 死揪住不放?这类问题可以提高一个人的素质以及了解一段关于网络和unix的历史,正是因为这些都很有趣,才如此值得关注。
在unix 中,一切io相关的实体都被抽象成了文件,之所以抽象成文件第一是为了接口统一,第二是为了操作统一,第三是为了策略隐藏,比如这样可以向用户屏蔽掉具体 设备的细节或者具体文件系统的细节,文件抽象有块抽象和字符抽象,对于块文件,你只需要知道它可以随机读写就可以完成大部分的工作而不用关注底层具体的文 件系统,比如ext3,ntfs,jfs之类,对于字符设备文件,你只需要知道他们是串行读写就可以了,而不必关心鼠标的电路安排,打印机的内部机制等 等,但是对于网卡,我们看看它是字符设备还是块设备。如果它是块设备,那么它能随机读写吗?看看网卡的特性,它的另一端是另一个世界,它更像是一个管道, 它更像是一个字符设备,因为对一个管道进行随机读写是没有意义的,那么它是一个字符设备吗?要知道网络协议多种多样,计算机仅仅负责按照协议加工数据而不 对协议本身做任何限制,因此如果将网卡作为字符设备,那么为了支持众多协议以及为了在传输之前绑定一个协议,就必须频繁调用ioctl之类的系统调用,这 样用户就必须知道网卡这个设备的更多的细节,否则用户怎么去ioctl这块网卡,这显然违背了unix文件抽象的初衷,另外怎么去同步这个设备,比如多个 进程同时需要打开这个设备传输网络数据,怎么能保证它们可以用最高的效率复用这个网卡,这个同步工作应该由谁来做,系统还是用户,如果由系统来做,传统的 文件同步接口将在网卡设备文件失效,如果由用户来完成,那么用户必须对网卡像驱动工程师一样熟悉,一个用户弄坏网卡的一个寄存器就会导致整个网卡down 掉...第三,如何支持网络协议,难道让用户自己进行协议封装然后write到网卡吗?协议栈在这种情况下必须在用户空间实现,如此一来,效率和健壮性 呢?安全性呢?协议栈显然受不到操作系统的内核空间特权级别的保护待遇,这违背了安全原则。综上,网卡不能被抽象成设备文件,因为将之抽象之后得不到任何 好处。
bsd套接字解决上文件抽象问题,为了使用文件接口,bsd套接字仍然使用文件接口,下层直接和内核空间的协议栈接口,所有的同 步以及协议规程都在协议栈完成,设备复用由协议栈和设备驱动共同完成,这个bsd套接字抽象简直就是一件艺术品,人们又回到了一切皆文件的美丽又和谐的世 界,bsd套接字通过一个新的系统调用socket来代替open从而可以实现诸如协议绑定之类的和open语义不相关的操作,另外connect和 accept也实现了自己的语义。当初为何不将网络设备作为文件抽象呢?实际上有一个本质的原因,那就是unix根本就不把网络通信作为IO,而是作为 IPC,实际上unix从一开始就将网络当成了计算机,否则它也不会将网络通信作为IPC,进程间通信可以在同一台机器,也可以在不同的机器,实际上机器 并不是界限。unix将网络通信当成了像共享内存,信号量之类的IPC机制了,只不过后者是同一台机器内部的机制,不需要硬件,而网络通过需要硬件实现, 硬件就是网卡之类的设备,unix仅仅将网络设别作为了实现IPC的手段罢了。
chinaunix网友2010-10-28 18:17:30
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com