WebSockets имеют опцию отправки пингов на другой конец, где другой конец должен отвечать понг.
После получения кадра Ping конечная точка ДОЛЖНА отправить рамку Pong в ответа, если он уже не получил рамку Close. Должно ответьте рамкой Понга, как только это станет практичным.
TCP предлагает нечто подобное в виде keepalive:
[Y] вы отправите своему сверстнику контрольный пакет keepalive без данных в нем и включен флаг ACK. Вы можете сделать это из-за спецификаций TCP/IP, как своего рода дубликат ACK, а удаленная конечная точка не будет иметь никаких аргументов, поскольку TCP - это протокол, ориентированный на поток. С другой стороны, вы получите ответ от удаленного хоста (который не должен поддерживать keepalive вообще, только TCP/IP), без данных и набора ACK.
Я бы подумал, что TCP keepalive более эффективен, потому что он может обрабатываться в ядре без необходимости передавать данные до пользовательского пространства, анализировать фрейм websocket, обрабатывать кадр ответа и передавать его в ядро для коробка передач. Это также снижает сетевой трафик.
Кроме того, WebSockets явно указаны, чтобы всегда работать через TCP; они не являются агрегированными транспортными уровнями, поэтому всегда поддерживается TCP keepalive:
Протокол WebSocket является независимым протоколом TCP.
Итак, почему бы вам когда-нибудь захотеть использовать ping/pong WebSocket вместо TCP keepalive?