Senden eines Websocket-Ping- / Pong-Frames vom Browser

130

Ich lese immer wieder über Ping / Pong-Nachrichten in Websockets, um die Verbindung aufrechtzuerhalten, bin mir aber nicht sicher, was sie sind. Ist es ein bestimmter Rahmentyp? (Ich sehe keine Methoden für ein Javascript-WebSocket-Objekt in Chrome im Zusammenhang mit Ping-Pong). Oder ist es nur ein Entwurfsmuster (z. B. sende ich buchstäblich "Ping" oder eine andere Zeichenfolge an den Server und lasse ihn antworten). Bezieht sich Ping-Pong überhaupt auf Fortsetzungsrahmen?

Der Grund, den ich frage, ist, dass ich ein Python-Framework verwende, das hinter Mongrel2 ausgeführt wird. Daher frage ich mich, ob es eine Möglichkeit gibt, Mongrel2 eine bestimmte Ping / Pong-Nachricht zu senden, die es anweist, die Verbindung aufrechtzuerhalten, ohne dass meine Python-App dies tun muss Sorgen Sie sich darum. Analog zu einer separaten HTTP-Methode, denke ich. Und ich stelle mir vor, ein dedizierter Ping / Pong-Nachrichtenrahmen könnte einfacher sein (weniger Belastung für Server und Netzwerk) als der String "Ping", obwohl das wahrscheinlich nicht allzu wichtig wäre.

EDIT: Ich habe mir gerade RFC 6455 angesehen und es sieht so aus, als wären Ping und Pong definitiv Steuerrahmen- Typen mit ihren eigenen Opcodes. Wie sende ich einen Ping-Frame aus Javascript in Chrome?

danny
quelle
Pingen Sie einfach vom Server. Jeder kennt das Netzwerkproblem an nicht standardmäßigen Ports, daher beginnen sie in regelmäßigen kurzen Abständen zu pingen. Ich denke, Sie könnten einen schlecht geschriebenen Server anpingen, aber es ist möglicherweise nicht zu klug, etwas Sensibles mit ihnen zu tun.
@ user1382306 Ping vom Server zuerst verwendet den Akku des Mobilgeräts sehr schnell. Durch Ping vom Client kann der Akku des Geräts gespart werden.
Bronzemann
@ user1382306 Nicht ganz jeder! Was ist das Netzwerkproblem bei nicht standardmäßigen Ports?
HappyDog

Antworten:

120

Es gibt keine Javascript-API zum Senden oder Empfangen von Pong-Frames. Dies wird entweder von Ihrem Browser unterstützt oder nicht. Es gibt auch keine API zum Aktivieren, Konfigurieren oder Erkennen, ob der Browser Ping / Pong-Frames unterstützt und verwendet. Es gab Diskussionen darüber, eine Javascript-Ping / Pong-API dafür zu erstellen . Es besteht die Möglichkeit, dass Pings in Zukunft konfigurierbar / erkennbar sind, aber es ist unwahrscheinlich, dass Javascript Ping- / Pong-Frames direkt senden und empfangen kann.

Wenn Sie jedoch sowohl den Client- als auch den Servercode steuern, können Sie problemlos Ping / Pong-Unterstützung auf einer höheren Ebene hinzufügen. Sie benötigen eine Art Nachrichtentyp-Header / Metadaten in Ihrer Nachricht, wenn Sie das noch nicht haben, aber das ist ziemlich einfach. Wenn Sie nicht vorhaben, Pings hunderte Male pro Sekunde zu senden oder Tausende von Clients gleichzeitig zu haben, ist der Overhead ziemlich gering, um dies selbst zu tun.

Kanaka
quelle
1
@bigmugcup Der Link ist tot
Herr Jo
19

Ping soll nur vom Server zum Client gesendet werden, und der Browser sollte so schnell wie möglich automatisch mit Pong OpCode antworten. Sie müssen sich also auf höherer Ebene keine Sorgen machen.

Obwohl nicht alle Browser Standard unterstützen, wie sie annehmen, können sie einige Unterschiede bei der Implementierung eines solchen Mechanismus aufweisen, und es kann sogar bedeuten, dass es keine Pong-Antwortfunktion gibt. Aber ich persönlich verwende Ping / Pong und habe noch nie einen Client gesehen, der diese Art von OpCode nicht implementiert, und keine automatische Antwort auf die clientseitige Implementierung auf niedriger Ebene.

Moka
quelle
73
Wo haben Sie gelesen, dass Ping nur von Server zu Client erfolgt? Der RFC sagt: "Ein Endpunkt kann jederzeit einen Ping-Frame senden, nachdem die Verbindung hergestellt wurde und bevor die Verbindung geschlossen wird."
Xryl669
7
Wenn der Client automatisch einen getrennten Status erkennen soll (wenn keine RST / FIN-Pakete empfangen wurden, das Netzwerk jedoch getrennt wurde), muss der Client auch Ping-Pakete initiieren.
Pschwamb
13
TCP benachrichtigt nicht über Verbindungsabbrüche, wenn keine RST / FIN-Pakete empfangen wurden. TCP erkennt unterbrochene Verbindungen nur, wenn ein Absender versucht, eine getrennte Verbindung zu senden. Pings werden in vielen Anwendungen als Herzschlag verwendet und sind eine gültige Verwendung. Eine tote Verbindung bleibt einfach für immer tot, bis der Client versucht zu senden. Daher muss bei WebSockets im Browser eine benutzerdefinierte Ping- (oder Heartbeat-) Nachricht verwendet werden, um die Client-Trennung auf der Client-Seite zu erkennen. Der Server versucht möglicherweise zu pingen und erkennt, dass die Client-Verbindung getrennt wurde, aber der Client wird nicht informiert. Client-Pings sind ebenfalls in Ordnung.
DDS
15
In RFC 6455, The WebSocket Protocol, heißt es ausdrücklich: "HINWEIS: Ein Ping-Frame kann entweder als Keepalive oder als Mittel zum Überprüfen der Reaktionsfähigkeit des Remote-Endpunkts dienen."
DDS
4
Es ist möglich, dass der Nur-Server-Ping eine empfohlene Vorgehensweise war, wenn Benutzeragenten häufig aktualisiert wurden. Aber jetzt sind viele Websites als SPAs konzipiert. In dieser Umgebung kann es für die Clientanwendung sehr wichtig sein, den Server regelmäßig zu pingen, um sicherzustellen, dass die Verbindung nicht unterbrochen wurde.
Noel Abrahams