Linux 支持多种套接字种类,不同的套接字种类称为“地址族”,这是因为每种套接字种类拥有自己的通讯寻址方法。Linux 所支持的套接字地址族见表12.3。
Linux将上述套接字地址族抽象为统一的 BSD 套接字接口,应用程序关心的只是 BSD 套接字接口,而 BSD 套接字由各地址族专有的软件支持。一般而言,BSD 套接字可支持多种套接字类型,不同的套接字类型提供的服务不同,Linux 所支持的部分 BSD 套接字类型见表 12.4,但表12.3中的套接字地址族并不一定全部支持表12.4中的这些套接字类型。
表12. 3 Linux
支持的套接字地址族
套接字地址族 |
描述 |
UNIX |
UNIX 域套接字 |
INET |
通过 TCP/IP 协议支持的 Internet 地址族 |
AX25 |
Amater radio
X25 |
APPLETALK |
Appletalk
DDP |
IPX |
Novell IPX |
X25 |
X25 |
表12.4 Linux 所支持的 BSD 套接字类型
BSD 套接字类型 |
描述 |
流(stream) |
这种套接字提供了可靠的双向顺序数据流,可保证数据不会在传输过程中丢失、破坏或重复出现。流套接字通过 INET 地址族的 TCP
协议实现。 |
数据报(datagram) |
这种套接字也提供双向的数据传输,但是并不对数据的传输提供担保,也就是说,数据可能会以错误的顺序传递,甚至丢失或破坏。这种类型的套接字通过 INET 地址族的 UDP
协议实现。 |
原始(raw) |
利用这种类型的套接字,进程可以直接访问底层协议(因此称为原始)。例如,可在某个以太网设备上打开原始套接字,然后获取原始的 IP 数据传输信息。 |
可靠发送的消息 |
和数据报套接字类似,但保证数据被正确传输到目的端。 |
顺序数据包 |
和流套接字类似,但数据包大小是固定的。 |
数据包(packet) |
这并不是标准的 BSD 套接字类型,它是 Linux 专有的 BSD 套接字扩展,可允许进程直接在设备级访问数据包。 |
下面我们以INET套接字地址族、流套接字类型为例,详细介绍套接字的工作原理和通信过程。