Gửi khung ping / pong websocket từ trình duyệt


130

Tôi tiếp tục đọc về các tin nhắn ping / pong trong websockets để duy trì kết nối, nhưng tôi không chắc chúng là gì. Đây có phải là một loại khung khác biệt? (Tôi không thấy bất kỳ phương thức nào trên đối tượng WebSocket javascript trong chrome liên quan đến bóng bàn). Hoặc nó chỉ là một mẫu thiết kế (ví dụ: tôi thực sự gửi "ping" hoặc bất kỳ chuỗi nào khác đến máy chủ và yêu cầu nó phản hồi). Là bóng bàn ở tất cả liên quan đến khung tiếp tục?

Lý do tôi hỏi là tôi đang sử dụng khung python chạy phía sau Mongrel2, vì vậy tôi tự hỏi liệu có cách nào để gửi cho Mongrel2 một thông điệp ping / pong cụ thể để bảo vệ kết nối mà không cần ứng dụng python của tôi không lo lắng về nó. Tương tự như việc có một phương thức HTTP riêng cho nó, tôi đoán vậy. Và tôi tưởng tượng một khung tin nhắn ping / pong chuyên dụng có thể đơn giản hơn (tải ít hơn trên máy chủ và mạng) so với chuỗi "ping", mặc dù điều đó có lẽ sẽ không quá quan trọng.

EDIT: Tôi chỉ nhìn vào RFC 6455 và có vẻ như Ping và Pong chắc chắn là các loại khung điều khiển với các opcode riêng của chúng. Vậy làm cách nào để gửi khung Ping từ javascript trong Chrome?


Chỉ cần ping từ máy chủ. Mọi người đều biết về sự cố mạng trên các cổng không chuẩn, vì vậy họ bắt đầu ping theo các khoảng thời gian ngắn thông thường. Tôi đoán bạn có thể ping một máy chủ được viết kém, nhưng nó có thể không quá thông minh để làm bất cứ điều gì nhạy cảm với chúng.


@ user1382306 ping từ máy chủ trước tiên sẽ sử dụng pin thiết bị di động sử dụng rất nhanh. Ping từ khách hàng có thể tiết kiệm pin thiết bị.
người đàn ông bằng đồng

@ user1382306 Không phải ai cũng vậy! Vấn đề mạng trên các cổng không chuẩn là gì?
HappyDog

Câu trả lời:


120

Không có API Javascript để gửi khung ping hoặc nhận khung pong. Điều này được hỗ trợ bởi trình duyệt của bạn, hoặc không. Cũng không có API để kích hoạt, định cấu hình hoặc phát hiện xem trình duyệt có hỗ trợ và đang sử dụng khung ping / pong hay không. Đã có cuộc thảo luận về việc tạo API ping / pong Javascript cho việc này. Có khả năng ping có thể được cấu hình / phát hiện được trong tương lai, nhưng không chắc là Javascript sẽ có thể trực tiếp gửi và nhận các khung ping / pong.

Tuy nhiên, nếu bạn kiểm soát cả mã máy khách và mã máy chủ, thì bạn có thể dễ dàng thêm hỗ trợ ping / pong ở mức cao hơn. Bạn sẽ cần một số loại tiêu đề / siêu dữ liệu trong tin nhắn nếu bạn chưa có, nhưng điều đó khá đơn giản. Trừ khi bạn có kế hoạch gửi ping hàng trăm lần mỗi giây hoặc có hàng ngàn khách hàng đồng thời, chi phí sẽ rất nhỏ để tự làm điều đó.


1
@bigmugcup Liên kết đã chết
Ông Jo

19

Ping có nghĩa là chỉ được gửi từ máy chủ đến máy khách và trình duyệt sẽ tự động trả lời càng sớm càng tốt với Pong OpCode. Vì vậy, bạn không phải lo lắng về điều đó ở cấp độ cao hơn.

Mặc dù không phải tất cả các trình duyệt đều hỗ trợ tiêu chuẩn như họ cho là vậy, nhưng chúng có thể có một số khác biệt trong việc thực hiện cơ chế như vậy và thậm chí có thể có nghĩa là không có chức năng phản hồi của Pong. Nhưng cá nhân tôi đang sử dụng Ping / Pong và chưa bao giờ thấy máy khách nào không triển khai loại OpCode này và phản hồi tự động khi triển khai phía máy khách cấp thấp.


73
Bạn đã đọc ping ở đâu từ máy chủ đến máy khách? RFC nói "Điểm cuối có thể gửi khung Ping bất cứ lúc nào sau khi kết nối được thiết lập và trước khi kết nối được đóng lại."
xryl669

7
Nếu bạn muốn máy khách tự động phát hiện trạng thái ngắt kết nối (khi không nhận được gói RST / FIN nào, nhưng mạng đã bị ngắt kết nối), thì bạn cũng cần phải có máy khách khởi tạo gói ping.
pschwamb

13
TCP không thông báo ngắt kết nối khi các gói RST / FIN không được nhận. TCP chỉ phát hiện các kết nối bị mất khi người gửi cố gắng gửi trên một kết nối bị ngắt kết nối. Ping được sử dụng như nhịp tim trong nhiều ứng dụng và đó là cách sử dụng hợp lệ. Một kết nối chết sẽ chỉ đơn giản là chết vĩnh viễn cho đến khi khách hàng cố gắng gửi. Do đó, với WebSockets trên trình duyệt, phải sử dụng thông báo ping (hoặc nhịp tim) tùy chỉnh để phát hiện ngắt kết nối máy khách ở phía máy khách. Máy chủ có thể đang cố gắng ping và phát hiện ngắt kết nối máy khách, nhưng máy khách không được thông báo. Ping khách hàng cũng tốt.
DDS

15
Trong RFC 6455, Giao thức WebSocket, nó tuyên bố rõ ràng: "LƯU Ý: Khung Ping có thể đóng vai trò là vật giữ hoặc là phương tiện để xác minh rằng điểm cuối từ xa vẫn phản hồi."
DDS

4
Có thể ping chỉ dành cho máy chủ là một cách được khuyến nghị khi các tác nhân người dùng thường xuyên được làm mới. Nhưng bây giờ nhiều trang web được thiết kế như các SPA. Trong môi trường này, ứng dụng khách có thể thường xuyên ping máy chủ để đảm bảo kết nối không bị mất.
Noel Abrahams
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.