WebSocket
WebSocket是一种协议,它允许在客户端和服务器之间建立持久连接,实现双向实时通信(传统的http请求是客户端向服务器发起请求,服务器响应请求,而WebSocket解决服务器无法给客户端发送信息的问题)。与HTTP协议不同,WebSocket协议不需要在每次通信时重新建立连接,从而避免了HTTP协议的繁琐和性能问题。
WebSocket协议是HTML5规范的一部分,它建立在TCP协议之上,使用HTTP协议进行握手。WebSocket协议通过在HTTP/HTTPS的端口上监听客户端请求,当客户端发起WebSocket请求时,服务器返回响应,随后客户端和服务器之间就可以建立持久连接,双向通信,传输的数据格式可以是文本或二进制格式。
WebSocket协议使用的是TCP协议作为底层传输协议,因此可以保证数据的可靠性和有序性。同时,WebSocket协议还支持心跳机制(heartbeat),用于保持连接的稳定性。当连接空闲一段时间时,双方可以互相发送心跳消息来维持连接,避免连接中断
WebSocket协议具有低延迟、高并发、双向实时通信等特点
常用于实时通信、在线游戏、数据可视化等场景,它已经被广泛应用于互联网的各个领域。
WebSocket协议在浏览器中使用比较简单,通常可以通过JavaScript的WebSocket API来创建WebSocket连接,并进行消息的发送和接收。在服务器端,也需要使用特定的WebSocket服务器来支持WebSocket协议。常用的WebSocket服务器有Node.js的ws模块、Java的Tomcat、Jetty等。
WebSocket协议的工作流程:
在WebSocket协议中,通信双方首先要建立握手(handshake)连接,以确认彼此是否支持WebSocket协议和版本,然后在握手成功后,双方可以互相发送消息,每个消息都由一些元数据(如数据类型、数据长度等)和实际的数据组成。具体步骤如下:
- 客户端向服务器发起WebSocket连接请求,请求报文采用HTTP协议,通过Upgrade头部字段表明请求协议为WebSocket。
- 服务器收到客户端的连接请求后,响应一个101状态码的响应报文,表示同意建立WebSocket连接。
- 建立WebSocket连接后,客户端和服务器就可以互相发送消息,消息采用帧的形式进行封装,每个帧包含一个帧头和帧载荷两个部分,帧头包含了控制帧和数据帧的一些信息,帧载荷就是具体的消息内容。
- 客户端和服务器发送的消息可以是文本、二进制数据等格式,发送的消息由于采用了帧的方式进行封装,所以可以保证数据的可靠性和完整性,而且可以实现高效的数据传输。
- 当客户端或服务器想要关闭WebSocket连接时,可以发送一个特殊的关闭帧来关闭连接。
#相关知识点
一.Ajax轮询是什么?
Ajax轮询是一种实现实时数据更新的技术,它通过定时向服务器发送Ajax请求,以获取最新数据。在轮询中,客户端会以一定的时间间隔重复向服务器发送请求,服务器在接收到请求后,如果没有新数据需要返回,就会返回一个空响应,客户端在收到空响应后会在指定的时间间隔后再次发送请求。
由于轮询是通过定时发送请求的方式来获取最新数据的,因此它的实时性比较低,且频繁的请求会给服务器带来一定的负担,同时也会占用客户端的带宽和资源。因此,现在更常用的实时数据更新技术是WebSocket。
二.TCP协议
TCP(Transmission Control Protocol)协议是一种面向连接、可靠的、基于字节流的传输层协议。它通过三次握手建立连接,提供可靠的数据传输、流量控制、拥塞控制等机制,能够保证数据的可靠性和顺序性。TCP协议被广泛用于互联网上的数据通信,如网页浏览、文件传输、电子邮件等应用中。
TCP协议中的三次握手
TCP协议的三次握手是指在建立TCP连接时,客户端和服务器之间需要发送三个TCP数据包来确认连接的建立。这个过程如下:
- 第一次握手:客户端发送一个SYN(同步)数据包到服务器,请求建立连接。
- 第二次握手:服务器接收到客户端的SYN数据包之后,发送一个SYN-ACK(同步-确认)数据包,告诉客户端可以建立连接。
- 第三次握手:客户端接收到服务器的SYN-ACK数据包之后,发送一个ACK(确认)数据包,告诉服务器连接已经建立成功。
至此,TCP连接建立完成,客户端和服务器之间可以开始传输数据。
注:
在 TCP 三次握手中,SYN(同步)数据包是由客户端发起的,用于初始化连接的请求。SYN 数据包中包含以下数据:
- 序列号(Sequence Number):表示本次 TCP 报文段的第一个数据字节在数据流中的序列号。
- TCP 标识位(TCP Flags):在 TCP 数据包中,用于标识 TCP 报文的类型,SYN 数据包中 SYN 标识位为 1,其余标识位为 0。
- 通信窗口大小(Window Size):指明了发送端能够接收的字节数量。
- MSS(Maximum Segment Size):指明 TCP 连接端所能接收的最大数据段长度。
SYN-ACK(同步-确认)数据包里有以下数据:
- 序列号(Sequence Number):是随机数,用于标识发送方发送的数据的顺序。
- 确认号(Acknowledgment Number):是上一次接收到的数据包的序列号+1,表示接收方期望接收的下一个数据的序列号。
- 控制位(Control Bits):表示数据包的类型和控制信息。SYN-ACK 数据包的控制位为 SYN 和 ACK。SYN 表示同步请求,ACK 表示确认应答。
- 窗口大小(Window Size):是发送方告诉接收方本地接收缓存区大小的值。接收方根据这个值来确定可以接收多少数据。
- 校验和(Checksum):用于检查数据是否损坏或被篡改。
- 紧急指针(Urgent Pointer):如果控制位中有 URG 标志,就使用紧急指针。它表示紧急数据的位置,也就是告诉接收方哪些数据是需要优先处理的。
- 选项(Options):用于在数据包中添加一些额外的信息。常用的选项包括时间戳、最大段大小等。
ACK(确认)数据包,主要包含以下数据:
- 序列号(Sequence Number):表示数据包中包含数据的第一个字节的序号,用于通知接收方下一个期望接收的字节是哪一个。
- 确认号(Acknowledgment Number):表示发送方期望接收的下一个字节的序号。ACK数据包的确认号字段是SYN-ACK数据包中的序列号加1,表示接收到SYN-ACK后发送方期望接收的下一个字节序号。
- TCP标识位(TCP Flags):ACK数据包中的标识位为1,表示确认数据包。
- 标头长度(Header Length):TCP标头长度,用于表示TCP标头中包含多少个32位字。
- 窗口大小(Window Size):表示接收方可以接收的数据量大小,用于流量控制和拥塞控制。
- 校验和(Checksum):用于校验数据包的完整性和正确性。
- 紧急指针(Urgent Pointer):表示紧急数据的末尾字节在数据包中的位置,仅当URG标识位被设置时才有意义。