了解套接字

来自菜鸟教程
跳转至:导航、​搜索

介绍

套接字是一种在服务器上运行的程序之间或在不同服务器上运行的程序之间实现进程间通信的方法。 服务器之间的通信依赖于 网络套接字 ,它使用 Internet 协议 (IP) 来封装和处理发送和接收数据。

客户端和服务器上的网络套接字都由它们的 套接字地址 引用。 地址是传输控制协议 (TCP) 或用户数据报协议 (UDP) 等传输协议、IP 地址和端口号的唯一组合。

在本教程中,您将了解以下用于进程间通信的不同类型的套接字:

  • 流套接字,使用 TCP 作为其底层传输协议
  • 数据报套接字,使用 UDP 作为其底层传输协议
  • Unix Domain Sockets,它使用本地文件来发送和接收数据,而不是网络接口和IP数据包。

在本教程的每个部分中,您还将学习如何在 Linux 系统上枚举相应的套接字类型。 您将使用各种命令行工具检查每种类型的套接字。

先决条件

本教程中的示例在 Ubuntu 20.04 服务器上进行了验证。 您可以在本地计算机或远程服务器上使用大多数现代 Linux 发行版来遵循本教程,只要您安装了发行版所需的每个工具的等效版本。

要开始使用 Ubuntu 20.04,您需要一台已按照我们的 Ubuntu 20.04 初始服务器设置指南配置的服务器。

您还可以使用嵌入在此页面上的交互式终端来试验您将在本教程中使用的示例 socat 和 nc 命令。 单击下面的 Launch an Interactive Terminal! 按钮开始使用。

启动交互式终端!

您还需要一些其他软件包来检查系统上的套接字。 使用 apt update 命令确保系统的包缓存是最新的:

sudo apt update 

然后使用以下命令安装所需的包:

sudo apt install iproute2 netcat-openbsd socat

iproute2 包包含 ss 实用程序,我们将使用它来检查套接字。 我们将使用 netcat-openbsd 包来安装 netcat。 请注意,netcat 在命令行中调用时缩写为 nc。 最后,我们将使用 socat 包来创建示例套接字。

什么是流套接字?

流套接字是面向连接的,这意味着发送到网络套接字和从网络套接字接收的数据包由主机操作系统传递,以便由应用程序处理。 基于网络的流套接字通常使用传输控制协议 (TCP) 来封装和通过网络接口传输数据。

TCP 被设计为依赖于有状态连接的可靠网络协议。 程序使用基于 TCP 的流套接字发送的数据将被远程系统成功接收(假设没有路由、防火墙或其他连接问题)。 TCP 数据包可以按任何顺序到达物理网络接口。 如果数据包无序到达,网络适配器和主机操作系统将确保它们以正确的顺序重新组合以供应用程序处理。

基于 TCP 的流套接字的典型用途是用于 Web 服务器(如 Apache 或 Nginx)处理端口 80 上的 HTTP 请求,或端口 443 上的 HTTPS。 对于 HTTP,套接字地址类似于 203.0.113.1:80,而对于 HTTPS,它类似于 203.0.113.1:443。

创建基于 TCP 的流套接字

在以下示例中,您将使用 socat(SOcket CAT 的缩写)命令模拟 Web 服务器在端口 8080(备用 HTTP 端口)上侦听 HTTP 请求。 然后您将使用 ss 和 nc 命令检查套接字。

首先,运行以下 socat 命令创建两个基于 TCP 的套接字,它们使用 IPv4 和 IPv6 接口侦听端口 8080 上的连接:

socat TCP4-LISTEN:8080,fork /dev/null&
socat TCP6-LISTEN:8080,ipv6only=1,fork /dev/null&
  • TCP4-LISTEN:8080 和 TCP6-LISTEN:8080 参数是要使用的协议类型和端口号。 他们告诉 socat 在所有 IPv4 和 IPv6 接口的端口 8080 上创建 TCP 套接字,并监听每个套接字的传入连接。 socat 可以监听系统上的任何可用端口,因此从 0 到 65535 的任何端口都是套接字选项的有效参数。
  • fork 选项用于确保 socat 在处理完连接后继续运行,否则会自动退出。
  • /dev/null 路径用于代替远程套接字地址。 在这种情况下,它告诉 socat 将任何传入的输入打印到 /dev/null 文件中,该文件会默默地丢弃它。
  • ipv6only=1 标志用于 IPv6 套接字,以告知操作系统该套接字未配置为将数据包发送到 IPv4 映射的 IPv6 地址。 如果没有这个标志,socat 将绑定到 IPv4 和 IPv6 地址。
  • & 字符指示 shell 在后台运行命令。 此标志将确保 socat 在您调用其他命令检查套接字时继续运行。

您将收到如下输出,这表明在您的 shell 会话后台运行的两个 socat 进程 ID。 您的进程 ID 将不同于此处突出显示的 ID:

Output[1] 434223
[2] 434224

现在您有两个 socat 进程在后台侦听 TCP 端口 8080,您可以使用 ss 和 nc 实用程序检查套接字。

检查基于 TCP 的流套接字

要使用 ss 命令检查现代 Linux 系统上的 TCP 套接字,请使用以下标志运行它以限制输出:

  • -4 和 -6 标志告诉 ss 分别只检查 IPv4 或 IPv6 套接字。 省略此选项将显示两组套接字。
  • t 标志将输出限制为 TCP 套接字。 默认情况下,ss 工具将显示 Linux 系统上使用的所有类型的套接字。
  • l 标志将输出限制为侦听套接字。 如果没有这个标志,所有的 TCP 连接都将被显示,其中包括 SSH、可能连接到 Web 服务器的客户端或您的系统可能与其他服务器的连接。
  • n 标志确保显示端口号而不是服务名称。

首先运行 ss -4 -tln 命令来检查正在侦听系统上连接的基于 IPv4 TCP 的套接字:

ss -4 -tln

您将收到如下输出:

OutputState      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port     Process     
. . .
LISTEN     0          1                    0.0.0.0:8080                  0.0.0.0:*
. . .

根据您的系统上运行的服务,您的输出中可能还有其他带有其他端口的行。 输出中突出显示的 0.0.0.0:8080 部分表示 IPv4 TCP 套接字正在侦听端口 8080 上所有可用的 IPv4 接口。 仅侦听特定 IPv4 地址的服务将仅在突出显示的字段中显示该 IP,例如 203.0.113.1:8080。

现在再次运行相同的 ss 命令,但带有 -6 标志:

ss -6 -tln

您将收到如下输出:

OutputState    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process  
. . .
LISTEN   0        5                   [::]:8080               [::]:*
. . .

根据您的系统上运行的服务,您的输出中可能还有其他带有其他端口的行。 输出中突出显示的 [::]:8080 部分表示 IPv6 TCP 套接字正在侦听端口 8080 上的所有可用 IPv6 接口(如 :: 字符所示,它们是用于一个全零组成的地址)。 仅侦听特定 IPv6 地址的服务将仅在突出显示的字段中显示该 IP,例如 [2604:a880:400:d1::3d3:6001]:8080。

连接到基于 TCP 的流套接字

到目前为止,您已经学习了如何在 IPv4 和 IPv6 接口上创建和枚举 TCP 套接字。 现在您有两个侦听连接的套接字,您可以尝试使用 netcat 实用程序连接到套接字。

使用 netcat 测试与本地和远程套接字的 TCP 连接是一种非常有用的故障排除技术,可以帮助隔离系统之间的连接和防火墙问题。

要使用 netcat 通过本地环回地址连接到 IPv4 套接字,请运行以下命令:

nc -4 -vz 127.0.0.1 8080
  • -4 标志告诉 netcat 使用 IPv4。
  • -v 标志用于将详细输出打印到终端。
  • -z 选项确保 netcat 只连接到一个套接字,而不发送任何数据。
  • 使用本地环回 127.0.0.1 IP 地址,因为您的系统将拥有自己唯一的 IP 地址。 如果您知道系统的 IP,您也可以使用它进行测试。 例如,如果您的系统的公共或私有 IP 地址是 203.0.113.1,您可以使用它来代替环回 IP。

您将收到如下输出:

OutputConnection to 127.0.0.1 (127.0.0.1) 8080 port [tcp/http-alt] succeeded!

突出显示的行是 netcat 的输出。 它表示 netcat 连接到 TCP 套接字,监听环回 127.0.0.1 端口 8080 上的 IPv4 地址。 您可以忽略第二行,它来自在终端后台运行的 socat 进程。

现在您可以重复相同的连接测试,但使用 IPv6。 运行以下 netcat 命令:

nc -6 -vz ::1 8080

您应该收到如下输出:

OutputConnection to ::1 8080 port [tcp/http] succeeded!

突出显示的行是 netcat 的输出。 它表示 netcat 连接到 TCP 套接字,监听环回 ::1 端口 8080 上的 IPv6 地址。 同样,您可以忽略第二行输出。

要清理您的套接字,您需要为您创建的每个 socat 进程运行 fg(前台)命令。 然后您将使用 CTRL+C 关闭每个 socat。 fg 将以与您运行进程相反的顺序将进程带到终端的前台,因此当您运行它时,第二个 socat 实例将是您首先与之交互的实例。

运行 fg 将第二个 IPv6 socat 实例带到终端的前台。 然后运行 CTRL+C 关闭它。

fg

您将收到如下输出:

Outputsocat TCP6-LISTEN:8080,ipv6only=1,fork /dev/null

按 CTRL+C 停止该过程。

现在再次运行 fg 以清理第一个 IPv4 套接字。 您应该有如下输出:

Outputsocat TCP4-LISTEN:8080,fork /dev/null

按 CTRL+C 停止该过程。

您现在已经在系统上创建、检查并连接到 IPv4 和 IPv6 套接字。 这些技术和工具将适用于本地开发系统或远程生产服务器,因此请尝试使用每种工具来更加熟悉如何使用它们来测试和排除 TCP 套接字故障。

什么是数据报套接字?

数据报套接字是无连接的,这意味着从套接字发送和接收的数据包由应用程序单独处理。 基于网络的数据报套接字通常使用用户数据报协议 (UDP) 来封装和传输数据。

UDP 不对包头中的序列信息进行编码,并且协议中没有内置纠错功能。 使用基于数据报的网络套接字的程序必须构建自己的错误处理和数据排序逻辑,以确保成功的数据传输。

域名系统 (DNS) 服务器通常使用 UDP 套接字。 默认情况下,DNS 服务器使用端口 53 发送和接收域名查询。 DNS 服务器的示例 UDP 套接字地址类似于 203.0.113.1:53。

注意:虽然该协议不包含在人类可读版本的套接字地址中,但操作系统通过将 TCP 和 UDP 协议作为地址的一部分来区分套接字地址。 因此,像 203.0.113.1:53 这样的人类可读的套接字地址可以使用任一协议。 ss 等工具和较旧的 netstat 实用程序用于确定正在使用哪种类型的套接字。


网络时间协议 (NTP) 使用端口 123 上的 UDP 套接字来同步计算机之间的时钟。 NTP 协议的示例 UDP 套接字是 203.0.113.1:123。

创建数据报套接字

与前面的 TCP 套接字示例一样,在本节中,您将再次使用 socat 来模拟 NTP 服务器在 UDP 端口 123 上侦听请求。 然后,您将检查使用 ss 和 nc 命令创建的套接字。

首先,运行以下 socat 命令来创建两个 UDP 套接字,它们使用 IPv4 和 IPv6 接口侦听端口 123 上的连接:

sudo socat UDP4-LISTEN:123,fork /dev/null&
sudo socat UDP6-LISTEN:123,ipv6only=1,fork /dev/null&

您将收到如下输出,这表明在您的 shell 会话后台运行的两个 socat 进程 ID。 您的进程 ID 将不同于此处突出显示的 ID:

Output[1] 465486
[2] 465487
  • 每个命令都以 sudo 为前缀,因为端口 0 到 1024 在大多数系统上都是保留的。 sudo 运行具有管理员权限的命令,允许 socat 绑定到保留范围内的任何端口。
  • UDP4-LISTEN:123 和 UDP6-LISTEN:123 参数是要使用的协议类型和端口。 他们告诉 socat 在 IPv4 和 IPv6 接口上的端口 123 上创建基于 UDP 的套接字,并监听传入的数据。 同样,0-65535 整个范围内的任何端口都是 UDP 套接字的有效参数。
  • fork、ipv6only=1 和 /dev/null 参数的使用方式与前面 TCP 示例中描述的方式相同。

现在您有两个 socat 进程正在侦听 UDP 端口 123,您可以使用 ss 和 nc 实用程序检查套接字。

检查数据报套接字

要使用 ss 命令检查现代 Linux 系统上的 UDP 套接字,请使用以下 -4、-6, and uln 标志运行它以限制输出:

u 标志将输出限制为 UDP 套接字。 其他标志与前面 TCP 示例中使用的标志相同。

首先运行 ss -4 -uln 命令来检查正在侦听系统上的连接的 IPv4 UDP 套接字:

ss -4 -uln

您将收到如下输出:

OutputState      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port     Process     
. . .
UNCONN   0        0                 0.0.0.0:123            0.0.0.0:*
. . .

根据您的系统上运行的服务,您的输出中可能还有其他带有其他端口的行。 输出中突出显示的 0.0.0.0:123 部分表示 IPv4 UDP 套接字在端口 123 上的所有 IPv4 接口上可用。 仅在特定 IPv4 地址上可用的服务将仅在突出显示的字段中显示该 IP,例如 203.0.113.1:123。

现在再次运行相同的 ss 命令,但带有 -6 标志:

ss -6 -uln

您将收到如下输出:

OutputState    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process  
. . .
UNCONN   0        0                   [::]:123              [::]:*
. . .

根据您的系统上运行的服务,您的输出中可能还有其他带有其他端口的行。 输出中突出显示的 [::]:123 部分表示 IPv6 TCP 套接字在端口 123 上的所有 IPv6 接口上可用(如 :: 字符所示)。 仅在特定 IPv6 地址上可用的服务将仅在突出显示的字段中显示该 IP,例如 [2604:a880:400:d1::3d3:6001]:123。

测试数据报套接字

现在您已经熟悉了如何在 IPv4 和 IPv6 接口上创建和枚举 UDP 套接字,您可以尝试连接它们。 与 TCP 套接字一样,您可以使用 netcat 实用程序来试验 UDP 套接字。

要连接到您在本教程上一节中创建的端口 123 上的示例 UDP 套接字,请运行以下 netcat 命令:

nc -4 -u -vz 127.0.0.1 123
  • -4 标志告诉 netcat 使用 IPv4。
  • -u 选项指示 netcat 使用 UDP 而不是 TCP。
  • -v 标志用于将详细输出打印到终端。
  • -z 选项确保 netcat 只连接到一个套接字,而不发送任何数据。
  • 使用本地环回 127.0.0.1 IP 地址,因为您的系统将拥有自己唯一的 IP 地址。 如果您知道系统的 IP,您也可以使用它进行测试。 例如,如果您的系统的公共或私有 IP 地址是 203.0.113.1,您可以使用它来代替环回 IP。

您将收到如下输出:

OutputConnection to 127.0.0.1 123 port [udp/ntp] succeeded!

输出表明 netcat 没有从侦听环回 127.0.0.1 端口 123 上的 IPv4 地址的 UDP 套接字接收到错误 。 这种缺少错误响应用于推断 127.0.0.1:123 处的套接字可用。 这种行为与 TCP 套接字不同,后者需要交换数据包以确认套接字是否可用。

注意:如果本例中的socket不可用,远程系统会返回ICMP type 3 message (Destination Unreachable),Code为3,表示端口不可达远程主机。

基于缺少错误响应推断套接字可用假定没有阻止 ICMP 流量的防火墙或连接问题。 如果不通过 UDP 套接字发送、接收和验证应用程序数据,则无法保证远程 UDP 端口已打开并接受数据包。


现在您可以重复相同的连接测试,但使用 IPv6。 运行以下 netcat 命令:

nc -6 -u -vz ::1 123

您应该收到如下输出:

OutputConnection to ::1 123 port [udp/ntp] succeeded!!

输出表明 netcat 没有从侦听环回 ::1 端口 123 上的 IPv6 地址的 UDP 套接字接收到错误 。 同样,这种缺少错误响应用于推断 ::1:123 处的套接字可用。

要清理您的套接字,您需要为您创建的每个 socat 进程运行 fg(前台)命令。 然后您将使用 CTRL+C 关闭每个 socat。

运行 fg 将第二个 IPv6 socat 实例带到终端的前台。 然后运行 CTRL+C 关闭它。

fg

您将收到如下输出:

Outputsudo socat UDP6-LISTEN:123,ipv6only=1,fork /dev/null

按 CTRL+C 停止该过程。

现在再次运行 fg 以清理第一个 IPv4 套接字。 您将获得如下输出:

Outputsudo socat UDP4-LISTEN:123,fork /dev/null

按 CTRL+C 停止该过程。

您现在已经在您的系统上创建、检查和测试了 IPv4 和 IPv6 UDP 套接字。 尝试使用每种工具进行试验,以更加熟悉如何使用它们来测试和排除 UDP 套接字故障。

什么是 Unix 域套接字?

在同一台服务器上运行的程序也可以使用 Unix 域套接字 (UDS) 相互通信。 Unix 域套接字可以是基于流的,也可以是基于数据报的。 当使用域套接字时,数据通过主机文件系统上的文件直接在操作系统内核中的程序之间交换。 为了使用域套接字发送或接收数据,程序读取和写入它们的共享套接字文件,完全绕过基于网络的套接字和协议。

Unix 域套接字被不需要连接到网络接口的数据库系统广泛使用。 例如,Ubuntu 上的 MySQL 默认使用名为 /var/run/mysqld/mysql.sock 的文件与本地客户端进行通信。 客户端读取和写入套接字,MySQL 服务器本身也是如此。

PostgreSQL 是另一个使用套接字进行本地非网络通信的数据库系统。 通常,它默认使用 /run/postgresql/.s.PGSQL.5432 作为其套接字文件。

创建 Unix 域套接字

在前面的部分中,您探讨了 TCP 如何与流套接字一起使用,以及 UDP 如何与数据报套接字一起使用。 在本节中,您将使用 socat 创建基于流和基于数据报的 Unix 域套接字,而不使用 TCP 或 UDP 封装数据以通过网络发送。 然后,您将检查使用 ss 和 nc 命令创建的套接字。 最后,您将了解如何使用 netcat 测试 Unix 域套接字。

首先,运行以下 socat 命令来创建两个套接字文件:

socat unix-listen:/tmp/stream.sock,fork /dev/null&
socat unix-recvfrom:/tmp/datagram.sock,fork /dev/null&
  • 第一个命令指示 socat 使用 unix-listen 地址类型创建套接字,这将创建基于流的 UDS。
  • 第二个命令指定 unix-recvfrom 作为套接字类型,这将创建一个基于数据报的 UDS
  • 这两个命令在 : 分隔符之后指定一个文件名。 文件名是套接字本身的地址。 对于第一个流示例,它是 /tmp/stream.sock,对于第二个数据报示例,它是 /tmp/datagram.sock。 请注意,套接字的名称是任意的,但如果在您进行故障排除时它是描述性的,它会有所帮助。
  • fork 和 /dev/null 参数的使用方式与流和数据报套接字示例部分中描述的方式相同。

现在您已经创建了两个 UDS 套接字,您可以使用 ss 和 nc 实用程序检查它们。

检查 Unix 域套接字

要列出所有侦听的 Unix 域套接字,请运行 ss -xln 命令。 x 标志确保仅显示域套接字。

ss -xln

您将收到如下输出:

OutputNetid State  Recv-Q Send-Q      Local Address:Port   Peer Address:Port  Process
. . .
u_str LISTEN 0      5        /tmp/stream.sock 436470            * 0             
u_dgr UNCONN 0      0      /tmp/datagram.sock 433843            * 0
 . . .

请注意 /tmp/stream/sock 行中突出显示的 u_str 部分。 该字段表示套接字类型是基于流的UDS。 第二行显示类型是 u_dgr,这意味着套接字类型是基于数据报的。

由于 Unix 域套接字是文件,通常的 Linux 用户和组权限和访问控制可用于限制谁可以连接到套接字。 您还可以使用 ls、mv、chown 和 chmod 等文件系统工具来检查和操作 UDS 文件。 SELinux 之类的工具也可用于标记具有不同安全上下文的 UDS 文件。

要检查文件是否为 UDS 套接字,请使用 ls、file 或 stat 实用程序。 但是,重要的是要注意,这些工具都不能确定 UDS 是基于流还是基于数据报。 使用 ss 工具获取有关 Unix 域套接字的最完整信息。

要检查文件系统上的套接字,stat 实用程序会显示最相关的信息。 在您之前创建的套接字上运行它:

stat /tmp/stream.sock /tmp/datagram.sock

您将收到如下输出:

Output  File: /tmp/stream.sock
  Size: 0             Blocks: 1          IO Block: 131072 socket
Device: 48h/72d    Inode: 1742        Links: 1
Access: (0755/srwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-03-01 18:10:25.025755168 +0000
Modify: 2021-03-01 18:10:25.025755168 +0000
Change: 2021-03-01 18:22:42.678231700 +0000
 Birth: -
  File: /tmp/datagram.sock
  Size: 0             Blocks: 1          IO Block: 131072 socket
Device: 48h/72d    Inode: 1743        Links: 1
Access: (0755/srwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-03-01 18:10:25.025755168 +0000
Modify: 2021-03-01 18:10:25.025755168 +0000
Change: 2021-03-01 18:10:25.025755168 +0000
 Birth: -

请注意,对于每个文件,类型为 socket(在输出的最右侧突出显示),访问模式在文件权限前有一个 s 字符。

ls 实用程序还将指示文件是否为套接字。 运行 ls -l 检查文件:

ls -l /tmp/stream.sock /tmp/datagram.sock

您将收到如下输出。 再次注意,对于套接字,文件模式在文件权限字段之前包含 s 字符:

Outputsrwxr-xr-x 1 root root 0 Mar  1 18:10 /tmp/datagram.sock
srwxr-xr-x 1 root root 0 Mar  1 18:10 /tmp/stream.sock

现在您已经创建了 Unix 域套接字,并学习了如何使用 ss 和各种基于文件系统的工具来检查它们,下一步是使用像 netcat 这样的工具来测试套接字。

测试 Unix 域套接字

netcat 实用程序可用于连接到 Unix 域套接字,以及您在本教程前面已经了解的 TCP 和 UDP 套接字。 要连接到您创建的示例套接字,您需要在运行 netcat 命令时指定一个额外的 -U 标志。 此标志告诉 netcat 连接到 UDS,而不是基于 TCP 或 UDP 的网络套接字。

此外,如果套接字是基于数据报的,您将使用 -u 标志来指示 netcat 使用数据报,正如我们在本教程的数据报套接字部分中学到的那样。

让我们通过使用以下命令连接到基于流的套接字开始检查 UDS 套接字:

nc -U -z /tmp/stream.sock

-U 告诉 netcat 它正在连接到一个 Unix 域套接字。 -z 选项确保 netcat 只连接到一个套接字,而不发送任何数据。 /tmp/stream.sock 是文件系统上套接字的地址。

运行该命令时,您不会收到来自 netcat 的任何输出。 但是,如果套接字 not 可用,netcat 将输出如下错误消息:

Outputnc: unix connect failed: No such file or directory
nc: /tmp/stream.sock: No such file or directory

因此,在测试基于流的 UDS 套接字时,netcat 没有输出意味着连接成功。

重复测试过程,这次是基于数据报的 UDS:

nc -uU -z /tmp/datagram.sock

添加了额外的 -u 标志以告诉 netcat 远程套接字是数据报套接字。 同样,如果测试成功,您将不会收到任何输出。

如果该地址没有套接字,您将收到如下错误:

Outputnc: unix connect failed: No such file or directory
nc: /tmp/datagram.sock: No such file or directory

要清理您的套接字,您需要为您创建的每个 socat 进程运行 fg(前台)命令。 然后您将使用 CTRL+C 关闭每个 socat。

运行 fg 将基于数据报的 socat 实例带到终端的前台:

fg

您将收到如下输出:

Outputsocat unix-recvfrom:/tmp/datagram.sock,fork /dev/null

运行 CTRL+C 关闭它。 您不会收到任何输出。

现在再次运行 fg 以清理第一个基于流的 UDS 套接字。

同样,您应该具有如下输出:

Outputsocat unix-listen:/tmp/stream.sock,fork /dev/null

运行 CTRL+C 结束进程。 您不会收到任何输出。

您现在已经在您的系统上创建、检查和测试了 Unix 数据报套接字套接字。 尝试使用 netcat 和 socat 进行试验,以更加熟悉如何通过 UDS 发送和接收数据,以及如何测试和排除 Unix 域套接字。

结论

在本教程中,您探索了如何在 Linux 系统上使用不同类型的套接字。 您了解了基于流的套接字,它通常使用 TCP 进行网络通信。 您还了解了基于数据报的套接字,它使用 UDP 通过网络发送数据。 最后,您探索了 Unix 域套接字如何可以是基于本地服务器的流或数据报。

在每个部分中,您使用了 ss 实用程序来收集有关 Linux 系统上的套接字的信息。 您了解了 ss 工具提供的不同标志如何帮助您在检查系统上的套接字时将其输出限制为特定类型的套接字。

最后,您使用 netcat 和 socat 工具创建并连接到本教程中讨论的三种不同类型的套接字。 netcat 实用程序广泛用于连接套接字,但它也可以创建套接字。 它的文档 (man nc) 包含许多如何在任一模式下使用它的示例。 socat 实用程序是一个更高级的工具,可用于连接到本教程未涵盖的许多不同类型的套接字。 它的文档 (man socat) 还包含许多可以使用它的不同方式的示例。

了解什么是套接字以及它们如何工作是一项核心系统管理技能。 您在本教程中试验的工具和技术将帮助您更加熟悉套接字,以及如果您的服务器和应用程序不能正确地相互通信,如何对它们进行故障排除。