การส่ง websocket ping / pong frame จากเบราว์เซอร์


130

ฉันอ่านเกี่ยวกับข้อความ ping / pong ใน websockets เพื่อให้การเชื่อมต่อมีชีวิตอยู่ แต่ฉันไม่แน่ใจว่ามันคืออะไร เป็นประเภทเฟรมที่แตกต่างกันหรือไม่? (ฉันไม่เห็นวิธีการใด ๆ บนวัตถุ javascript WebSocket ใน Chrome ที่เกี่ยวข้องกับปิงปอง) หรือเป็นเพียงรูปแบบการออกแบบ (เช่นฉันส่ง "ping" หรือสตริงอื่น ๆ ไปยังเซิร์ฟเวอร์และให้มันตอบสนอง) ปิงปองเกี่ยวข้องกับเฟรมต่อเนื่องหรือไม่?

เหตุผลที่ฉันถามคือฉันใช้เฟรมเวิร์ก python ที่ทำงานหลัง Mongrel2 ดังนั้นฉันจึงสงสัยว่ามีวิธีส่ง Mongrel2 ข้อความ ping / pong เฉพาะที่จะบอกให้การเชื่อมต่อยังคงมีชีวิตอยู่โดยที่แอพ python ของฉันไม่จำเป็นต้อง กังวลเกี่ยวกับมัน ฉันเดาว่าคล้ายกับการมีวิธี HTTP แยกต่างหาก และฉันคิดว่ากรอบข้อความ ping / pong เฉพาะอาจจะง่ายกว่า (โหลดบนเซิร์ฟเวอร์และเครือข่ายน้อยกว่า) กว่าสตริง "ping" แม้ว่านั่นอาจจะไม่สำคัญมากนัก

แก้ไข: ฉันเพิ่งดูRFC 6455และดูเหมือนว่า Ping และ Pong เป็นประเภทเฟรมควบคุมด้วย opcodes ของตัวเอง ฉันจะส่ง Ping frame จาก javascript ใน Chrome ได้อย่างไร


เพียงแค่ ping จากเซิร์ฟเวอร์ ทุกคนรู้ดีเกี่ยวกับปัญหาเครือข่ายในพอร์ตที่ไม่ได้มาตรฐานดังนั้นพวกเขาจึงเริ่ม ping ในช่วงเวลาสั้น ๆ เป็นประจำ ฉันเดาว่าคุณสามารถ ping เซิร์ฟเวอร์ที่เขียนไม่ดี แต่อาจไม่ฉลาดเกินไปที่จะทำอะไรที่ละเอียดอ่อนกับพวกเขา


@ user1382306 ping จากเซิร์ฟเวอร์ก่อนจะใช้อุปกรณ์มือถือแบตหมดเร็วมาก Ping จากไคลเอนต์สามารถประหยัดแบตเตอรี่ของอุปกรณ์ได้
บรอนซ์แมน

@ user1382306 ไม่ใช่ทุกคน! ปัญหาเครือข่ายในพอร์ตที่ไม่ได้มาตรฐานคืออะไร?
HappyDog

คำตอบ:


121

ไม่มี Javascript API สำหรับส่ง ping frames หรือรับ pong frames เบราว์เซอร์ของคุณรองรับหรือไม่ก็ได้ นอกจากนี้ยังไม่มี API สำหรับเปิดใช้งานกำหนดค่าหรือตรวจสอบว่าเบราว์เซอร์รองรับและใช้เฟรม ping / pong หรือไม่ มีการอภิปรายเกี่ยวกับการสร้าง Javascript ping / pong APIสำหรับสิ่งนี้ มีความเป็นไปได้ที่อาจกำหนดค่า / ตรวจจับ ping ได้ในอนาคต แต่ไม่น่าเป็นไปได้ที่ Javascript จะสามารถส่งและรับเฟรม ping / pong ได้โดยตรง

อย่างไรก็ตามหากคุณควบคุมทั้งไคลเอนต์และรหัสเซิร์ฟเวอร์คุณสามารถเพิ่มการรองรับ ping / pong ในระดับที่สูงขึ้นได้อย่างง่ายดาย คุณจะต้องมีส่วนหัว / ข้อมูลเมตาประเภทข้อความบางประเภทในข้อความของคุณหากคุณยังไม่มี แต่ก็ค่อนข้างง่าย หากคุณไม่ได้วางแผนที่จะส่ง Ping หลายร้อยครั้งต่อวินาทีหรือมีลูกค้าพร้อมกันหลายพันรายค่าใช้จ่ายจะค่อนข้างน้อยที่จะทำด้วยตัวเอง


1
@bigmugcup ลิงค์ตายแล้ว
คุณโจ้

19

Ping มีไว้เพื่อส่งจากเซิร์ฟเวอร์ไปยังไคลเอนต์เท่านั้นและเบราว์เซอร์ควรตอบโดยเร็วที่สุดด้วย Pong OpCode โดยอัตโนมัติ ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับเรื่องนี้ในระดับที่สูงขึ้น

แม้ว่าเบราว์เซอร์บางตัวจะไม่รองรับมาตรฐานตามที่คิดไว้ แต่ก็อาจมีความแตกต่างบางประการในการใช้กลไกดังกล่าวและอาจหมายความว่าไม่มีฟังก์ชันการตอบสนองแบบ Pong แต่โดยส่วนตัวแล้วฉันใช้ Ping / Pong และไม่เคยเห็นไคลเอนต์ที่ไม่ใช้ OpCode ประเภทนี้และการตอบสนองอัตโนมัติในการใช้งานฝั่งไคลเอ็นต์ระดับต่ำ


74
คุณเคยอ่านที่ไหนว่า ping นั้นมาจากเซิร์ฟเวอร์ถึงไคลเอนต์เท่านั้น? RFC ระบุว่า "ปลายทางอาจส่ง Ping เฟรมได้ทุกเมื่อหลังจากสร้างการเชื่อมต่อและก่อนที่จะปิดการเชื่อมต่อ"
xryl669

7
หากคุณต้องการให้ไคลเอ็นต์ตรวจหาสถานะที่ตัดการเชื่อมต่อโดยอัตโนมัติ (เมื่อไม่ได้รับแพ็กเก็ต RST / FIN แต่เครือข่ายถูกตัดการเชื่อมต่อ) คุณจะต้องให้ไคลเอ็นต์เริ่มต้นแพ็กเก็ต ping ด้วย
pschwamb

13
TCP ไม่แจ้งการตัดการเชื่อมต่อเมื่อไม่ได้รับแพ็กเก็ต RST / FIN TCP ตรวจพบเฉพาะการเชื่อมต่อที่หลุดเมื่อผู้ส่งพยายามส่งการเชื่อมต่อที่ไม่ได้เชื่อมต่อ Pings ถูกใช้เป็น heartbeats ในหลาย ๆ แอพพลิเคชั่นและเป็นการใช้งานที่ถูกต้อง การเชื่อมต่อที่ไม่สมบูรณ์จะยังคงอยู่ตลอดไปจนกว่าไคลเอ็นต์จะพยายามส่ง ดังนั้นเมื่อใช้ WebSockets บนเบราว์เซอร์จะต้องใช้ข้อความ ping (หรือ heartbeat) ที่กำหนดเองเพื่อตรวจจับการตัดการเชื่อมต่อของไคลเอ็นต์ในฝั่งไคลเอ็นต์ เซิร์ฟเวอร์อาจพยายาม ping และตรวจพบว่าไคลเอนต์ตัดการเชื่อมต่อ แต่ไคลเอนต์ไม่ได้รับแจ้ง การส่ง Ping ของลูกค้าก็ใช้ได้เช่นกัน
ท.บ.

15
ใน RFC 6455 โปรโตคอล WebSocket ระบุไว้อย่างชัดเจนว่า: "หมายเหตุ: เฟรม Ping อาจทำหน้าที่เป็นแบบ Keepalive หรือเป็นวิธีการตรวจสอบว่าปลายทางระยะไกลยังคงตอบสนองอยู่"
ท.บ.

4
เป็นไปได้ว่าการ ping เฉพาะเซิร์ฟเวอร์เป็นแนวทางปฏิบัติที่แนะนำเมื่อตัวแทนผู้ใช้ถูกรีเฟรชบ่อยๆ แต่ปัจจุบันเว็บไซต์หลายแห่งได้รับการออกแบบเป็นสปา ในสภาพแวดล้อมนี้อาจจำเป็นมากสำหรับแอปพลิเคชันไคลเอนต์ที่จะต้อง ping เซิร์ฟเวอร์เป็นประจำเพื่อให้แน่ใจว่าการเชื่อมต่อไม่ขาด
Noel Abrahams
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.