描述WebSocket的建立连接过程。

WebSocket 是一个为网络应用提供全双工通信信道的协议,它是在单个长期连接上进行实时数据传输的技术。WebSocket 使得客户端和服务器之间的信息交换变得更简单,允许服务端主动向客户端推送数据。WebSocket 在建立连接时使用了类似于 HTTP 的握手机制,以下是详终的连接建立过程:

  1. 客户端请求握手: 客户端发起连接请求,从 HTTP 协议切换到 WebSocket 协议。这是通过发送一个 HTTP 请求来完成的,该请求包括特定的头部信息。这个请求称为握手请求(Handshake Request)。一个典型的 WebSocket 握手请求如下所示:

    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13
    Origin: http://example.com
    

    在这个请求中,关键的头部字段包括:

    • Upgrade: websocket:这告诉服务器客户端希望将协议从 HTTP 升级到 WebSocket。
    • Connection: Upgrade:这指示服务器连接的性质将改变。
    • Sec-WebSocket-Key:这是一个 Base64 编码的值,服务器将用它来构造一个响应,用于确认握手。
    • Sec-WebSocket-Protocol:这是一个可选的头部,指示 WebSocket 子协议,如果服务器支持,可以选择其中一个使用。
    • Sec-WebSocket-Version:指示 WebSocket 协议的版本,当前标准是 13。
    • Origin:这是一个防止跨站点请求伪造的安全措施。
  2. 服务器响应: 如果服务器接受客户端的请求,它会发送一个 HTTP 响应来完成握手。这个响应将确认协议的切换,并包括一个由客户端发送的 Sec-WebSocket-Key 生成的 Sec-WebSocket-Accept 键。响应看起来像这样:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
    Sec-WebSocket-Protocol: chat
    

    关键的响应头部字段包括:

    • HTTP/1.1 101 Switching Protocols:这表示服务器理解了客户端的请求,并同意切换协议。
    • Sec-WebSocket-Accept:这是对客户端 Sec-WebSocket-Key 的响应,用于确认握手。它是通过将客户端的 Sec-WebSocket-Key 与一个特定的 GUID("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")连接,然后使用 SHA-1 哈希算法处理并进行 Base64 编码生成的。
    • Sec-WebSocket-Protocol:这确认服务器选择的子协议。
  3. 连接的建立: 一旦客户端验证了服务器的响应中的 Sec-WebSocket-Accept,WebSocket 连接就被认为是建立的,双方可以开始通过这个全双工连接发送和接收数据了。

这个过程涉及到的握手机制确保了客户端和服务器都同意进行协议切换,并且通过 Sec-WebSocket-Key 和 Sec-WebSocket-Accept 的验证机制提供了一定程度的安全保障。