同一个端口是否同时充当客户端和服务器?

同一个端口是否同时充当客户端和服务器?

我发现这个 netstat 输出有些奇怪。该输出是使用netstat -a -n -o -p TCPwin 7 上的命令获取的。

 Proto  Local Address          Foreign Address        State           PID
 TCP    127.0.0.1:55486        127.0.0.1:55487        ESTABLISHED     5808
 TCP    127.0.0.1:55487        127.0.0.1:55486        ESTABLISHED     5808

请注意这两行。本地和外部地址都是localhost。但是端口是如何配对的呢?两个端口中5548655487一个是服务器端口,哪一个是客户端端口?

据我所知,local-address列表示 TCP 连接的客户端,foreign-adress列表示服务器端。从此输出来看,似乎同一端口同时充当客户端服务器。

我不明白 TCP 怎么能实现这一点?

带配对端口的 netstat

答案1

线:TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808

表明客户端正在连接服务器的 55487 端口,而客户端使用端口 55486。

线: TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808

表明服务器正在从 55487 端口连接回客户端的 55486 端口。

TCP 需要“三次握手”来建立客户端和服务器之间的连接。

客户端连接到服务器(三次握手的第一部分)。服务器响应确认连接(第二部分)。客户端用自己的确认来响应确认(第三部分)。

TL;DR - 客户端通常使用随机端口连接到具有特定端口的服务器。服务器使用随机端口响应该机器。客户端和服务器是不是在同一个端口上。

答案2

我不能完全说出你现在理解了多少,所以请允许我有点吹毛求疵。

显然,您理解客户端和服务器的概念,因此,您这样写“该Local Address列表示 TCP 连接的客户端,该Foreign Address列表示服务器端”让我很惊讶。这是错误的;该Local Address列表示当地的TCP 连接的一侧,该Foreign Address列表示外国的(或者偏僻的) 端。换句话说,该Local Address列表示进程在你的电脑正在使用(即您的计算机拥有),该Foreign Address列表示本地套接字所连接的套接字。您似乎明白,计算机上的进程可以充当服务器,因此本地套接字可以是服务器套接字——然后相应的客户端套接字将被列为“外部”。

当您计算机上的客户端进程连接到计算机上的服务器进程时,事情开始变得混乱。现在,这个连接代表两个本地套接字 - 并netstat为每个套接字报告一行;一行显示客户端为本地,服务器为外部(即使它实际上是本地套接字),另一行则相反。

你的情况有点令人困惑。你的 jetty 服务器(进程 5808)当然会创建套接字并接受其上的连接——这就是服务器所做的。但它会同时创建多个套接字。(它们必然位于不同的端口号上;操作系统不允许多个具有相同协议和端口号的套接字共存。)而且它似乎在使用随机(操作系统分配的)端口号。例如,正如你所指出的,它正在监听端口 55484。我不熟悉 jetty,所以我不知道这是否正常。

如果仔细检查netstat输出,您会发现本地进程 184 使用端口 8081 上的套接字与进程 5808/端口 55482 建立了连接。

我觉得很奇怪的是,进程 5808 已经连接对自己在这些套接字上。因此,您有多个 TCP 连接,其中两个套接字都保存在同一个主机上,而且在同一过程中。我认为我们无法确定哪一端是客户端,哪一端是服务器。我实际上会猜测端口号较低的端口更可能是服务器,但这只是猜测。

答案3

这不是不寻常的情况。127.0.0.1是您的程序监听的有效 IP 地址。程序可以监听此地址。程序也可以连接到此地址。这符合客户端-服务器架构。您有客户端和服务器。它们可以位于不同的计算机上,但同时它们也可以位于一台计算机上。

例如,当你使用Google网站时,你的电脑是客户端,而Google的网络服务器是服务器。你的电脑和Google的服务器之间存在连接。

您可以在计算机上运行自己的 Web 服务器并监听接口127.0.0.1。打开浏览器并输入127.0.0.1- 结果您将看到来自 Web 服务器的网页。在这种情况下netstat将显示相同的内容。

回答你的问题:

从该输出来看,似乎同一个端口既充当客户端,又充当服务器。

不。一个端口是客户端,另一个是服务器。注意 - 它才不是

 TCP    127.0.0.1:55486        127.0.0.1:55486        ESTABLISHED     5808

它说:

 TCP    127.0.0.1:55486        127.0.0.1:55487        ESTABLISHED     5808
 TCP    127.0.0.1:55487        127.0.0.1:55486        ESTABLISHED     5808

这确实有道理。

相关内容