【问题标题】:Websockets with ephemeral ports带有临时端口的 Websocket
【发布时间】:2016-12-09 21:18:29
【问题描述】:

我正在编写一个库,它将使用 Websockets 在不同的进程(以及以不同语言运行的进程,甚至可能在不同的机器上运行的进程)之间进行通信。我想避免与可能已经在机器上运行的现有服务器发生端口冲突。我了解了一些关于临时端口的知识,并且我猜测我可以将临时端口与 Websocket 一起使用以避免端口冲突。

但是,我很难找到有关这是否可行的信息。为了让这变得有价值,我需要一个可以处理临时端口的 Python、Go、Java 和 Node.js 中的 Websocket 实现。我熟悉的唯一 Websocket 实现是 JavaScript 世界中的 Socket.io。

我的问题是:

  1. 有谁知道是否可以使用临时端口 一般的socket.io和websockets?
  2. 您能否提供代码示例或链接来说明如何完成此操作?

【问题讨论】:

  • 临时端口用于建立连接的一方。侦听套接字需要位于已知端口上,否则客户端将不知道在哪里连接。 en.wikipedia.org/wiki/Ephemeral_port 从 TCP 的角度来看,websockets 没有什么特别之处。
  • 好的,这对我很有用,我对此知之甚少
  • 所以如果我有 50 个客户端和 1 个服务器,服务器可以监听临时端口,还是客户端?
  • 服务器必须侦听客户端已知的特定端口。当连接到侦听端口时,每个客户端通常会绑定到临时端口(但也可能绑定到特定端口)。端口用于连接的两侧。
  • 一个 WebSocket 假定一个现有的主机 HTTP 服务器。因此,对于列出端口,您的问题没有多大意义。

标签: sockets websocket socket.io


【解决方案1】:

webSocket 连接基于 TCP,因此连接使用端口的方式就像 TCP。因此,您有一侧启动连接(客户端),而一侧正在侦听传入连接(服务器)。在 TCP 中,在两个 IP 地址/端口对之间建立连接。因此,您有一个 IP1/port1 连接到 IP2/port2。

客户端可以使用它想要的任何端口作为自己的端口,但它必须连接到服务器上的特定端口,那里有一个服务器进程正在侦听传入连接。您可以选择任何尚未使用的端口供服务器侦听(尽管建议使用端口范围),但客户端必须事先知道该端口,以便客户端可以连接到该端口。

因此,客户端连接到服务器正在侦听的已知端口上的服务器 IP。客户端将来自某个特定客户端端口上的客户端 IP。客户端端口通常是由底层 TCP 堆栈自动分配的临时端口。此临时端口在初始连接中与服务器通信,用于将返回客户端的网络流量引导到客户端上的相应套接字。

服务器通常不会使用临时端口,也不能使用动态分配的端口,因为这样客户端就不会知道要连接到哪个端口。

因此,执行此操作的通常方法是让正在设置服务器的人了解服务器上正在运行哪些进程以及哪些端口正在被什么使用,然后在用于服务器侦听的范围内选择一个端口不会发生冲突,然后通过客户端配置文件或仅将该端口构建到客户端中,将其传达给客户端。

如果你真的想要一个动态监听端口,你可以使用一个众所周知的服务器进程和端口(例如端口 80 上的 Web 服务器),然后制作一个 http 请求,其唯一目的是询问服务器端口是什么用于您传入的 webSocket 通信。但是,这仍然需要一个众所周知的端口号,因此它可能并没有真正节省任何东西,除非端口 80 恰好没有在计算机上使用并且您不想将它用于您的 webSocket。或者,如果您真的想对此发疯(通常是矫枉过正),您可以使用允许设备发现如何相互连接的资源发现协议之一。

在实践中,大多数人只是选择一个 2000-9999 范围内的四位端口号,不会与同一机器上的任何其他服务器冲突。

IANA 表示,临时端口的范围是 49152 到 65535,尽管一些 Linux 内核使用 32768 到 61000。

低于 1024 的端口需要超级用户权限,非标准服务器通常会避免使用。

有很长的服务器类型列表以及它们通常使用的端口号here,尽管您不太可能找到许多此类进程在您自己的服务器上运行。

【讨论】:

  • 你有一个如何使用带有 websocket 库的临时端口的例子吗?例如,告诉 socket.io 使用临时端口。显然,告诉客户最终使用哪个端口是一个挑战,但我可以弄清楚这部分。
  • 例如supertest,Node.js/JS的测试库使用临时端口,想弄清楚它是如何工作的,我猜我可以看看源代码。
猜你喜欢
  • 2015-05-31
  • 2016-12-01
  • 1970-01-01
  • 2017-07-24
  • 2019-12-08
  • 1970-01-01
  • 2012-06-21
  • 2017-12-07
相关资源
最近更新 更多