最佳答案
WebSockets有选择权向另一端发送 ping 信息,而另一端应该使用 pong 来响应。
在接收到一个乒乓帧后,端点必须发送一个乒乓帧到 响应,除非它已经收到一个关闭帧。它应该 在实际可行的情况下尽快响应乒乓画面。
Keepalive 形式的 TCP 提供了类似的东西:
[ Y ]您发送给您的对等端一个保持活动的探测数据包,其中没有任何数据,并且 ACK 标志打开。您可以这样做,因为 TCP/IP 规范是一种重复的 ACK,而且远程端点没有参数,因为 TCP 是面向流的协议。另一方面,您将收到来自远程主机的响应(它根本不需要支持 keepalive,只需要 TCP/IP) ,没有数据和 ACK 集。
我认为 TCP keepalive 更有效率,因为它可以在内核中处理,而不需要将数据传输到用户空间,解析一个 websocket 帧,构建一个响应帧,然后将其交还给内核进行传输。网络流量也更少。
此外,WebSockets是显式指定的总是运行在 TCP 之上; 它们不是不可知的传输层,所以 TCP keepalive 总是可用的:
WebSocket 协议是一个独立的基于 TCP 的协议。
那么,为什么要使用 WebSocket ping/pong 而不是 TCP keepalive 呢?