我正在编写一个库,它将使用Websockets在不同的进程(以及以不同语言运行的进程,甚至可能在不同的机器上)之间进行通信。我想避免与可能已在计算机上运行的现有服务器发生端口冲突。我学到了一些关于短暂端口的知识,我猜测我可以使用短暂的端口和Websockets来避免端口冲突。
但是,我在查找是否可行的信息时遇到了很多麻烦。为了使这个值得,我需要Python,Go,Java和Node.js中的Websocket实现,它可以处理短暂的端口。我熟悉的唯一Websocket实现是JavaScript世界中的Socket.io。
我的问题是:
答案 0 :(得分:2)
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,尽管您不太可能在自己的服务器上找到许多这些进程。