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?
quelle
setsockopt(2)
.Neben der Antwort von EJP könnte dies auch mit HTTP-Proxy-Mechanismen zusammenhängen. Websocket-Verbindungen können auch über einen (HTTP-) Proxyserver ausgeführt werden. In solchen Fällen überprüft das TCP-Keepalive nur die Verbindung zum Proxy und nicht die End-to-End-Verbindung.
quelle
http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames
WebSockets wurden unter Berücksichtigung von RTC entwickelt. Wenn ich mir also die Ping / Pong-Funktionalität anschaue, sehe ich auch eine Möglichkeit, die Latenz zu messen. Die Tatsache, dass das Pong die gleiche Nutzlast wie das Ping zurückgeben muss, macht es sehr bequem, einen Zeitstempel zu senden und dann die Latenz vom Client zum Server oder umgekehrt zu berechnen.
quelle
TCP Keepalive wird nicht über einen Webproxy weitergeleitet. Der Websocket-Ping / Pong wird von über Web-Proxys weitergeleitet. TCP Keepalive dient zur Überwachung einer Verbindung zwischen TCP-Endpunkten. Web-Socket-Endpunkte sind nicht gleich TCP-Endpunkten. Eine Websocket-Verbindung kann mehrere TCP-Verbindungen zwischen zwei Websocket-Endpunkten verwenden.
quelle