Shall I use WebSocket on ports other than 80?

78

我能否在非80端口使用WebSocket?这会破坏使用现有的Web/HTTP基础设施的整个目的吗?并且我认为这不再适合在非80端口使用WebSocket的名称。

如果我在其他端口上使用WebSocket,为什么不直接使用TCP呢?或者说WebSocket协议本身具有特殊的优势吗?

由于当前WebSocket握手是以HTTP UPGRADE请求的形式进行的,这是否意味着我必须在该端口上启用HTTP协议才能完成WebSocket握手?

3个回答

96
我可以在任何主机操作系统允许且客户端被允许连接的端口上运行WebSocket服务器。但是,在80号(或443号)端口上运行它有许多优点。
1. 网络基础设施通常已经部署并在80号端口上开放,以便从客户端所在的位置(例如台式计算机、移动设备等)到服务器所在的位置(例如数据中心)进行出站连接。因此,通常不需要在防火墙或路由器配置中部署WebSockets应用程序所需的新漏洞。可能需要更改配置以在不同端口上运行。例如,许多大型公司网络非常挑剔,只允许在某些标准和预期行为上进行出站连接,可能不允许使用非标准端口的WebSocket连接。这是使用80号端口的最大原因(私有网络互操作性最大,配置已被锁定)。
2. 许多在浏览器中运行的WebSocket应用程序希望利用已在80号端口上使用的现有安全性/登录/身份验证基础设施。如果所有内容都在同一端口上,则使用完全相同的基础设施检查WebSocket连接的身份验证可能会更简单。
3. 一些用于WebSocket的服务器基础设施(例如Node.js中的Socket.io)使用组合服务器基础设施(单个进程,一个监听器)同时支持HTTP请求和WebSocket。如果两者都在同一端口上,则这更简单。
如果我在其他端口使用WebSocket,为什么不直接使用TCP?或者说WebSocket协议本身是否具有特殊优势?

最初定义的webSocket协议是用于从浏览器到服务器上的。浏览器没有通用的TCP访问,因此如果想要一个持久的套接字而没有自定义的浏览器附加组件,则提供了webSocket。与普通的TCP连接相比,webSocket协议提供了利用HTTP身份验证和cookie的能力,一种标准的应用程序级别和端对端保持活动ping/pong的方式(TCP提供跳跃级别保持活动,但不提供端对端),内置的帧协议(您必须设计自己的数据包格式在TCP中)和许多支持这些高级特性的库。基本上,webSocket在比TCP更高的级别上工作(在封面下使用TCP),并提供大多数人发现有用的更多内置功能。例如,如果使用TCP,则必须首先获取或设计协议(一种表达数据的方式),而webSocket已经内置。

既然当前的WebSocket握手是以HTTP UPGRADE请求的形式进行的,那么是不是必须在端口上启用HTTP协议才能完成WebSocket握手?

您必须在希望在其上使用webSocket的端口上运行HTTP服务器,因为所有webSocket请求都始于HTTP请求。它不必是功能强大的HTTP服务器,但它必须处理初始的HTTP请求。


1
这个答案提供了一些无效的参数。Cookie 永远不会绑定到端口,它们会发送到同一主机上的任何端口。而且 WebSockets 不受 Same-Origin-Policy 的限制,你必须在服务器端显式地检查 origin 头来防止跨域访问。 - kelunik
1
@kelunik - 已进行更正。我之前关于cookies的说法是错误的,因此我已经删除了任何与cookies有关的内容。我的跨域问题概念来自socket.io(建立在webSocket之上),因为socket.io(默认情况下)会启动几个http轮询请求,然后切换到webSocket,因此socket.io可能会遇到跨域问题。但是,由于这不仅适用于普通的webSocket,因此我已完全从答案中删除了它。 - jfriend00

10

是的-使用443端口(即HTTPS端口)代替。

如今很少有理由使用80端口(HTTP)除了将其重定向到443端口(HTTPS)之外,因为通过服务(例如LetsEncrypt)进行证书设置已经变得简单且免费。

唯一可能违反此规则的情况是本地开发和非面向互联网的服务。

我应该使用非标准端口吗?

我猜测这就是你提出问题的意图。对此,我认为这样做会增加不必要的复杂性,并且并没有明显的好处。它不会增加安全性,也不会使任何事情变得更加容易。

但这确实意味着需要针对主机和连接到您的websocket服务器制定特定的防火墙例外。这意味着从企业/学校/受限环境访问您的服务的人可能无法使用它,除非他们能够以某种方式说服管理层它是强制性的。我怀疑在这种方式下排除用户群体的好理由不多。

但是,也没有什么阻止您这样做...


4

我认为可以。 80 是默认端口,但您可以将其更改为任何您喜欢的端口。


2
那么为什么我们称它为WebSocket?因为它默认使用80端口吗?还是因为WebSocket握手请求采用HTTP格式?我有这个问题,因为我将“Web”视为“HTTP”的同义词。 - smwikipedia
9
我找到了它。从这里 https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers,它说:“握手是WebSocket中的“Web”。它是从HTTP到WS的桥梁。” - smwikipedia

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