안녕하세요. 이제 막 네트워크 공부에 흥미가 들린 직장인입니다.
네트워크 어플리케이션(TCP)을 개발하는 도중 궁금한 것이 있어 두가지 정도를 여쭙고자 글을 쓰게 되었습니다.
통신 도중 서버를 끊게 되면, 클라이언트 프로그램에서 그것을 거의 실시간으로 감지하게 되던데, 그 원리가 궁금합니다.
1. TCP 소켓을 생성 후 서버와 클라이언트가 연결된 경우, socket을 close하지 않고 대기하고 있다면, 연결 유지를 확인하기 위하여, 실제 전송하기 위한 데이터가 아닌TCP 프로토콜 적으로 지속적인 데이터 세그먼트를 날리는 지요(ex:일정 시간간격으로 연결이 유지되고 있는지 확인)??
아니면, 프로그램이 멈추게 되면, 멈춘것에 대하여, 상대방에게 그 순간 종료되엇다는 End 세그먼트를 보내는 것인지요?
2. 만약 유지하기 위하여 지속적인 세그먼트를 전송 한다면, 이 세그먼트들을 전송하는 과정에서 만약 단말기가 핸드폰이라면 데이터 요금으로 측정되게 되나요??
읽어 주셔 감사합니다.^^
의견을 드립니다.
1.
가) TCP 프로토콜적으로 지속적인 데이타 세그먼트를 날리는 기능으로 TCP Keepalive 라는 기능이 있습니다.
일종의 TCP를 이용한 PING이라고 보시면 되고 이 기능을 사용하면 일정 시간 내에서 상대방이 단절되었다는
것을 확인할 수 있습니다. (실시간 단절 감지는 되지 않고 일반적인 경우에는 잘 사용하지 않습니다)
나) TCP에서 실시간으로 감지가 된다는 것은 한쪽 (예를 들면 TCP Client) 에서 소켓을 종료하면 FIN 또는 RST가
상대방 (TCP Server)으로 전송되고, 상대방 (TCP Server)은 이 메세지를 받으면 반대편 (TCP Client)가 연결을 종료했다는 것을 거의 실시간으로 알 수 있습니다. (질문하신 실시간은 이 부분이 아닐까 생각되나 정확한 것은 패킷 캡쳐
해서 보시면 됩니다)
다) 또는 프로그램 개발자가 TCP 상위 계층에서 임의로 헬스체크 패킷을 정의해 만들어 넣는 경우도 있습니다
2.
일반적으로 사업자는 TCP 제어 메세지를 제외한 데이타에 대해서만 과금을 합니다만
가)의 KeepAlive는 실제 ACK 메세지로 만든 것이므로 제어 메세지로 보고 과금이 안되는 게 맞긴 하지만
패킷 과금 주체인 PGW가 실제 이 패킷을 제어 메세지로 볼 지는 명확하지 않습니다.
하지만 나)에서 사용되는 FIN, RST는 명확한 제어 메세지이기 때문에 과금 대상에서 제외될 겁니다
(검증을 해 본적은 없으며, 사업자마다 다를수도 있음)
다)의 프로그래머가 임의로 만든 헬스체크 패킷은 TCP 입장에서는 명확한 사용자 데이타이기 때문에 과금됩니다.