HTTP协议和WebSocket协议
一、HTTP协议
-
HTTP协议是什么?
HTTP协议(超文本传输协议HyperText Transfer Protocol),用于从服务器传输数据到本地浏览器的传输协议,它是基于TCP协议的一个应用层传输协议,由请求和响应构成,是一种无状态的协议,简单来说就是客户端和服务端进行数据传输的一种规则。
-
HTTP的工作过程
- 客户端和服务器建立连接,HTTP开始工作
- 建立连接后,客户端发送请求给服务器
- 服务器收到请求后给予相应的响应信息
- 客户端接收服务器返回的数据并在浏览器上展示
- 客户端和服务器的连接断开
在这个过程中客户端和服务器之间的连接和断开是怎么实现的呢?
-
三次握手建立连接
- 第一次:建立连接,客户端发送SYN包(SYN=i)到服务器,并进入SYN_SEND状态等待服务器确认
- 第二次:服务器接收SYN包,确认客户端的SYN,同时也发送一个SYN包(SYN=k)+ ACK包(ACK=i+1)给客户端,服务器进入SYN_RECV状态
- 第三次:客户端接收到服务器的SYN + ACK包之后,同时向服务器发送确认包ACK包(ACK=k+1),然后客户端和服务器进入ESTABLISHED状态,三次握手结束,连接成功建立。
其中,SYN 是同步序列编号的缩写,用于建立连接;ACK 是确认标志,用于确认收到对方的数据包。
接下来举个生动形象的例子,方便理解
- 第一次:客户端(小明)对服务器(小红)说:“喂,我想和你说话,你能听到吗?”
- 第二次:服务器(小红)对客户端(小明)说:“我能听到,你说吧。”
- 第三次:客户端(小明)对服务器(小红)说:“好的,我开始说了。”
这个过程中,客户端和服务器都确认彼此能够通信,建立了连接。
-
四次挥手断开连接
- 第一次:客户端发送一个FIN(i),用来关闭客户端和服务器的数据传输,客户端进入FIN_WAIT_1状态
- 第二次:服务器接收FIN,同时发送一个ACK(i+1)给客户端,服务器进入CLISE_WAIT状态
- 第三次:服务器发送一个FIN(j)给客户端,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态
- 第四次:客户端接收到FIN后,客户端进入TIME_WAIT状态,然后发送ACK(j+1)给服务器,校验完成之后服务器进入CLOSED状态,四次挥手结束,已断开连接
其中,FIN 是结束标志,用于断开连接;ACK 是确认标志,用于确认收到对方的数据包。
接下来举个生动形象的例子,方便理解
- 第一次:客户端(小明)对服务器(小红)说:“我说完了,我不说了。”
- 第二次:服务器(小红)对客户端(小明)说:“我知道你说完了,但是我还有一些东西要告诉你。”
- 第三次:服务器(小红)对客户端(小明)说:“我说完了,我不说了。”
- 第四次:客户端(小明)对服务器(小红)说:“好的,我知道你说完了,我们断开连接吧。”
这个过程中,客户端和服务器都确认彼此已经没有数据要传输,可以断开连接。
-
HTTPS协议
HTTPS就是加密的HTTP,它通过HTTP进行通信,利用SSL/TLS建立安全信道,加密数据包,是计算机网络进行安全通信的传输协议。
二、WebSocket协议
-
WebSocket协议是什么?
WebSocket协议是H5的提出的在单个TCP协议上进行全双工通信的协议,它允许服务器主动向客户端推送数据,客户端和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输,WebSocket是基于HTTP协议的,借助HTTP协议来完成握手。
-
WebSocket的工作过程
- 客户端发送HTTP请求,经过三次握手,建立TCP连接,在HTTP请求里存放WebSocket支持的版本号等信息
- 服务器接收请求,同样以HTTP协议回应
- 连接成功,客户端与服务器建立持久性的连接,连接之后客户端和服务器之间就可以随时通讯了,直到其中一方关闭连接
三、两者之间的比较
- 相同点:
- 都是基于TCP协议实现的
- 都使用Request/Response模型进行连接的建立
- WebSocket是基于HTTP的,他们的兼容性都很好
- 在连接的建立过程中对错误的处理方式相同
- 都可以在网络中传输数据
- 不同点:
- WebSocket是持久连接,而HTTP是短连接,这意味着WebSocket可以在连接建立后保持连接状态,而HTTP需要在每次请求完成后关闭连接。
- WebSocket是以ws/wss开头,而HTTP则是以http/https开头
- WebSocket是有状态的,而HTTP是无状态的,这意味着WebSocket可以在连接建立后保持状态,而HTTP每次请求都是独立的。
- WebSocket连接之后,服务器和客户端可以双向发送数据,而HTTP只能是客户端发起一次请求后,服务器才能返回数据
- WebSocket是可以跨域的,而HTTP不行
- WebSocket连接建立以后,数据的传输使用帧来传递,不再需要Request消息,HTTP则需要每次请求都包含Request消息。