websocket基本原理

  • HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起
    • 因此过去的服务端推送信息是通过客户端不停的轮询实现的
  • websocket是双向通信协议,提供了服务端主动推送信息的能力
  • Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而无状态的HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)
  • 默认端口也是 80 和 443
  • 需要客户端(浏览器)和服务端同时支持
  • 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接
    • 因此WS为了保证连接不被断掉,会发心跳
  • WebSocket连接建立后,后续数据都以帧序列的形式传输
    • HTTP只负责建立WebSocket连接
    • 后续不需要发送 HTTP header就能交换数据
      • 提高了信息交换效率

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-orBOqaVO-1578405029023)(/Users/wuwentao/Library/Application Support/typora-user-images/image-20200107213754408.png)]

  • Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手
    • Sec-WebSocket-Key是一个浏览器生成的Base64的值,用于验证服务端有效性
    • Sec-WebSocket-Accept是服务器确认并加密后的Sec-WebSocket-Key
      • Sec-WebSocket-Key258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接
      • 通过SHA1计算出摘要,并转成base64字符串。
  • http请求完成后响应的状态码为101,表示切换了协议
    • 说明WebSocket协议通过http协议来建立运输层的TCP连接,之后便与http协议无关了
// 客户端请求
GET ws://example.com/ HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

// 服务器应答
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
发布了161 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/103882450
今日推荐