为什么WebSocket可以在握手后与HTTP共享80端口"?

时间:2015-11-11 03:59:16

标签: html5 http websocket

据我所知:

  • 端口指定服务器上的程序。
  • 当我们说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程序如何知道要传递哪个协议。

ADD 1

根据jfriend00的回复,我绘制了下图:

因此,同一浏览器中的WebSocket和HTTP流量实际上是通过different套接字连接实现的。虽然他们都是从连接到服务器端口80开始的。

我认为如果 WebSocket 这个词中没有 socket ,那么将它更容易理解为TCP协议上的另一个应用程序级协议

enter image description here

ADD 2

我根据jfriend00的进一步评论将上面的图表改进为以下内容。 我想要展示的是WebSocket如何与浏览器中的同一服务器coexist进行通信和HTTP通信。

enter image description here

ADD 3

在阅读此主题后,我回忆起当服务器接受连接时服务器端口没有改变:Does the port change when a TCP connection is accepted by a server?

所以图表应该是这样的:

HTTP的TCP连接和WebSocket的TCP连接应该使用不同的client port

enter image description here

1 个答案:

答案 0 :(得分:9)

当服务器侦听给定端口时,它正在侦听传入连接。当新的传入连接到达时,它将被赋予自己的套接字以进行运行。该套接字提供两个端点之间的连接。从那时起,该套接字完全独立于可能还连接的所有其他套接字运行。

因此,一个传入的http请求可以指定“upgrade”标头并升级到webSocket,然后两端同意从此开始讨论webSocket协议。同时,没有该升级头的其他传入http请求仅被视为普通的http请求。

如果您不太了解webSocket协议的工作原理,您可以全面了解它如何连接here

以下是主要步骤:

  1. 请求webSocket连接的客户端在端口80上向服务器发送HTTP请求。
  2. 该HTTP请求是完全合法的HTTP请求,但它上面包含一个标头Upgrade: websocket
  3. 如果服务器支持webSocket协议,则它会使用包含标头Connection: Upgrade的101状态代码的合法HTTP响应进行响应。
  4. 此时,双方然后将协议切换到webSocket协议,并且该套接字上的所有未来通信都使用webSocket框架的数据格式完成。
  5. 任何其他不包含upgrade请求标头的传入HTTP请求都被视为普通的HTTP请求。

      

    HTTP程序是否看到端口80上的传入请求不能   被处理为HTTP,然后它将它传递给WebSocket程序   处理它。

    不,第一个请求是合法的HTTP请求(只有一个特殊的标头),发回的响应是合法的HTTP响应。但是,在那个响应之后,双方都将协议切换到webSocket。因此,自定义标头用于告知Web服务器此传入HTTP请求是建立webSocket连接的第一步。

      

    如果是这样,如果有其他协议想要共享端口怎么办?   80,比如说WebSocket2,HTTP程序怎么知道要通过哪个协议   如果没有办法确定正在使用的协议。

    这个upgrade机制也可以用来支持其他协议,只需指定一个不同的协议名称Upgrade: someOtherProtocol,但我不知道任何其他已经标准化的协议名称。