Unix Sockets 简明教程

What is a Socket?

套接字允许同一台或不同机器上的两个进程之间通信。说得更精确一些,套接字是一种使用标准 Unix 文件描述符与其他计算机通信的方式。在 Unix 中,每个 I/O 操作都是通过写入或读取文件描述符来完成的。文件描述符只是一个与打开的文件相关联的整数,它可以是网络连接、文本文件、终端或其他东西。

对于程序员来说,套接字的外观和行为与低级文件描述符非常相似。这是因为 read() 和 write() 等命令与套接字一起工作的原理与它们与文件和管道一起工作的原理相同。

套接字最早出现于 2.1BSD 中,随后在 4.2BSD 中被改进为当前形式。现在,大多数当前 UNIX 系统发行版都可以使用套接字功能。

Where is Socket Used?

Unix 套接字用于客户端-服务器应用程序框架。服务器是一个根据客户端请求执行某些功能的进程。大多数应用程序级协议(如 FTP、SMTP 和 POP3)都使用套接字在客户端和服务器之间建立连接,然后交换数据。

Socket Types

用户可以使用四种类型的套接字。前两种最常用,后两种很少用。

通常认为进程只能在同类型套接字之间进行通信,但是没有规定阻止不同类型套接字之间的通信。

  1. Stream Sockets − 在网络环境中保证交付。如果您通过流套接字发送三个项目“A、B、C”,它们将按相同顺序到达 − “A、B、C”。这些套接字使用 TCP(传输控制协议)进行数据传输。如果无法交付,发件人将收到一个错误指示器。数据记录没有任何边界。

  2. Datagram Sockets − 在网络环境中不保证交付。它们是无连接的,因为您不需要像流套接字那样保持开放连接 − 只需构建一个包含目标信息的数据包然后发送出去即可。它们使用 UDP(用户数据报协议)。

  3. Raw Sockets − 这些套接字为用户提供了访问基础通信协议的功能,这些协议支持套接字抽象。这些套接字通常面向数据报,尽管它们的具体特征取决于协议提供的接口。原始套接字并非面向普通用户;它们主要是为那些有兴趣开发新的通信协议或想要访问现有协议的某些更隐晦功能的人提供的。

  4. Sequenced Packet Sockets − 它们类似于流套接字,但保留了记录边界。此接口仅作为网络系统 (NS) 套接字抽象的一部分提供,并且在大多数重要的 NS 应用程序中非常重要。顺序数据包套接字允许用户操作数据包或一组数据包上的顺序数据包协议 (SPP) 或互联网数据报协议 (IDP) 标头,方法是随要发送的任何数据编写一个原型标头,或者指定一个默认标头以在所有传出数据中使用,并且允许用户接收传入数据包的标头。

What is Next?

接下来的几章旨在加强你的基础知识,在你使用套接字编写服务器和客户端程序之前奠定基础。如果您想直接跳到如何编写客户端和服务器程序,您可以这样做,但这不是推荐做法。强烈建议你一步一步地进行,完成这些最初的几章,在你开始编程之前打好基础。