WebSocket处于应用层,也是基于TCP(3次握手【最少3次能保证双方都服务正常】)实现的。
TCP长连接流程:
client向server发起连接,server接受client连接。双方建立连接,Client与server完成一次读写之后,它们之间的连接并不会主动关闭,用心跳保活。
后续的读写操作会继续使用这个连接。
WebSocket就是基于TCP连接建立通讯的。
一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端或Server端中断连接前,不需要客户端和服务端重新发起连接请求。
发起握手:
每个WebSocket连接都始于一个HTTP请求。
具体来说,WebSocket协议在第一次握手连接时,通过HTTP协议在传送数据,但是比普通HTTP请求相比多了一些字段。
客户端:
GET /chat HTTP/1.1 Upgrade: websocket //转换的是websocket协议 Connection: Upgrade //本次通信协议升级 Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== //一个Base64 encode
的值,这个是浏览器随机生成的
Sec-WebSocket-Protocol: chat, superchat//个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
Sec-WebSocket-Version: 13 //websocket协议版本
服务器:
HTTP/1.1 101 Switching Protocols //101 协议经过了转换并握手成功建立起了通信。
Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
websocket连接后,只要客户端和服务器端任意一端不主动断开连接前,通信行为都是在一个持久连接上发起,后续数据与请求都通过帧序列的形式进行传输。
建立连接后,websocket 有一个代理会和每个客户端建立连接【所以服务端可以给客户端推送消息】,直到客户端需要资源时才调用他的处理资源的线程。