我发现这个 netstat 输出有些奇怪。该输出是使用netstat -a -n -o -p TCP
win 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。但是端口是如何配对的呢?两个端口中55486
哪55487
一个是服务器端口,哪一个是客户端端口?
据我所知,local-address
列表示 TCP 连接的客户端,foreign-adress
列表示服务器端。从此输出来看,似乎同一端口同时充当客户端和服务器。
我不明白 TCP 怎么能实现这一点?
答案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
这确实有道理。