一、Linux网络结构
Socket
与字符设备和块设备不同, 网络设备比较特殊并不对应于/dev目录下的文件,因此网卡不能利用设备文件访问。原因在于网络通信期间,数据打包到了各种协议层中。在接收到数据时,内核必须针对各协议层的处理,对数据进行拆包与分析,然后才能将有效数据传递给应用层。在数据发送时,内核必须首先根据各个协议层的要求打包数据,然后才能发送。
为了支持通过文件接口处理网络连接,Liunx使用了源于BSD的套接字(Socket)抽象。因此在Linux中,TCP/IP协议实现的最上层是BSD套接口层,BSD套接口提供了一整套网络编程socket()函数,一般的网络应用程序都采用socket()函数(Linux内核支持的协议栈种类较多, 如Internet、 UNIX、 CAN、 NFC、 Bluetooth、 WiMAX、 IrDA等,上层的应用程序统一使用套接字接口)。
因此Socket可以看作应用程序、文件接口、内核的网络实现之间的代理,应用程序最终使用Socket完成与网络设备的接口;在网络设备身上并不能体现出“一切都是文件”的思想。
但是需要注意网络接口与虚拟文件系统之间时有联系的,比如虚拟文件系统利用网络接口支持网络文件系统NFS。
![](https://img-blog.csdnimg.cn/img_convert/ab4ac0dfca8bb873c4bee35669625887.png)