当请求的websocket子协议不被支持/识别时,HTTP响应代码

时间:2012-11-24 20:49:12

标签: http websocket http-response-codes

将HTTP连接升级到websocket时,可以在可选的HTTP标头“Sec-WebSocket-Protocol”中提供一个或多个子协议。

如果服务器接受任何子协议,它将使用HTTP响应代码101(“HTTP / 1.1 101交换协议”)进行响应,并包含指示所选子协议的HTTP标头“Sec-WebSocket-Protocol”。

但是服务器应该如何正确处理未知/不支持的子协议?

这应该在HTTP连接中“使用一些HTTP响应代码吗?”

或者是否应该将连接升级到websocket - 并通过发送带有一些预定义websocket状态代码的“关闭框架”立即关闭服务器?

RFC6455说什么?我无法得出结论。 现有服务器实现如何处理它?<​​/ p>

此致 /每/

2 个答案:

答案 0 :(得分:4)

从RFC 6455的简要介绍,我相信WebSocket子协议是可选的并且是协商的。在4.2.2部分的“服务器要求”下:

   /subprotocol/
      Either a single value representing the subprotocol the server
      is ready to use or null.  The value chosen MUST be derived
      from the client's handshake, specifically by selecting one of
      the values from the |Sec-WebSocket-Protocol| field that the
      server is willing to use for this connection (if any).  If the
      client's handshake did not contain such a header field or if
      the server does not agree to any of the client's requested
      subprotocols, the only acceptable value is null.  The absence
      of such a field is equivalent to the null value (meaning that
      if the server does not wish to agree to one of the suggested
      subprotocols, it MUST NOT send back a |Sec-WebSocket-Protocol|
      header field in its response).  The empty string is not the
      same as the null value for these purposes and is not a legal
      value for this field.  The ABNF for the value of this header
      field is (token), where the definitions of constructs and
      rules are as given in [RFC2616].

如果服务器不同意与客户端一起使用子协议,则不应发送带有“null”以外值的子协议响应头,并且客户端有责任在此时继续或终止连接。

答案 1 :(得分:0)

WebSocket的重点是使用WebSocket从客户端到服务器运行特定协议。但是客户端和服务器需要知道协议,以便两端都知道如何处理通过的WS消息。 WS消息处理与您在TCP级别执行的操作没有什么不同。您不必使用协议字段,只有在您想要强制执行兼容性时才有意义。

对于Kaazing服务器,我们提供将位于基本websocket层之上的特定协议库。您还可以在Github上找到各种协议库。除了握手之外,其他一切都是用TCP处理它的方式。您处理websocket消息并尝试解码协议。应该使用握手中的协议字段来确保您的库实际上是匹配的协议库。因此,例如,如果我的服务器说STOMP,并且我尝试连接我的客户端并且我想说STOMP,我的STOMP库应该检查协议字段以确保它匹配。端点可以按优先顺序指示例如它可以说AMQP 0.9和AMQP 1.0,并且如果两者都可用则将选择AMQP 1.0。如果其中一个端点不说任何另一端可以说的协议,它可以返回null,从而终止连接。