注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。
此书已经开源,阅读地址 http://www.kerneltravel.net
一、套接字socket
(一)、套接字在网络中的地位和作用

socket 在网络系统中的作用如下。
(1)socket 位于网络协议之上,屏蔽了不同网络协议之间的差异。
(2)socket 是网络编程的入口,它提供了大量的系统调用,构成了网络程序的主体。
(3)在Linux 系统中,socket 属于文件系统的一部分,网络通信可以被看作是对文件的
读取,使得我们对网络的控制和对文件的控制一样方便。
(二)、套接字接口的种类
Linux 支持多种套接字种类,不同的套接字种类称为“地址族”,这是因为每种套接字
种类拥有自己的通信寻址方法。Linux 所支持的套接字地址族见表12.3。
Linux 将上述套接字地址族抽象为统一的 BSD 套接字接口,应用程序关心的只是 BSD 套
接字接口,而 BSD 套接字由各地址族专有的软件支持。一般而言,BSD 套接字可支持多种套
接字类型,不同的套接字类型提供的服务不同,Linux 所支持的部分 BSD 套接字类型见表
12.4,但表12.3 中的套接字地址族并不一定全部支持表12.4 中的这些套接字类型。
(三)、套接字的工作原理
INET 套接字就是支持 Internet 地址族的套接字,它位于TCP 之上,BSD 套接字之下,
如图12.8 所示,这里也体现了Linux 网络模块分层的设计思想。
INET 和 BSD 套接字之间的接口通过 Internet 地址族套接字操作集实现,这些操作集
实际是一组协议的操作例程,在include/linux/net.h 中定义为struct proto_ops:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
struct proto_ops
{ int family; |