这个问题其实没有什么意思,知道了问题的答案能表明一个人技术水平有多高吗?不能!这个问题有答案以及有意义吗?答案都是没有!那我还为何一直对这个问题死死揪住不放?这类问题可以提高一个人的素质以及了解一段关于网络和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的手段罢了。
分享到:
相关推荐
linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、自动安装Wi-Fi热点。 最近在做路由器二次开发,现在市面上卖的新设备,大多数都采用了2.5G网卡,现在...
linux-r8101网卡驱动
网络适配代码使得不具备屋里网卡的设备实现网络功能。
2.6.33linux虚拟网卡设备驱动
linux在TQ2440上移植10--完善网卡驱动----这个真好!
Linux 网卡配置文件设置,讲了手动配置方法和一些基本的配置文件中的项目的意思。
在该文件中加入类似下列各行(#号以后为注释,下同): #配置第一个以太网卡eth0的IP地址,子网掩码,UP起激活作用 /sbin/ifconfig,etho 202.117.11.47 netmask 255.255.255.0 UP #配置并激活回环设备lo ...
RTL8723BE无线网卡驱动-Linux
linux双网卡 路由配置 -私网专线-访问特定ip走私网网卡
Linux 无线网卡连接 WIFI WPA-PSK //编辑/etc/wpa_supplicant/wpa_supplicant.conf 文件,内容如下ctr
EP-MS8552S无线网卡在Linux系统上的驱动程序,EP-MS8552S的无线标准是IEEE802.11/B/G/N
linux离线安装gcc、make、build-essential、Realtek8125b网卡驱动,解压后查看说明,按照说明一步到位,无需网络。
网卡驱动e100-3.5.17.e100-3.5.17.tar
linux 绿联usb/type-c千兆网卡驱动
荣耀锐龙版Linux网卡驱动 买的荣耀MagicBookpro16.1锐龙版 Linux版笔记本, 安装深度系统和windows10的双系统 结果安装好之后无线网卡没有驱动,通过安装此网卡然后成功了。
Atheros AR8131 网卡驱动下载地址:(包括windows 驱动 和 Linux驱动) http://partner.atheros.com/Drivers.aspx Atheros AR9285无线网卡驱动,由开源项目MadWifi支持 在sourceforge搜索MadWifi可以找到: ...
linux中ifcfg-ens33网卡 配置文件,已经配置完成,最后是桥接模式,比较试用于公司里面
EDIMAX EW-7611UCB EW-7822UAC EW-7833UAC等USB无线网卡(12款)LINUX系统驱动: 型号如下: EW-7611UCB EW-7611ULB EW-7811DAC EW-7811UAC EW-7811UN EW-7811UN V2 EW-7811UTC EW-7822UAC EW-7822UAN EW-7822ULC EW...
嵌入式linux上的虚拟网卡驱动源代码和Makefile编译驱动文件源代码
linux双网卡绑定 bonding