8

我正在尝试了解有关 websocket 及其内部实现的更多信息。但仍然无法理解一些事情。我尝试使用谷歌搜索以获得深入的解释,但其中大多数只是提供高级概述。以下是我的疑惑

1.根据我的阅读,web socket服务器(C#/C++实现)默认使用80端口。虽然我们可以使用任何端口,但我们最好使用80端口,因为我们不会有任何防火墙问题。如果是这样,我们应该如何在同一个端口(80)上同时运行 Web 服务器和 Web 套接字服务器?

2.假设 web socket 服务器运行在 81 端口,webserver 运行在 80 端口。

  1. 所以当浏览器发出初始握手 HTTP 请求 (Upgrade: websocket) 时,这个请求会发送到 81 端口。对吧?如果是这样,这个请求(见下文)与 HTTP 协议没有任何关系。但是我们仍然使用 HTTP 协议头。为什么?

           GET /mychat HTTP/1.1
           Host: server.example.com
           Upgrade: websocket
           Connection: Upgrade
           Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
           Sec-WebSocket-Protocol: chat
           Sec-WebSocket-Version: 13
           Origin: http://example.com
    
  2. 为什么他们使用当前在大多数浏览器中实现的相同 websocket 接口来发出与给定端口的直接 TCP/IP 连接,而没有任何 HTTP 内容?

3. 从客户端/服务器发送/接收的数据是否有任何数据包大小限制或数据/缓冲区限制?如果是这样,我们是否需要将数据框起来并自己处理?

4. websocket 服务器是否总是需要一个单独的服务/进程?将来网络服务器(IIS、apache)是否会支持在其进程空间内托管网络套接字服务器?

4

1 回答 1

3
  1. 通过使用与 HTTP 兼容的握手,您可以将 WebSocket 处理程序集成到您的 Web 服务器中,或者只是让 Web 服务器将 WebSocket 连接转发到专用的 WebSocket 服务器。

  2. WebSocket 握手使用与 HTTP 兼容的握手,以允许在同一端口上轻松处理两种协议,并允许现有防火墙配置更轻松地支持 WebSocket 流量。此外,在 HTTP 请求的上下文中很好地防止跨端脚本攻击,因此 WebSocket 充分利用了这些知识。即使在建立连接之后,WebSocket也不是原始套接字连接。它是一个基于消息的协议,因此需要成帧。此外,当从客户端(浏览器)发送到服务器时,框架会被屏蔽,以减轻对行为不端的代理/缓存/中介的理论漏洞的担忧。

  3. 协议本身对消息大小没有限制。一条消息可以分成多个帧。帧大小有协议限制,但它是 2^64 字节。实际的帧大小限制会更小,具体取决于客户端/服务器实现。如果您要发送数兆字节的单条消息,您可能会考虑更改应用程序以使用更小的消息来最大化跨浏览器和跨服务器支持。

  4. WebSocket 处理绝对可以集成到 Web 服务器中,这在很大程度上是工作组设想的场景。例如,考虑pywebsocket,它旨在独立运行或作为 Apache 中的 mod_python 模块运行。作为另一个示例,ASP.NET 4.5 和 IIS 8 将内置对 WebSockets 的支持

于 2012-08-01T18:16:30.790 回答