什么是套接字 (Socket)?



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

对于程序员来说,套接字看起来和行为都非常类似于低级文件描述符。这是因为像 read() 和 write() 这样的命令与套接字的交互方式与它们与文件和管道交互的方式相同。

套接字最初是在 2.1BSD 中引入的,随后在 4.2BSD 中被改进到目前的形态。套接字功能现在在大多数当前的 UNIX 系统发行版中都可用。

套接字在哪里使用?

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

套接字类型

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

假设进程只在相同类型的套接字之间进行通信,但没有限制阻止不同类型的套接字之间进行通信。

  • 流式套接字 (Stream Sockets) - 网络环境中的交付是有保证的。如果您通过流式套接字发送三个项目“A、B、C”,它们将按相同的顺序到达 - “A、B、C”。这些套接字使用 TCP(传输控制协议)进行数据传输。如果交付不可能,发送方会收到错误指示。数据记录没有任何边界。

  • 数据报套接字 (Datagram Sockets) - 网络环境中的交付没有保证。它们是无连接的,因为您不需要像流式套接字那样打开连接 - 您构建一个包含目标信息的包并将其发送出去。它们使用 UDP(用户数据报协议)。

  • 原始套接字 (Raw Sockets) - 这些套接字允许用户访问支持套接字抽象的基础通信协议。这些套接字通常是面向数据报的,尽管它们的精确特性取决于协议提供的接口。原始套接字并非面向普通用户;它们主要提供给那些有兴趣开发新的通信协议或访问现有协议某些更隐秘功能的人。

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

接下来是什么?

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

广告