据我所知:
to share a port
时,它实际上意味着to have the requests processed by the same program listening on that port
。 WebSocket握手resembles
HTTP格式,因此处理HTTP协议的服务器程序可以理解can
。因此,可以将握手请求发送到port 80
。
但是after the handshake
,WebSocket数据格式与HTTP格式完全不同,它怎么还能被发送到端口80?例如通过以下URL:
ws://somehost:80/chat
它是如何运作的?
我的猜测:
HTTP程序是否在端口80 cannot be handled as HTTP
上看到传入的请求,然后它将它传递给WebSocket程序来处理它。如果是这样,如果有一些其他协议想要共享端口80,比如WebSocket2,如果没有办法识别正在使用的协议,那么HTTP程序如何知道要传递哪个协议。
根据jfriend00
的回复,我绘制了下图:
因此,同一浏览器中的WebSocket和HTTP流量实际上是通过different
套接字连接实现的。虽然他们都是从连接到服务器端口80开始的。
我认为如果 WebSocket 这个词中没有 socket ,那么将它更容易理解为TCP协议上的另一个应用程序级协议
我根据jfriend00
的进一步评论将上面的图表改进为以下内容。
我想要展示的是WebSocket如何与浏览器中的同一服务器coexist
进行通信和HTTP通信。
在阅读此主题后,我回忆起当服务器接受连接时服务器端口没有改变:Does the port change when a TCP connection is accepted by a server?
所以图表应该是这样的:
HTTP的TCP连接和WebSocket的TCP连接应该使用不同的client port
。
答案 0 :(得分:9)
当服务器侦听给定端口时,它正在侦听传入连接。当新的传入连接到达时,它将被赋予自己的套接字以进行运行。该套接字提供两个端点之间的连接。从那时起,该套接字完全独立于可能还连接的所有其他套接字运行。
因此,一个传入的http请求可以指定“upgrade”标头并升级到webSocket,然后两端同意从此开始讨论webSocket协议。同时,没有该升级头的其他传入http请求仅被视为普通的http请求。
如果您不太了解webSocket协议的工作原理,您可以全面了解它如何连接here。
以下是主要步骤:
Upgrade: websocket
。Connection: Upgrade
的101状态代码的合法HTTP响应进行响应。任何其他不包含upgrade
请求标头的传入HTTP请求都被视为普通的HTTP请求。
HTTP程序是否看到端口80上的传入请求不能 被处理为HTTP,然后它将它传递给WebSocket程序 处理它。
不,第一个请求是合法的HTTP请求(只有一个特殊的标头),发回的响应是合法的HTTP响应。但是,在那个响应之后,双方都将协议切换到webSocket。因此,自定义标头用于告知Web服务器此传入HTTP请求是建立webSocket连接的第一步。
如果是这样,如果有其他协议想要共享端口怎么办? 80,比如说WebSocket2,HTTP程序怎么知道要通过哪个协议 如果没有办法确定正在使用的协议。
这个upgrade
机制也可以用来支持其他协议,只需指定一个不同的协议名称Upgrade: someOtherProtocol
,但我不知道任何其他已经标准化的协议名称。