一个端口上的多个连接

Posted

技术标签:

【中文标题】一个端口上的多个连接【英文标题】:multiple connections on one port 【发布时间】:2011-12-08 01:58:12 【问题描述】:

我使用 pidgin、A、B 和 C 运行多个 bonjour 客户端。 当 B 和 C 与 A 交谈时,我发现 A 使用相同的端口(通过 wireshark 我可以看到数据包)进行 MDNS 和通信, 但是 B 和 C 各有两个不同的端口,一个用于 MDNS,一个用于套接字连接。 A 是如何工作的,为什么它只能与一个端口一起工作?一个端口如何提供多个连接? 注意:如果它是多线程的,那么当它接受一个连接时,它会创建一个带有另一个空闲端口的新套接字,但是我看到了来自wireshark的数据包,客户端A确实使用相同的端口进行通信和MDNS。

【问题讨论】:

【参考方案1】:

一个 TCP 连接实际上是由元组标识的:(source_address, source_port,destination_address,destination_port)。因此,只要其中一个不同,就没有问题。

实际上,当程序侦听给定端口中的连接时,您所说的就会发生:任何新连接都是使用相同的服务器端口(但不同的客户端端口或地址)创建的。

例如,在我的 Linux 机器上,我有一个 Web 服务器在端口 80 上侦听:

$ telnet localhost 80 &
$ telnet localhost 80 &
$ lsof -n -i TCP
...
TCP 127.0.0.1:45601->127.0.0.1:80
TCP 127.0.0.1:45602->127.0.0.1:80

【讨论】:

谢谢,但是当我尝试使用端口 5298 通过 java 套接字连接到同一台机器上的其他几个端口时,出现“地址已在使用中”的异常?你说如果元组中有任何元素发生变化,应该没问题,怎么会发生这种情况?然后我尝试了另一个指定的本地端口 5555,我得到“连接被拒绝”?我们不能指定本地端口吗?或者我应该在创建套接字之前对本地指定端口做些什么?我试图在 IPTABLE 中启用这个端口,但它不起作用! 好吧,我说过,如果元组中的任何元素发生变化,对于 TCP 协议来说是可以的。但是套接字 API 有额外的限制:你不能多次绑定到同一个本地地址/端口(除非你设置了 SO_REUSEADDR 选项,但这还有其他更微妙的影响)。因此“地址已在使用”错误。当您尝试连接到目标地址/端口并且该端口没有任何监听时,会发生“连接被拒绝”错误。 非常感谢您的回答!实际上我解决了这个问题,因为我不知道 MDNS 使用默认端口 5353,并且我为此配置了一个错误的端口用于套接字。所以现在它工作得很好!再次感谢您的热情回答!

以上是关于一个端口上的多个连接的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7:支持一个端口上的多个连接的流式 HTTP 服务器

跨 TCP 443 连接的 Amazon ELB 会话粘性?

LTM_本地流量管理

具有不同端口的同一服务器上的 2 个连接 mbedtls

一个端口可以接收多个不同的 tcp 连接吗? [复制]

多个客户端如何同时连接到服务器上的一个端口,比如80?(译)