TCP 연결 유지 기능만으로 부족한 이유
TCP 자체에도 연결 유지 기능이 있지만 운영체제 기본값은 분에서 시간 단위이고 프로세스별로 조정하기도 어려워. 애플리케이션 수준의 ping/pong 은 우리가 조건을 정할 수 있어. 예를 들어 30초마다 ping 을 보내고 5초 안에 pong 이 오지 않으면 닫는 식이야.
조용히 반쯤 열린 연결 찾아내기
세션 중 노트북 덮개를 닫거나 휴대폰이 와이파이에서 이동통신으로 바뀌거나 NAT 시간 제한이 지나면 서버 소켓은 반쯤 열린 채 남을 수 있어. 커널 버퍼가 바이트를 받아서 send 가 여전히 성공한 것처럼 보이기도 하지. 운영체제의 시간 제한을 기다리는 대신 심박은 이런 상태를 분이 아니라 초 안에 찾아내.
서버와 클라이언트 중 누가 심박을 이끌까
어느 쪽이 시작해도 괜찮아. 서버가 ping 하고 클라이언트가 pong 하는 방식은 서버에 타이머 하나만 두면 돼서 단순해. 클라이언트가 ping 하는 방식은 IoT 나 배터리가 빠듯한 모바일처럼 단순한 클라이언트가 다른 활동이 없을 때 ping 을 건너뛸 수 있어. 하나를 고르고 프로토콜에 문서화해.