网络传输协议解析及SSE补充
1. HTTP(Hypertext Transfer Protocol)
HTTP是一种基于请求-响应模型的无状态协议,通常用于浏览器与服务器之间的数据交换。作为互联网的基础协议,HTTP用于传输网页内容、图像、视频等。其主要特点包括:
-
无状态:每个请求都是独立的,不保留前后连接信息。
-
可靠性:使用TCP作为底层协议,保证数据传输的可靠性。
-
典型应用场景:网页浏览、API通信、文件下载等。
-
传输层协议:基于TCP协议。
-
数据格式:主要以文本格式传输(如JSON、HTML等)。
-
连接方式:请求-响应模式,通常为短连接。
2. WebSocket
WebSocket是一种全双工协议,允许客户端与服务器之间建立持久连接,进行实时双向通信。它是HTTP的补充,最初通过HTTP握手建立连接,之后转换为WebSocket协议。其特点包括:
-
双向通信:客户端与服务器可以在连接期间随时互发数据。
-
低延迟:保持长连接,避免重复建立连接的开销。
-
典型应用场景:实时聊天、在线游戏、股票交易、数据推送等。
-
传输层协议:基于TCP协议。
-
数据格式:可以传输文本或二进制数据。
-
连接方式:持久连接,通过一次HTTP握手建立连接后持续使用。
3. TCP(Transmission Control Protocol)
TCP是一种面向连接的传输层协议,提供可靠的数据传输。它通过序列号、确认机制、超时重传等机制保证数据的完整性和顺序。其特点包括:
-
面向连接:数据传输前需要建立连接,数据传输后需要关闭连接。
-
可靠传输:通过确认和重传机制确保数据完整、无丢失和无重复。
-
流量控制和拥塞控制:调整传输速度以避免网络拥堵。
-
典型应用场景:文件传输、电子邮件、网页浏览等需要数据完整性的场景。
-
传输层协议:直接运行在IP之上。
-
数据格式:任意格式,但有严格的包序和重发机制。
-
连接方式:可靠的双向连接。
4. UDP(User Datagram Protocol)
UDP是一种无连接、面向消息的传输层协议。与TCP相比,它不提供可靠的数据传输服务,但具有低延迟的优势。其特点包括:
-
无连接:无需建立连接即可传输数据,发送方直接发送数据,接收方直接接收数据。
-
不可靠传输:不保证数据的顺序和完整性,数据可能丢失或乱序。
-
低开销:由于没有确认和重传机制,UDP传输效率更高,适用于对数据可靠性要求不高但对实时性要求高的场景。
-
典型应用场景:视频流、音频流、在线游戏、实时语音通话等。
-
传输层协议:直接运行在IP之上。
-
数据格式:任意格式,但没有确认机制。
-
连接方式:无连接,不保证可靠性。
5. 补充SSE (Server-Sent Events)
SSE是一种允许服务器主动向客户端推送事件的简单技术。它基于HTTP协议,适用于需要频繁更新但不需要完整双向通信的场景。以下是SSE的一个简单实现示例:
服务端:
import http from "node:http";
let count = 0;const server = http.createServer((req, res) => {res.writeHead(200, {"access-control-allow-origin": "*","content-type": "text/event-stream",});if (req.url === "/sse") {setInterval(() => {console.log("发送数据", count);res.end(`data: hello --- ${count++}\n\n`);}, 1000);}
});server.listen(8080, () => {console.log("服务启动成功", "http://localhost:8080");
});
客户端:
const sse = new EventSource("http://localhost:8080/sse");
sse.onmessage = (event) => console.log(event.data);
通过上述代码,服务器每秒向客户端推送一次数据,实现了简单的服务器推送功能。SSE在需要单向实时更新的场景中非常有用,如新闻推送、实时通知等。
6. 协议对比总结
7. 补充资料
-
官方 http 文档:https://nodejs.org/docs/latest/api/http.html
-
官方 net 文档:https://nodejs.org/docs/latest/api/net.html
-
官方 dgram 文档:https://nodejs.org/docs/latest/api/dgram.html
-
express:https://expressjs.com/
-
socket.io:https://socket.io/
-
Websocket 协议:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#%E4%BA%A4%E6%8D%A2%E6%95%B0%E6%8D%AE%E5%B8%A7