브라우저에서 웹 소켓 핑 / 퐁 프레임 보내기


130

연결을 유지하기 위해 웹 소켓에서 핑 / 탁구 메시지에 대해 계속 읽었지만 그 내용이 확실하지 않습니다. 고유 한 프레임 유형입니까? (핑퐁과 관련된 크롬의 Javascript WebSocket 객체에는 메소드가 표시되지 않습니다). 또는 디자인 패턴 일뿐입니다 (예 : 문자 그대로 "ping"또는 다른 문자열을 서버에 보내고 응답하도록합니다). 탁구가 연속 프레임과 관련이 있습니까?

내가 묻는 이유는 Mongrel2 뒤에서 실행되는 Python 프레임 워크를 사용하고 있기 때문에 Mongrel2에 특정 Ping / Pong 메시지를 보내어 Python 앱이 필요없이 연결을 유지하도록 지시하는 방법이 있는지 궁금합니다. 그것에 대해 걱정하십시오. 별도의 HTTP 메소드가있는 것과 비슷하다고 생각합니다. 그리고 전용 핑 / 퐁 메시지 프레임이 문자열 "ping"보다 간단 할 수 있지만 (서버 및 네트워크의로드가 적을 수 있음) 너무 중요하지는 않다고 생각합니다.

편집 : 방금 RFC 6455를 보았고 Ping과 Pong이 자체 opcode로 제어 프레임 유형 인 것처럼 보입니다. Chrome의 자바 스크립트에서 Ping 프레임을 보내려면 어떻게해야합니까?


서버에서 핑하는 것입니다. 비표준 포트의 네트워킹 문제에 대해 누구나 알고 있으므로 정기적으로 짧은 간격으로 핑을 시작하고 있습니다. 제대로 작성되지 않은 서버를 핑 (ping) 할 수 있다고 생각하지만 민감한 서버를 수행하는 것이 현명하지 않을 수도 있습니다.


@ user1382306 서버에서 ping을 먼저 수행하면 모바일 장치 배터리 사용이 매우 빠릅니다. 클라이언트에서 핑하면 장치 배터리를 절약 할 수 있습니다.
청동 남자

모두가 아닙니다! 비표준 포트의 네트워킹 문제는 무엇입니까?
HappyDog

답변:


121

핑 프레임을 보내거나 퐁 프레임을 수신하는 Javascript API가 없습니다. 브라우저에서 지원하는지 여부입니다. 브라우저가 핑 / 퐁 프레임을 지원하고 사용하는지 여부를 활성화, 구성 또는 감지하는 API도 없습니다. 이를 위해 Javascript ping / pong API 작성대한 토론 이있었습니다. 앞으로 핑을 구성 / 감지 할 수있을 가능성이 있지만 Javascript가 핑 / 퐁 프레임을 직접 보내고받을 수는 없을 것입니다.

그러나 클라이언트 및 서버 코드를 모두 제어하면 핑 / 퐁 지원을 더 높은 수준으로 쉽게 추가 할 수 있습니다. 아직 메시지가 없다면 메시지에 헤더 / 메타 데이터가 필요하지만 매우 간단합니다. 초당 핑을 수백 번 보내거나 수천 명의 동시 클라이언트를 보내려는 경우가 아니라면 직접 수행하기 위해 오버 헤드가 최소화 될 것입니다.


1
@bigmugcup 연결이 끊어졌습니다
Jo

19

Ping은 서버에서 클라이언트로만 전송되도록되어 있으며 브라우저는 Pong OpCode를 사용하여 가능한 빨리 자동으로 응답해야합니다. 따라서 더 높은 수준에서 걱정할 필요가 없습니다.

모든 브라우저가 표준을 지원하는 것은 아니지만 이러한 메커니즘을 구현하는 데 약간의 차이가있을 수 있으며 Pong 응답 기능이 없음을 의미 할 수도 있습니다. 그러나 개인적으로 Ping / Pong을 사용하고 있으며 이러한 유형의 OpCode를 구현하지 않는 클라이언트와 저수준 클라이언트 측 구현에서 자동 응답을 보지 못했습니다.


73
핑이 서버에서 클라이언트로만 있다는 것을 어디에서 읽었습니까? RFC는 "종점은 연결이 설정되고 연결이 종료되기 전에 언제든지 Ping 프레임을 전송할 수있다"고 말합니다.
xryl669

7
클라이언트가 연결 끊김 상태를 자동으로 감지하도록하려면 (RST / FIN 패킷이 수신되지 않았지만 네트워크 연결이 끊어졌을 때) 클라이언트도 핑 패킷을 시작해야합니다.
pschwamb

13
TCP는 RST / FIN 패킷이 수신되지 않은 경우 연결 끊기를 통지하지 않습니다. TCP는 보낸 사람이 연결이 끊어진 연결을 보내려고 할 때 끊어진 연결 만 감지합니다. Ping은 많은 응용 프로그램에서 하트 비트로 사용되며 유효합니다. 연결이 끊어지면 클라이언트가 전송을 시도 할 때까지 계속 연결이 끊어집니다. 따라서 브라우저에서 WebSocket을 사용하면 클라이언트 측에서 클라이언트 연결 끊기를 감지하기 위해 사용자 정의 핑 (또는 하트 비트) 메시지를 사용해야합니다. 서버가 핑을 시도하고 클라이언트 연결 끊기를 감지했지만 클라이언트에게 알리지 않았습니다. 클라이언트 핑도 좋습니다.
DDS

15
RFC 6455의 WebSocket 프로토콜에 다음과 같이 명시되어 있습니다.
DDS

4
사용자 에이전트가 자주 새로 고쳐질 때 서버 전용 핑이 권장되는 방법 일 수 있습니다. 그러나 현재 많은 웹 사이트가 SPA로 설계되었습니다. 이 환경에서는 연결이 끊어지지 않도록 클라이언트 응용 프로그램에서 서버를 정기적으로 ping해야합니다.
Noel Abrahams
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.