c# - Websocket 连接设置

标签 c# javascript sockets tcp websocket

我正在尝试了解更多关于 websocket 及其内部实现的信息。但是还是有些东西看不懂。我试着用谷歌搜索来获得深入的解释,但其中大部分只是给出了高层次的概述。以下是我的疑惑

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

2. 假设网络套接字服务器在端口 81 上运行,网络服务器在端口 80 上运行。

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

           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 接口(interface)来发出与给定端口的直接 TCP/IP 连接,而不使用任何 HTTP 内容?

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

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

最佳答案

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

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

  3. 协议(protocol)本身对消息大小没有限制。一条消息可以拆分成多个帧。帧大小有协议(protocol)限制,但为 2^64 字节。根据客户端/服务器的实现,实际的帧大小限制会更小。如果您有数兆字节的单条消息要发送,您可能会考虑更改您的应用程序以使用较小的消息以最大限度地提高跨浏览器和跨服务器支持。

  4. WebSocket 处理绝对可以集成到 Web 服务器中,这正是工作组设想的场景。例如,考虑 pywebsocket它旨在独立运行或作为 Apache 中的 mod_python 模块运行。再举一个例子,ASP.NET 4.5 and IIS 8 will have built-in support for WebSockets .

关于c# - Websocket 连接设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11764391/

相关文章:

C# 内存模型和非 volatile 变量在其他线程创建之前初始化

c# - 如何从 C# 中的打印机删除访问控制条目?

c# - 更改了 Parallel.ForEach 行为?

c# - 锁定行为 Task.WaitAny 与 Task.Result

javascript - 在 Chrome 控制台的列表中显示所有对象方法?

javascript - http.get 上的 "socket hang up"

javascript - setTimeout困惑

javascript - 如何在 JavaScript 中将 {"name":"myName","value":"myValue"} 对象的数组转换为 "myName":"myValue"对的对象?

C套接字关闭检测

java - 无法连接到 SMTP 主机 : outlook. office365.com,端口 : 587; nested exception is: java.net.SocketException:权限被拒绝:连接