这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战git
三次握手(Three-way Handshake)其实就是指创建一个TCP链接时,须要客户端和服务器总共发送3个包github
主要做用就是为了确认双方的接收能力和发送能力是否正常、指定本身的初始化序列号为后面的可靠性传送作准备web
过程以下:服务器
上述每一次握手的做用以下:websocket
经过三次握手,就能肯定双方的接收和发送能力是正常的。以后就能够正常通讯了markdown
若是是两次握手,发送端能够肯定本身发送的信息能对方能收到,也能肯定对方发的包本身能收到,但接收端只能肯定对方发的包本身能收到 没法肯定本身发的包对方能收到网络
而且两次握手的话, 客户端有可能由于网络阻塞等缘由会发送多个请求报文,延时到达的请求又会与服务器创建链接,浪费掉许多服务器的资源socket
tcp
终止一个链接,须要通过四次挥手tcp
过程以下:oop
LAST_ACK
的状态服务端在收到客户端断开链接Fin
报文后,并不会当即关闭链接,而是先发送一个ACK
包先告诉客户端收到关闭链接的请求,只有当服务器的全部报文发送完毕以后,才发送FIN
报文断开链接,所以须要四次挥手
一个完整的三次握手四次挥手以下图所示:
WebSocket,是一种网络传输协议,位于OSI
模型的应用层。可在单个TCP
链接上进行全双工通讯,能更好的节省服务器资源和带宽并达到实时通迅
客户端和服务器只须要完成一次握手,二者之间就能够建立持久性的链接,并进行双向数据传输
从上图可见,websocket
服务器与客户端经过握手链接,链接成功后,二者都能主动的向对方发送或接受数据
而在websocket
出现以前,开发实时web
应用的方式为轮询
不停地向服务器发送 HTTP 请求,问有没有数据,有数据的话服务器就用响应报文回应。若是轮询的频率比较高,那么就能够近似地实现“实时通讯”的效果
轮询的缺点也很明显,反复发送无效查询请求耗费了大量的带宽和 CPU
资源
通讯容许数据在两个方向上同时传输,它在能力上至关于两个单工通讯方式的结合
例如指 A→B 的同时 B→A ,是瞬时同步的
采用了二进制帧结构,语法、语义与 HTTP 彻底不兼容,相比http/2
,WebSocket
更侧重于“实时通讯”,而HTTP/2
更侧重于提升传输效率,因此二者的帧结构也有很大的区别
不像 HTTP/2
那样定义流,也就不存在多路复用、优先级等特性
自身就是全双工,也不须要服务器推送
引入ws
和wss
分别表明明文和密文的websocket
协议,且默认端口使用80或443,几乎与http
一致
ws://www.chrono.com
ws://www.chrono.com:8080/srv
wss://www.chrono.com:445/im?user_id=xxx
复制代码
WebSocket
也要有一个握手过程,而后才能正式收发数据
客户端发送数据格式以下:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
复制代码
服务端返回的数据格式:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol: chat
复制代码
基于websocket
的事实通讯的特色,其存在的应用场景大概有: