面试题答案
一键面试握手方式
- HTTP:HTTP是无状态协议,客户端发起请求,服务器响应,请求和响应之间没有持续连接。其握手过程是简单的请求 - 响应模式。例如,浏览器向服务器发送一个HTTP GET请求,服务器返回对应的资源。这种握手不需要额外复杂的协商过程。
- WebSocket:WebSocket握手是基于HTTP协议实现的升级握手。客户端发送一个包含特殊头部字段
Upgrade: websocket
和Connection: Upgrade
的HTTP请求,告知服务器要将连接升级为WebSocket连接。服务器如果支持,会返回状态码101 Switching Protocols,并在响应头中携带Upgrade: websocket
和Connection: Upgrade
,完成握手,之后双方基于WebSocket协议进行通信。
请求头差异
- HTTP:常见请求头有
Accept
(指定可接受的响应内容类型)、Content - Type
(指定请求体的内容类型)、User - Agent
(标识客户端信息)等。这些请求头主要用于描述请求的资源类型、客户端信息以及对响应的期望等,侧重于资源获取和交互。 - WebSocket:除了包含部分HTTP通用头,还会有特定的WebSocket头。如前文提到的
Upgrade: websocket
和Connection: Upgrade
用于请求连接升级。还有Sec - WebSocket - Key
,它是一个随机生成的Base64编码字符串,服务器会用这个Key来验证请求合法性,并通过Sec - WebSocket - Accept
头返回经过特定算法计算后的响应,确保握手的安全性。
对实时通信场景的影响
- HTTP:由于其无状态和请求 - 响应模式,在实时通信场景下存在局限性。如果要实现实时数据推送,通常需要使用轮询(客户端定时发送请求获取数据)或长轮询(客户端发送请求,服务器保持连接直到有新数据才响应)技术。轮询会频繁发送请求,浪费带宽和服务器资源;长轮询虽然在一定程度上减少了请求频率,但仍需不断建立和关闭连接,开销较大,且实时性不够理想。
- WebSocket:其全双工通信特性,一旦握手成功,客户端和服务器之间可以随时双向发送数据。这种特性使得WebSocket非常适合实时通信场景,如在线聊天、实时游戏、股票行情推送等。由于不需要频繁握手和建立连接,减少了通信开销,能够更高效地传输数据,实现真正意义上的实时交互。