WebSocket基础知识

1. WebSocket 是什么?

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它基于TCP/IP协议,但独立于HTTP协议。

全双工: TCP 连接的两端,同⼀时间⾥,双⽅都可以主动向对⽅发送数据。这就是所谓的全双⼯。
半双工: 现在使⽤最⼴泛的 HTTP/1.1 ,也是基于TCP协议的,同⼀时间⾥,客户端和服务器只能有⼀⽅主动发数据,这就是所谓的半双⼯。

2. 怎么建立WebSocket 连接?

浏览器在 TCP 三次握⼿建⽴连接之后,都统⼀使⽤ HTTP 协议先进⾏⼀次通信。

  • 如果此时是普通的 HTTP 请求,那后续双⽅就还是⽼样⼦继续⽤普通 HTTP 协议进⾏交互。
  • 如果这时候是想建⽴ WebSocket 连接,就会在 HTTP 请求⾥带上⼀些特殊的header 头,如下:
Connection: Upgrade
Upgrade: WebSocket
Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg==\r\n

这些 header 头的意思是,浏览器想升级协议(Connection: Upgrade),并且想升级成 WebSocket 协议(Upgrade: WebSocket)。同时带上⼀段随机⽣成的 base64 码(Sec-WebSocket-Key),发给服务器。

如果服务器正好⽀持升级成 WebSocket 协议。就会⾛ WebSocket 握⼿流程,同时根据客户端⽣成的
base64 码,⽤某个公开的算法变成另⼀段字符串,放在 HTTP 响应的 Sec-WebSocket-Accept 头⾥,同时带上 101状态码(协议转换) ,发回给浏览器。HTTP 的响应如下:

HTTP/1.1 101 Switching Protocols\r\n
Sec-WebSocket-Accept: iBJKv/ALIW2DobfoA4dmr3JHBCY=\r\n
Upgrade: WebSocket\r\n
Connection: Upgrade\r\n

之后,浏览器也⽤同样的公开算法将 base64码 转成另⼀段字符串,如果这段字符串跟服务器传回来的字符串⼀致,验证通过。
在这里插入图片描述

就这样经历了⼀来⼀回两次 HTTP 握⼿,WebSocket就建⽴完成了,后续双⽅就可以使⽤ webscoket 的数据格式进⾏通信了。
在这里插入图片描述

WebSocket和HTTP⼀样都是基于TCP的协议。经历了三次TCP握⼿之后,利⽤ HTTP 协议升级为 WebSocket 协议

WebSocket只有在建⽴连接时才⽤到了HTTP,升级完成之后就跟HTTP没有任何关系了。

WebSocket的数据格式是数据头(内含payload⻓度) + payload data 的形式,这是因为 TCP 协议本身就是全双⼯,但直接使⽤纯裸TCP去传输数据,会有粘包的"问题"。为了解决这个问题,上层协议⼀般会⽤消息头+消息体的格式去᯿新包装要发的数据。⽽消息头⾥⼀般含有消息体的⻓度,通过这个⻓度可以去截取真正的消息体。

HTTP 协议和⼤部分 RPC 协议,以及WebSocket协议,都是这样设计的。

2. WebSocket 的使用场景

WebSocket完美继承了 TCP 协议的全双⼯能⼒,它适⽤于需要服务器和客户端(浏览器)频繁交互的⼤部分场景,⽐如⽹⻚/⼩程序游戏,⽹⻚聊天室,以及⼀些类似⻜书这样的⽹⻚协同办公软件。

总结

  • TCP 协议本身是全双⼯的,但我们最常⽤的 HTTP/1.1,虽然是基于 TCP 的协议,但它是半双⼯的,对于⼤部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使⽤⽀持全双⼯的WebSocket 协议
  • 在 HTTP/1.1 ⾥,只要客户端不问,服务端就不答。基于这样的特点,对于登录⻚⾯这样的简单场
    景,可以使⽤定时轮询或者⻓轮询的⽅式实现服务器推送(comet)的效果。
  • 对于客户端和服务端之间需要频繁交互的复杂场景,⽐如⽹⻚游戏,都可以考虑使⽤ WebSocket 协议。
  • WebSocket 和 socket ⼏乎没有任何关系,只是叫法相似。
  • 正因为各个浏览器都⽀持 HTTP协 议,所以 WebSocket 会先利⽤HTTP协议加上⼀些特殊的 header头进⾏握⼿升级操作,升级成功后就跟 HTTP 没有任何关系了,之后就⽤ WebSocket 的数据格式进⾏收发数据。

来源:图解网络-小林coding

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值