WebSockets haben die Möglichkeit , Pings an das andere Ende zu senden, wo das andere Ende mit einem Pong antworten soll.
Beim Empfang eines Ping-Frames MUSS ein Endpunkt als Antwort einen Pong-Frame senden, es sei denn, er hat bereits einen Close-Frame empfangen. Es sollte mit Pong-Rahmen reagieren, sobald es praktisch ist.
TCP bietet etwas Ähnliches in Form von Keepalive:
[Y] Sie senden Ihrem Peer ein Keepalive-Testpaket ohne Daten und mit aktiviertem ACK-Flag. Sie können dies aufgrund der TCP / IP-Spezifikationen als eine Art doppeltes ACK tun, und der Remote-Endpunkt hat keine Argumente, da TCP ein Stream-orientiertes Protokoll ist. Auf der anderen Seite erhalten Sie eine Antwort vom Remote-Host (der Keepalive überhaupt nicht unterstützen muss, nur TCP / IP), ohne Daten und mit dem ACK-Set.
Ich würde denken, dass TCP Keepalive effizienter ist, da es innerhalb des Kernels verarbeitet werden kann, ohne dass Daten in den Benutzerbereich übertragen, ein Websocket-Frame analysiert, ein Antwortframe erstellt und dieses zur Übertragung an den Kernel zurückgegeben werden muss. Es ist auch weniger Netzwerkverkehr.
Darüber hinaus werden WebSockets explizit so angegeben , dass sie immer über TCP ausgeführt werden. Sie sind nicht transportschichtunabhängig, daher ist TCP Keepalive immer verfügbar:
Das WebSocket-Protokoll ist ein unabhängiges TCP-basiertes Protokoll.
Warum sollte man jemals WebSocket Ping / Pong anstelle von TCP Keepalive verwenden wollen?
setsockopt(2)
.