WebSockets ping / pong, TCP keepalive가 아닌 이유는 무엇입니까?
WebSocket 에는 다른 쪽 끝이 퐁으로 응답해야하는 다른 쪽 끝으로 핑을 보내는 옵션 이 있습니다.
Ping 프레임을 수신 한 엔드 포인트는 이미 Close 프레임을 수신하지 않은 경우 응답으로 Pong 프레임을 전송해야합니다. 가능한 한 빨리 퐁 프레임으로 응답해야합니다 (SHOULD).
TCP 는 킵 얼라이브 형태로 비슷한 것을 제공합니다 .
데이터가없고 ACK 플래그가 켜져있는 연결 유지 프로브 패킷을 피어에 보냅니다. TCP / IP 사양 때문에 일종의 중복 ACK로이 작업을 수행 할 수 있으며 TCP는 스트림 지향 프로토콜이므로 원격 끝점에는 인수가 없습니다. 반면에 데이터와 ACK 세트가없는 원격 호스트 (keepalive를 전혀 지원할 필요가없는 TCP / IP 만 지원)로부터 응답을받습니다.
TCP keepalive는 사용자 공간까지 데이터를 전송하고, 웹 소켓 프레임을 구문 분석하고, 응답 프레임을 만들고, 전송을 위해 다시 커널에 전달할 필요없이 커널 내에서 처리 할 수 있기 때문에 더 효율적이라고 생각합니다. 또한 네트워크 트래픽이 적습니다.
또한 WebSocket 은 항상 TCP를 통해 실행되도록 명시 적으로 지정 됩니다. 전송 계층에 구애받지 않으므로 TCP keepalive는 항상 사용할 수 있습니다.
WebSocket 프로토콜은 독립적 인 TCP 기반 프로토콜입니다.
그렇다면 TCP keepalive 대신 WebSocket 핑 / 퐁을 사용하려는 이유는 무엇입니까?
TCP Keepalive의 문제점은 다음과 같습니다.
- 기본적으로 꺼져 있습니다.
- Ping / Pong 프로토콜이 제공하는 주문형 대신 기본적으로 2 시간 간격으로 작동합니다.
- 그것은 끝에서 끝까지가 아니라 프록시 사이에서 작동합니다.
EJP의 답변 외에도 HTTP 프록시 메커니즘과 관련이 있다고 생각합니다. Websocket 연결은 (HTTP) 프록시 서버를 통해 실행할 수도 있습니다. 이러한 경우 TCP keepalive는 종단 간 연결이 아닌 프록시까지의 연결 만 확인합니다.
http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames
.3.4 Ping 및 Pong 프레임
WebSocket 프로토콜 사양은 연결 유지, 하트 비트, 네트워크 상태 프로빙, 대기 시간 계측 등에 사용할 수있는 Ping 및 Pong 프레임을 정의 합니다. 현재 API에 노출되어 있지 않습니다.
사용자 에이전트는 예를 들어 로컬 네트워크 NAT 매핑을 유지하거나 실패한 연결을 감지하거나 사용자에게 대기 시간 메트릭을 표시 하려는 시도에서 원하는대로 핑 및 요청하지 않은 퐁 프레임을 보낼 수 있습니다 . 사용자 에이전트는 서버를 지원하기 위해 핑 또는 요청하지 않은 퐁을 사용해서는 안됩니다. 서버는 서버의 필요에 따라 적절할 때마다 퐁을 요청한다고 가정합니다.
WebSocket은 RTC를 염두에두고 개발되었으므로 핑 / 퐁 기능을 살펴보면 지연 시간을 측정하는 방법도 있습니다. 퐁이 핑과 동일한 페이로드를 반환해야한다는 사실은 타임 스탬프를 전송 한 다음 클라이언트에서 서버로 또는 그 반대로 지연 시간을 계산하는 것이 매우 편리합니다.
TCP keepalive는 웹 프록시를 통해 전달되지 않습니다. 웹 소켓 핑 / 퐁은 웹 프록시를 통해 전달됩니다. TCP keepalive는 TCP 엔드 포인트 간의 연결을 감독하도록 설계되었습니다. 웹 소켓 끝점은 TCP 끝점과 동일하지 않습니다. 웹 소켓 연결은 두 개의 웹 소켓 끝점 사이에 여러 TCP 연결을 사용할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/23238319/websockets-ping-pong-why-not-tcp-keepalive
'Nice programing' 카테고리의 다른 글
배경 이미지 위에 CSS 그라데이션 사용 (0) | 2020.11.23 |
---|---|
xcode 5.1의 Arm64 아키텍처 (0) | 2020.11.23 |
쉽고 간단하게 Java에서 LRU 캐시 사용 (0) | 2020.11.23 |
MySQL select 문에서 조건문을 어떻게 작성합니까? (0) | 2020.11.23 |
JToken (또는 문자열)을 주어진 유형으로 변환 (0) | 2020.11.23 |