了解套接字

介绍

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

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

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

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

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

先决条件

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

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

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

  • sudo apt update

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

  • sudo apt install iproute2 netcat-openbsd socat

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

什么是流套接字?

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

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

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

创建基于 TCP 的流套接字

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

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

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

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

Output
[1] 434223 [2] 434224

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

检查基于 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

您将收到如下输出:

Output
State 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 套接字正在侦听端口 上所有可用的 IPv4 接口8080仅侦听特定 IPv4 地址的服务将仅在突出显示的字段中显示该 IP,例如203.0.113.1:8080

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

  • ss -6 -tln

您将收到如下输出:

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

根据您的系统上运行的服务,您的输出中可能还有其他带有其他端口的线路。[::]:8080输出中突出显示的部分表示 IPv6 TCP 套接字正在侦听端口上所有可用的 IPv6 接口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.1IP 地址是因为您的系统将拥有自己唯一的 IP 地址。如果您知道系统的 IP,您也可以使用它进行测试。例如,如果您系统的公共或私有 IP 地址是 203.0.113.1,您可以使用它来代替环回 IP。

您将收到如下输出:

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

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

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

  • nc -6 -vz ::1 8080

您应该收到如下输出:

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

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

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

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

  • fg

您将收到如下输出:

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

CTRL+C停止该过程。

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

Output
socat TCP4-LISTEN:8080,fork /dev/null

CTRL+C停止该过程。

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

什么是数据报套接字?

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

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

UDP 套接字通常由域名系统 (DNS) 服务器使用。默认情况下,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然后,您将检查使用ssnc命令创建的套接字

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

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

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

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

现在您有两个socat进程在监听 UDP 端口123,您可以使用ssnc实用程序检查套接字

检查数据报套接字

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

u标志将输出限制为 UDP 套接字。

其他标志与前面 TCP 示例中使用的标志相同。

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

  • ss -4 -uln

您将收到如下输出:

Output
State 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 套接字在端口 上的所有 IPv4 接口上可用123仅在特定 IPv4 地址上可用的服务将仅在突出显示的字段中显示该 IP,例如203.0.113.1:123

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

  • ss -6 -uln

您将收到如下输出:

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

根据您的系统上运行的服务,您的输出中可能还有其他带有其他端口的线路。[::]:123输出的突出显示部分表示 IPv6 TCP 套接字在端口上的所有 IPv6 接口上可用123(如::字符所示)。仅在特定 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.1IP 地址是因为您的系统将拥有自己唯一的 IP 地址。如果您知道系统的 IP,您也可以使用它进行测试。例如,如果您系统的公共或私有 IP 地址是203.0.113.1您可以使用它来代替环回 IP。

您将收到如下输出:

Output
Connection to 127.0.0.1 123 port [udp/ntp] succeeded!

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

注意:如果此示例中的套接字不可用,则远程系统将返回一个ICMP 类型 3 消息(目标不可达),代码为 3,表示该端口在远程主机上不可达。

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

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

  • nc -6 -u -vz ::1 123

您应该收到如下输出:

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

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

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

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

  • fg

您将收到如下输出:

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

CTRL+C停止该过程。

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

Output
sudo 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 套接字,您可以使用ssnc实用程序检查它们

检查 Unix 域套接字

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

  • ss -xln

您将收到如下输出:

Output
Netid 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 . . .

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

由于 Unix 域套接字是文件,通常的 Linux 用户和组权限和访问控制可用于限制谁可以连接到套接字。您也可以使用像文件系统工具lsmvchownchmod检查和处理UDS文件。SELinux 等工具也可用于标记具有不同安全上下文的 UDS 文件。

要检查文件是否为 UDS 套接字,请使用lsfilestat实用程序。但是,重要的是要注意,这些工具都不能确定 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文件权限字段之前的字符:

Output
srwxr-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 套接字。要连接到您创建的示例套接字,您需要-U在运行 netcat 命令时指定一个额外的标志。该标志告诉 netcat 连接到 UDS,而不是基于 TCP 或 UDP 的网络套接字。

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

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

  • nc -U -z /tmp/stream.sock

-U通知的netcat,它是连接到一个Unix域套接字。

z选项确保 netcat 仅连接到套接字,而不发送任何数据。

/tmp/stream.sock是在文件系统中的套接字的地址。

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

Output
nc: 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 远程套接字是数据报套接字。同样,如果测试成功,您将不会收到任何输出。

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

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

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

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

  • fg

您将收到如下输出:

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

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

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

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

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

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

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

结论

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

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

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

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁