Websocket-实时通信
之前一直听说Websocket,但也一直没有使用过,今天突然又看到了,还挺感兴趣的,可以一起看看
原理:浏览器间隔几秒发送一次请求,询问服务器是否有新消息出现,持续
优点:实现简单,大部分浏览器和服务器支持
缺点:频繁的请求和响应会导致不必要的网络开销,降低性能和效率
场景:数据更新频率不高且实时性要求不高的场景
原理:和 ajax 轮询差不多,采取阻塞模式,客户端发起请求,没有没有消息,服务器则不返回,客户端收到响应,立即再次发出请求,形成新的挂起请求,持续
优点:相较于轮询,减少了不必要的网络请求,降低网络开销
缺点:服务器需要维护大量挂起请求,占用资源较多,不适用于高并发场景
场景:数据更新不频繁,但要求实时性相对较高的场景
ajax 和长轮询都是在不断的建立 HTTP 连接,然后等服务端处理(HTTP 特点:被动性)
原理:WebSocket 是一种全双工通信协议,通过建立持久性的连接,客户端和服务器可以随时发送和接收消息。连接建立后,双方可以直接发送消息,不需要频繁的握手过程
优点:实现实时通信,降低了不必要的网络开销,性能较高,支持跨域通信
缺点:需要服务器和客户端都支持 WebSocket 协议
场景:适用于需要实时通信,如实时聊天,在线游戏,实时数据展示,多人协同编辑
websocket 只需要一次 HTTP 握手,整个过程是建立在一次连接/状态中(避免 HTTP 非状态性)
通过 Websocket 可以构建实时、高效和响应迅速的 web 应用程序
WebSocket 的工作原理可以分为三个阶段:握手、数据传输和断开连接
握手:客户端发起 WebSocket 连接时,通过向服务器发送一个特殊的 HTTP 请求头来建立连接。服务器检查请求头中的特定字段,确认支持 WebSocket 协议后,发送特殊的 HTTP 响应头进行握手确认。握手成功后,双方建立了 WebSocket 连接,可以进行后续的数据传输。
数据传输:一旦建立了 WebSocket 连接,客户端和服务器可以通过该连接进行双向的实时数据传输。双方可以发送和接收消息,消息以帧的形式进行传输。WebSocket 协议定义了不同类型的帧,如文本帧和二进制帧,用于传输不同类型的数据。
断开连接:当连接不再需要时,客户端或服务器可以发起关闭连接的请求。双方会交换特殊的关闭帧,以协商关闭连接,并确保双方都接收到了关闭请求。
Websocket 是一种新的协议,跟 HTTP 协议基本没关系,为了兼容浏览器的握手规范,也可以说是 HTTP 协议上的一种补充。
TCP:TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
TCP 连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
HTTP(Hypertext Transfer Protocol) 是一种应用层协议,主要负责数据的传输和格式化。它的主要功能是规范浏览器与服务器之间的通信格式,确保数据按照预定的规则传输。
TCP(Transmission Control Protocol) 则是一种传输层协议,负责数据如何在网络中传输。它定义了数据传输的方式,包括连接的建立、维持以及数据包的发送和接收。TCP 确保数据传输的可靠性,即数据是否能够按预期到达目的地。
HTTP 依赖于 TCP 来进行数据传输,HTTP 用于处理请求和响应的格式,而 TCP 则负责建立连接、保持连接以及数据包的可靠传输。也可以说 HTTP 运行在 TCP 之上。
所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包。
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
第一次握手:建立连接。客户端发送连接请求报文段,将 SYN 位置为 1,Sequence Number 为 x;然后,客户端进入 SYN_SEND 状态,等待服务器的确认;
第二次握手: 服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,设置 Acknowledgment Number 为 x+1(Sequence Number+1);同时,自己自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 报文段。然后将 Acknowledgment Number 设置为 y+1,向服务器发送 ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手。
所谓四次挥手(Four-way Handshake),是指终止一个 TCP 连接,需要总共发送 4 个包来完成这个过程。
当数据传输完成,tcp 通过四次挥手断开 tcp 连接,释放系统资源
第一次挥手:主机 1(可以使客户端,也可以是服务器端),设置 Sequence Number,向主机 2 发送一个 FIN 报文段;此时,主机 1 进入 FIN_WAIT_1 状态;这表示主机 1 没有数据要发送给主机 2 了;
第二次挥手:主机 2 收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段,Acknowledgment Number 为 Sequence Number 加 1;主机 1 进入 FIN_WAIT_2 状态;主机 2 告诉主机 1,我“同意”你的关闭请求;
第三次挥手:主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入 LAST_ACK 状态;
第四次挥手:主机 1 收到主机 2 发送的 FIN 报文段,向主机 2 发送 ACK 报文段,然后主机 1 进入 TIME_WAIT 状态;主机 2 收到主机 1 的 ACK 报文段以后,就关闭连接;此时,主机 1 等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机 1 也可以关闭连接了。