需要HTTP / 1.1 426升级

时间:2017-02-19 06:47:13

标签: http websocket terminal server upgrade

当尝试连接到localhost(使用终端)时,我得到了这个答案:

  

HTTP / 1.1 426升级要求
  服务器:WebSocket ++ / 0.3.0-alpha4

如何回复升级?

1 个答案:

答案 0 :(得分:5)

您显然是连接到WebSocket服务器,而不是普通的HTTP服务器

  

服务器: WebSocket ++ / 0.3.0-alpha4

WebSocket protocol以基于HTTP的请求/响应握手开始,客户端要求服务器将通信升级为全双工WebSocket消息传递。

426响应意味着初始握手未请求正确的WebSocket升级。每RFC 6455 Section 4.1 Client Requirements

  

一旦建立了与服务器的连接(包括通过代理或通过TLS加密隧道的连接),客户端必须向服务器发送一个打开的握手。握手包括HTTP升级请求,以及必需和可选标头字段的列表。握手的要求如下:

     
      
  1. 握手必须是[RFC2616]指定的有效HTTP请求。

  2.   
  3. 请求的方法必须是GET,HTTP版本必须至少为1.1。

         

    例如,如果WebSocket URI为&#34; ws://example.com/chat" ;,则发送的第一行应为&#34; GET / chat HTTP / 1.1&#34;。< / p>

  4.   
  5. &#34; Request-URI&#34;请求的一部分必须匹配第3节中定义的/ resource name /(相对URI),或者是绝对的http / https URI,在解析时,它具有匹配的/ resource name /,/ host /和/ port /相应的ws / wss URI。

  6.   
  7. 请求必须包含| Host |标题字段,其值包含/ host / plus可选&#34;:&#34;后跟/ port /(不使用默认端口时)。

  8.   
  9. 请求必须包含| Upgrade |标题字段,其值必须包含&#34; websocket&#34;关键字。

  10.   
  11. 请求必须包含| Connection |标题字段,其值必须包括&#34;升级&#34;令牌。

  12.   
  13. 请求必须包含名称为| Sec-WebSocket-Key |的头字段。此标头字段的值必须是由随机选择的16字节值组成的随机数,该值已经过base64编码(参见[RFC4648]的第4节)。必须为每个连接随机选择随机数。

         

    注意:例如,如果随机选择的值是字节序列0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10,则头字段的值将为&#34; AQIDBAUGBwgJCgsMDQ4PEC = =&#34;

  14.   
  15. 请求必须包含名称为| Origin |的头字段[RFC6454]如果请求来自浏览器客户端。如果连接来自非浏览器客户端,则该请求可以包括此头字段,如果该客户端的语义与此处描述的浏览器客户端的用例匹配。此标头字段的值是上下文源的ASCII序列化,其中运行建立连接的代码。有关如何构造此标头字段值的详细信息,请参阅[RFC6454]。

         

    例如,如果从www.example.com下载的代码尝试建立与ww2.example.com的连接,则标题字段的值将为&#34; http://www.example.com&#34;。

  16.   
  17. 请求必须包含名称为| Sec-WebSocket-Version |的头字段。此标题字段的值必须为13。

         

    注意:尽管发布了本文档的草稿版本(-09,-10,-11和-12)(它们主要包括编辑更改和说明,而不是对线路协议的更改),但值9,10 ,11和12未用作Sec-WebSocket-Version的有效值。这些值在IANA注册表中保留,但未使用和不会使用。

  18.   
  19. 请求可以包含名称为| Sec-WebSocket-Protocol |的头字段。如果存在,则该值表示客户希望说出的一个或多个以逗号分隔的子协议,按优先顺序排序。包含此值的元素必须是非空字符串,其字符在U + 0021到U + 007E范围内,不包括[RFC2616]中定义的分隔符,并且必须都是唯一字符串。此标头字段值的ABNF是1#标记,其中构造和规则的定义如[RFC2616]中所述。

  20.   
  21. 请求可以包含名称为| Sec-WebSocket-Extensions |的头字段。如果存在,则该值指示客户端希望发言的协议级扩展。第9.1节描述了此标题字段的解释和格式。

  22.   
  23. 请求可以包含任何其他标头字段,例如,cookies [RFC6265]和/或与认证相关的标头字段,例如| Authorization |标题字段[RFC2616],根据定义它们的文档进行处理。

  24.         

    一旦发送了客户端的打开握手,客户端必须等待服务器的响应,然后再发送任何其他数据。

         

    客户端必须按如下方式验证服务器的响应:

         
        
    1. 如果从服务器收到的状态代码不是101,则客户端会根据HTTP [RFC2616]过程处理响应。特别是,如果客户端收到401状态代码,则可能会执行身份验证;服务器可能使用3xx状态代码重定向客户端(但客户端不需要遵循它们)等。否则,请按以下步骤操作。

    2.   
    3. 如果响应缺少|升级|标题字段或|升级| header字段包含的值不是对值&#34; websocket&#34;的ASCII不区分大小写的匹配,客户端必须使WebSocket连接失败

    4.   
    5. 如果响应缺少|连接|标题字段或|连接|标题字段不包含对值&#34;升级&#34;的ASCII不区分大小写的标记,客户端必须使WebSocket连接失败

      < / LI>   
    6. 如果响应缺少| Sec-WebSocket-Accept |标题字段或| Sec-WebSocket-Accept |包含除Sec-WebSocket-Key |的串联的base64编码的SHA-1之外的值(作为字符串,不是base64解码的)字符串&#34; 258EAFA5-E914-47DA-95CA-C5AB0DC85B11&#34;但忽略任何前导和尾随空格,客户端必须使WebSocket连接失败

    7.   
    8. 如果响应包含| Sec-WebSocket-Extensions |标题字段和此标题字段表示使用客户端握手中不存在的扩展名(服务器已指示客户端未请求的扩展名),客户端必须使WebSocket连接失败。 (解析此标头字段以确定请求哪些扩展名将在第9.1节中讨论。)

    9.   
    10. 如果响应包含| Sec-WebSocket-Protocol |头字段和此头字段指示使用客户端握手中不存在的子协议(服务器已指示客户端未请求的子协议),客户端必须使WebSocket连接失败

    11.         

      如果服务器的响应不符合本节和4.2.2节中定义的服务器握手的要求,则客户端必须使WebSocket连接失败

           

      请注意,根据[RFC2616],所有标题字段名称都在   HTTP请求和HTTP响应都不区分大小写。

           

      如果服务器的响应按照上面的规定进行了验证,则说 WebSocket连接已建立并且WebSocket连接处于OPEN状态。