http header 怎么判断协议是不是 websocket

368次阅读  |  发布于3年以前

引言

首先,解答本题, http 通过判断 header 中是否包含 Connection: UpgradeUpgrade: websocket 来判断当前协议是否要升级到 websocket ,下面我们了解一下 WebSocket 协议与由来

WebSocket 由来

WebSocket 之前,如果需要在客户端和服务之间双向通信,需要通过 HTTP 轮询来实现, HTTP 轮询分为轮询与长轮询:

其中,轮询是指浏览器通过 JavaScript 启动一个定时器,然后以固定的间隔给服务器发请求,询问服务器有没有新消息,缺点:

长轮询是指浏览器发送一个请求时,服务器先拖一段时间,等到有消息了再回复。这个机制暂时地解决了实时性问题,但是它带来了新的问题:

因此,HTML5 新增了 WebSocket 协议,能够在浏览器和服务器之间建立一个不受限的双向通信的通道。

为什么WebSocket连接可以实现全双工通信而HTTP连接不行呢?

实际上HTTP协议是建立在TCP协议之上的,TCP协议本身就实现了全双工通信,但是HTTP协议的请求-应答机制限制了全双工通信。WebSocket连接建立以后,其实只是简单规定了一下:接下来,咱们通信就不使用HTTP协议了,直接互相发数据吧。

WebSocket 的优点:

WebSocket 协议

WebSocket 使用 wswss 的统一资源标志符(URI),其中 wss 表示使用了 TLS 的 WebSocket。

ws:// 数据不是加密的,对于任何中间人来说其数据都是可见的。

wss:// 是基于 TLS 的 WebSocket,类似于 HTTPS 是基于 TLS 的 HTTP),传输安全层在发送方对数据进行了加密,在接收方进行解密

http 通过判断 header 中是否包含 Connection: UpgradeUpgrade: websocket 来判断当前是否需要升级到 websocket 协议,除此之外,还有其它 header:

当服务器同意进行 WebSocket 连接时,返回响应码 101

测试地址:https://www.websocket.org/echo.html

一旦 socket 被建立,我们就应该监听 socket 上的事件。一共有 4 个事件:

如果我们想发送消息,可以使用 socket.send(data)

let socket = new WebSocket("wss://echo.websocket.org")

socket.onopen = function(e) {
  console.log("[open] Connection established")
  // 发送消息
  socket.send("My name is an")
}

socket.onmessage = function(event) {
  console.log(`[message] Data received from server: ${event.data}`)
}

socket.onclose = function(event) {
  // ...
}

socket.onerror = function(error) {
  console.log(`[error] ${error.message}`)
}

总结

WebSocket 使用 wswss 的统一资源标志符,通过判断 header 中是否包含 Connection: UpgradeUpgrade: websocket 来判断当前是否需要升级到 websocket 协议,除此之外,它还包含 Sec-WebSocket-KeySec-WebSocket-Version 等header,当服务器同意 WebSocket 连接时,返回响应码 101 ,它的 API 很简单。

方法:

事件:

参考:

WebSocket:https://www.liaoxuefeng.com/wiki/1022910821149312/1103303693824096

WebSocket:https://zh.javascript.info/websocket

你不知道的 WebSocket:https://juejin.cn/post/6854573221241421838

来自:https://github.com/Advanced-Frontend/Daily-Interview-Question

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8