WebSockets有选择发送ping到另一端的选项,另一端应该以pong响应。
收到Ping帧后,端点必须发送Pong帧作为响应,除非它已经收到Close帧。 它应该尽快以Pong帧作出响应。
你可以发送一个没有数据、开启ACK标志位的keepalive探针包给对端。由于TCP/IP规范,你可以这样做,作为一种重复的ACK,并且远程终端没有任何参数,因为TCP是面向流的协议。另一方面,你将从远程主机(它不需要支持keepalive,只需要支持TCP/IP)接收到一个带有没有数据和设置了ACK的回复。
我认为TCP keepalive更有效,因为它可以在内核中处理而无需将数据传输到用户空间,解析websocket帧,制作响应帧并将其交还内核进行传输。这也减少了网络流量。
此外,WebSocket被明确指定始终在TCP上运行;它们不是传输层不可知的,因此TCP keepalive始终可用:
WebSocket协议是一种独立的基于TCP的协议。
那么,为什么要使用WebSocket ping/pong而不是TCP keepalive呢?