端口指的是服务器上的一个程序。
当我们说“共享一个端口”时,实际上是指“由同一个在该端口上监听的程序处理请求”。
WebSocket握手过程类似于HTTP格式,因此能够被处理HTTP协议的服务器程序理解。因此,将握手请求发送到端口80是可以的。
但是,握手之后,WebSocket数据格式与HTTP格式完全不同,它怎么还能被发送到端口80呢?例如通过以下URL:
ws://somehost:80/chat
这是如何实现的?
我的猜测是:
HTTP程序看到端口80上的传入请求“不能被处理为HTTP”,然后将其传递给WebSocket程序进行处理。如果有其他想要共享端口80的协议,比如WebSocket2,HTTP程序怎么知道要传递哪个协议,如果没有一种方式来识别正在使用的协议。
根据 jfriend00
的回复,我画了以下的图示:
因此,在同一浏览器中的 WebSocket 和 HTTP 流量实际上是通过 不同
的 socket 连接进行的。尽管它们都是从连接到服务器的 80 端口开始。
我认为,如果单词 WebSocket 中没有包含 socket,那么将其理解为 TCP 协议上的另一种应用级协议会更容易。
添加 2
根据 jfriend00
的进一步评论,我将上述图表改进为以下形式。我想展示的是在浏览器中 WebSocket 通信和 HTTP 通信与同一服务器 共存
的方式。
添加3
阅读完本主题后,我想起当服务器接受连接时,服务器端口不会改变:当TCP连接被服务器接受时,端口是否会改变?
因此,图表应该是这样的:
HTTP的TCP连接和WebSocket的TCP连接应该使用不同的客户端端口
。
WebSocket
通信如何与HTTP
通信共存。当我建立一个WebSocket连接时,我通常使用与访问网页相同的端口的URL,例如ws://myserver:80
(我的图表中的步骤(1)
)。然后服务器为实际通信创建另一个专用套接字(步骤(2)
)。根据是否存在upgrade
头,此新套接字将会使用WebSocket或不使用。随后的通信将相应地进行(步骤(3)
)。 - smwikipedia