HTTP Upgrade头请求服务器将应用层协议从HTTP切换到WebSocket协议。
客户端握手在IE10和服务器之间建立了一个HTTP-on-TCP连接。服务器返回其101响应后,应用层协议从HTTP切换到使用先前建立的TCP连接的WebSockets。
此时HTTP完全不再起作用。使用轻量级WebSocket线路协议,任何一端点现在都可以随时发送或接收消息。
所以,我的理解是,在第一个客户端完成与服务器的握手后,服务器的80端口将被WebSocket协议垄断。而HTTP不再在80端口上工作。
那么第二个客户端如何与服务器交换握手呢?毕竟WebSocket握手是以HTTP格式进行的。
ADD 1
感谢迄今为止提供的所有答案。它们非常有帮助。
现在我明白了,同一服务器的80端口由多个TCP连接共享。这种共享完全没有问题,因为如Jan-Philip Gehrcke
所指出的那样,TCP
连接由5元组标识。
我想补充一些想法。
WebSocket
和HTTP
都只是应用层协议。通常它们都依赖于TCP
协议作为传输协议。
为什么选择80端口?
WebSocket
的设计有意选择服务器的80端口进行握手和随后的通信。我认为设计者希望WebSocket通信从传输层的角度看起来像普通的HTTP通信(即服务器端口号仍为80)。但根据jfriend00
的回答,这个技巧并不总是能愚弄网络基础设施。
协议是如何从HTTP转换到WebSocket的?
来自RFC 6455 - WebSocket协议
基本上,它旨在尽可能接近于仅向脚本公开原始TCP,考虑到Web的限制。 它还以这样的方式设计,使得其服务器可以与HTTP服务器共享端口,通过其握手成为有效的HTTP升级请求。 概念上,可以使用其他协议来建立客户端-服务器消息传递,但WebSocket的目的是提供一个相对简单的协议,可与HTTP和已部署的HTTP基础设施(例如代理)共存,并且尽可能接近TCP,考虑到安全性问题,在目标添加方面以简化使用并使简单的事情保持简单(例如添加消息语义)。
所以我认为以下陈述是错误的:
握手请求模仿HTTP请求,但随后的通信不同。握手请求到达服务器的80端口。因为它是80端口,服务器会将其视为HTTP协议。这就是为什么WebSocket握手请求必须采用HTTP格式的原因。如果是这样,我认为HTTP协议必须被修改/扩展以识别那些特定于WebSocket的事物。否则,它将无法意识到应该让步于WebSocket协议。我认为应该这样理解:WebSocket通信始于客户端向服务器发送有效的HTTP请求。因此,服务器遵循HTTP协议解析握手请求并确定协议更改的开始。服务器切换协议。因此,HTTP协议不需要更改。HTTP协议甚至不需要了解WebSocket。
WebSocket和Comet
WebSocket与Comet技术不同的地方在于,WebSocket不仅局限于当前的HTTP领域来解决双向通信问题。
ADD 2
一个相关的问题:浏览器如何与80端口上的Web服务器建立连接?细节?