根据 给你:
HTTP Upgrade 头请求服务器 < strong > < em > 切换 从 HTTP 到 WebSocket 协议 的应用层协议。
客户端握手在 IE10之间建立了 HTTP-on-TCP 连接 在服务器返回其101响应之后, 应用层协议从 HTTP 切换到使用 先前建立的 TCP 连接。
此时 HTTP 完全不在图片 中 轻量级 WebSocket 连线协议,现在可以发送消息或 任何一个端点在任何时候接收。
因此,我的理解是,在第一个客户机完成与服务器的握手之后,服务器的80端口将按照 WebSocket 协议为 被垄断了。还有 HTTP 不再在80端口上工作。
因此,第二个客户端如何与服务器交换握手
谢谢到目前为止所有的答案。它们真的很有帮助。
现在我明白了,同一台服务器的80端口是通过多个 TCP
连接的 共享。这种共享完全没问题,因为 TCP
连接是由一个5元素元组标识的,Jan-Philip Gehrcke
指出了这一点。
我想补充一些想法。
WebSocket
和 HTTP
都只是应用层协议,通常是这样都依赖于 TCP
协议作为传输协议。
WebSocket 设计有意为 握手和随后的交流选择服务器端口80。我认为设计者希望使 WebSocket 通信 看起来像普通的 HTTP 通信 从传输级的角度来看(即服务器端口号仍然是80) 。但是根据 jfriend00
的回答,这个技巧并不总是能骗过网络基础设施。
来自 RFC 6455-WebSocket 协议
基本上,它的目的是接近于将原始 TCP 暴露给 考虑到网络的限制,这个脚本是可行的 设计成其服务器可以与 HTTP 共享一个端口 服务器,通过它的握手是一个有效的 HTTP 升级请求 可以在概念上使用其他协议来建立客户机-服务器 消息传递,但 WebSocket 的目的是提供一个相对 可以与 HTTP 和部署的 HTTP 共存的简单协议 基础设施(例如代理) ,并且尽可能接近 TCP 考虑到安全因素,使用这些基础设施是安全的, 有针对性的添加,以简化使用和保持简单的东西 简单(例如添加消息语义)。
因此,我认为我的以下观点是错误的:
握手请求 模仿 HTTP 请求但通信 握手请求到达端口80上的服务器。 因为它是80端口,服务器将使用 HTTP 协议处理它。这就是 WebSocket 握手请求必须采用 HTTP 格式的原因。 如果是这样,我认为应该修改/扩展 HTTP 协议 必须的 认识到这些 WebSocket 特有的东西。否则它不会意识到 它应该 收到 WebSocket 协议。
我认为应该这样理解:
WebSocket 通信从一个 有效 HTTP 请求开始 客户端到服务器,所以服务器遵循 HTTP 协议 解析握手请求和 确认身份请求 协议改变。是服务器在改变协议。所以 HTTP 协议不需要改变,HTTP 协议甚至不需要 了解 WebSocket。
所以 WebSocket 与 彗星技术的不同之处在于 WebSocket 没有将自己限制在当前 HTTP 领域内来解决双向通信问题。
一个相关的问题: 浏览器如何在80端口与网络服务器建立连接? 详细信息?