TCP/IP에서의 클라이언트와 연결은 3 way handshake라는 규칙이 만족되면
연결이 되었다고 서버와 클라가 주관적으로 판단하는 것으로, 단순히 논리적인 통신 채널이 확보된 상태라고 정의 할 수 있다.
다시 말해 서버 입장에서는 accept 함수가 리턴되고, 클라 입장에서는 connect 함수가 리턴을 하면 연결됐다라고 할 수 있는 것이다.
물리적인 통신 채널이 아닌 논리적인 통신 채널이 확보된 상태이기 때문에
TCP 연결이 끊어졌다는 것을 인지할 때 상황에 따라 다르다.
일반적인 정상적인 종료는 클라에서 FIN 패킷을 보내 연결증 종료하면 서버가 이를 수신하고,
4 way handshake를 우아한 종료를 진행하며 이를 통해 연결 해제를 명확히 감지할 수 있다.
하지만 클라가 랜케이블을 뽑거나 블루스크린처럼 갑자기 다운되는 경우, FIN이나 RST 신호를 보내지 못하므로
서버는 클라가 연결이 끊겼는지 즉시 알 수 없다.
이를 보완하기 위해 서버에서 아래와 같은 방법들을 사용한다.
- TCP Keep-Alive 설정 : 일정시간 동안 응답이 없으면 OS 수준에서 연결을 끊는다.
- Heartbeat / ping : L7 단계에서 주기적으로 메시지를 보내, 응답이 없으면 연결 해제가 되었다고 판단한다.
- 데이터 통신이 원활히 이루어지고 있을 경우에는 굳이 Heartbeat를 주고 받을 필요 없기 때문에 이를 고려해 코드를 작성해야한다.
앞서 언급한 내용처럼 TCP에서의 연결은 착각이라고도 생각할 수 있겠다.
서버에서는 클라와 연결중이라고 생각 할 수 있지만,
클라가 랜케이블을 뽑았는지, 블루스크린이 떳는지 알 방법이 없기 때문이다.
따라서 클라이언트와의 연결은 단순한 통신 가능 여부를 넘어서, 식별 가능성, 상태 추적 까지 포함된 개념이라고 봐야한다.
'네트워크' 카테고리의 다른 글
[네트워크] 파일 송신 (0) | 2025.04.20 |
---|---|
[네트워크] TCP 장애 유형 (0) | 2025.04.20 |
[네트워크] select (0) | 2025.04.17 |
[네트워크] I / O 멀티플렉싱 (0) | 2025.04.17 |
[네트워크] 우아하지 않은 비정상 종료 (0) | 2025.04.14 |