客户端和服务器都使用同一端口吗?


2

我在此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

请注意这两行。本地和外部地址均为本地主机。但是端口如何配对?在两个端口中5548655487服务器端口是哪个,客户端端口是哪个?

根据我的理解,该local-address列表示TCP连接的客户端,而该foreign-adress列表示服务器端。从此输出看来,客户端服务器都具有相同的端口。

我不明白这怎么可能与TCP?

带有配对端口的netstat


什么是过程5808?
斯科特,

@ Scott,5808是javaw.exe,它托管一个码头服务器。听127.29.232.39:55484。请参见屏幕截图的倒数第二行。
好奇的2013年

Answers:


3

线: TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808

说明客户端正在使用端口55486连接到服务器的55487端口。

线: TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808

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

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

客户端连接到服务器(三向握手的第1部分)。服务器响应确认连接(第2部分)。客户端以自己的确认响应确认(第3部分)。

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


1
... 说明服务器正在从55487连接到55486端口上的客户端 ...以某种方式我错过了这一点。谢谢
好奇

没问题。很高兴我能够帮助您理解:)
falconspy 2013年

3

我现在还不太清楚您对此有多少了解,所以请允许我有点书呆子。

显然,您了解客户端和服务器的概念,因此您写到“ Local Address列表示TCP连接的客户端,而Foreign Address列表示服务器端” 使我感到惊讶。该Local Address列表示TCP连接的本地端,而该Foreign Address列表示外部(或远程)端。换句话说,该Local Address列表示计算机上的进程正在使用的(TCP)套接字(即,计算机拥有的套接字),并且Foreign Addresscolumn表示本地套接字连接到的套接字。如您所了解,计算机上的进程可以用作服务器,因此本地套接字可以是服务器套接字-然后相应的客户端套接字将列为“外部”。

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

您的情况更加令人困惑。当然,您的码头服务器(进程5808)正在创建套接字并接受其上的连接-这就是服务器所做的。但是它同时创建了许多套接字。(根据需要,它们在不同的端口号上;操作系统将不允许多个具有相同协议和端口号的套接字共存。)它似乎正在使用随机的(操作系统分配的)端口号。例如,正如您所指出的,它正在侦听端口55484。我不熟悉码头,所以我不知道那是否正常。

如果仔细检查netstat输出,您将看到本地进程184使用端口8081上的套接字连接到进程5808 /端口55482。

我觉得很奇怪的部分是,进程5808已在其中几个套接字上与其自身连接。因此,您拥有几个同时容纳两个套接字的TCP连接,不仅在同一主机上,而且在同一进程中。我认为我们无法确定哪个端是客户端,哪个端是服务器。我实际上会猜测,较低的端口号更可能是服务器,但这只是一个猜测。


我真的很感谢您的,我相信现在我的情况已经很清楚了。在进程5808连接到其自身的部分上,该进程托管一台服务器一个客户端,我应该制作两个JAR,但是打包需要一个JAR,因此我将它们都打包在一个JAR中。对于码头来说,这是不正常的,但是对于我的应用来说,却是不正常的。我希望每个连接都能看到一条线,但是看到两条时就很困惑。不幸的是,我们只能将一个标记为答案,并且只能投票一次,但是我会尽我所能。
好奇的2013年

0

这不是异常情况。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

哪个有道理。


好吧,那没有道理。但现在猜想就可以了。谢谢。
好奇的2013年

建立连接后,说客户机/服务器的概念消失了是正确的吗?我的意思是,由于现在已经建立了两个进程,所以两个进程现在同时是客户端和服务器。我还想表示,客户端/服务器概念仅在客户端连接到服务器时才开始。
typelogic

@daixtr,它不会消失。客户端/服务器模型适用,无论连接状态如何。只要服务器正在运行并准备接受来自客户端的新连接,它就会为它们提供服务。这就是为什么它被称为服务器。例如,客户端可以连接到数据库服务器,向其发送查询并接收结果。它们都在发送和接收数据,但是服务器仍然是服务器,而客户端仍然是客户端。
VL-80
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.