TCP keepalive 로 부족한 이유
TCP 자체 keepalive 있는데, OS default 가 분-시간 단위, 프로세스별 튜닝 거의 불가. application-level ping/pong 은 우리 조건으로 — 30초마다 ping, 5초 안에 pong 기대, 안 오면 close.
조용한 half-open connection 감지
session 중간 노트북 lid 닫힘, 폰이 wifi 에서 cellular 로 switch, NAT timeout: 다 서버쪽 socket 을 send 가 여전히 성공한 듯 보이는 (커널 buffer 가 byte 받음) 상태로 남겨. OS 가 결국 timeout 할 때까지. heartbeat 가 분이 아니라 초에 잡아.
서버 vs 클라 heartbeat
어느 쪽이 driving 해도 ok. 서버 driven (서버 ping, 클라 pong) 이 더 단순 — 서버에 타이머 하나. 클라 driven (클라 ping, 서버 pong) 은 멍청한 클라 (IoT, battery 빡센 모바일) 가 다른 거 안 일어날 때 ping skip 가능. 하나 골라 protocol 에 문서화.