同一IP和端口上有多个TCP连接

5

我有一个关于TCP的非常基础的问题。

考虑一个应用程序,比如DEST,它的IP地址是Dest IP,监听端口为6789。

现在我有两个源应用程序,它们都能够通过TCP协议向这个应用程序DEST发送消息。

假设源系统1是SRC1,源系统2是SRC2,它们的IP分别是SRC1SRC2

理想情况下,只有其中一个源系统正在运行,我可以通过在源系统上执行netstat -nao | grep 6789命令来查看SRC1SRC2DEST之间是否存在活动连接。

现在,仅仅出于好奇心,我也启动了第二个源系统,惊讶地发现在两个源系统上执行netstat命令时,都显示了与监听端口为6789的应用程序DEST存在活动的TCP连接。

SRC1SRC2服务器上netstat命令的结果:

TCP SRC1 IP:17678   DEST IP: 6789 ESTABLISHED

TCP SRC2 IP:51298   DEST IP: 6789 ESTABLISHED

我以为只有一个TCP连接可以与位于IP地址为DEST1和端口6789的DEST应用程序进行通信(DEST服务器IP:6789只能有一个活动TCP连接)。


2
你怎么会这么想呢?! - David Schwartz
3个回答

10
如果您所想的是真的,Web服务器将无法工作。 Web服务器基本上在两个端口上监听:80用于HTTP,443用于HTTPS。 Web服务器通常同时连接许多客户端。
应用程序可以通过一个端口进行多个连接。它可以通过连接主机的源/端口组合来区分这些连接。事实上,如果应用程序支持,每个源主机都可以在同一目标端口上拥有多个端口(地址实际上是地址和端口的组合)。

9

TCP连接由4个元素组成:本地IP、本地端口、远程IP和远程端口。请注意,我没有说源和目的地,因为一旦建立连接,就没有区别了。

在您提供的示例中,两个连接有一个IP和端口是相同的,但另一个IP和端口不同。

这与TCP监听套接字不同,后者只由本地IP和端口定义。这意味着在给定端口上只能有一个套接字监听新连接。一旦建立连接,您将得到一个由上述4个元素定义的新套接字,尽管所有从给定监听套接字发起的连接将具有相同的本地IP和端口,但远程IP和/或端口将不同。


如果源/目的IP和端口相同怎么办?举个例子,浏览器中打开多个选项卡从同一服务器获取数据。 - Saad
1
@Saad 他们不可能都是一样的。在这种情况下,您将拥有多个具有相同源和目标IP的套接字,服务器端口将相同,但每个客户端端口将不同。 - dbush
那么如果正在管理UDP,仍然需要在某种相同的情况下使用不同的套接字吗? - Saad
@Saad UDP是不同的。UDP套接字只有本地端口和IP,因为没有连接。 - dbush
它是在发送方还是接收方? - Saad

0
一个服务器在端口上监听新的连接请求。一旦有请求,它就接受连接并使用一个新建立的端口连接到远程客户端。实际通信是在这两个端口之间进行的,而监听端口仍然保持轮询新的连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接