← 질문 목록
#29깊이 0
TCP 연결 종료는 왜 대개 네 번 주고받는가?
양방향 연결을 각각 독립적으로 닫아야 하기 때문이다. TCP는 전이중(Full-Duplex) 통신을 지원하므로 송신과 수신 경로가 별개로 동작한다. 한쪽이 연결을 끊고자 해도 다른 한쪽은 여전히 데이터를 보내는 중일 수 있어서 두 경로를 따로 닫아야 한다.
4-way handshake는 양방향 경로를 순차적으로 정리하는 흐름을 따른다.
- 1. A에서 B로: FIN (나 더 이상 보낼 데이터 없어)
- 2. B에서 A로: ACK (확인했어, 하던 일 마저 보낼게)
- 3. B에서 A로: FIN (나도 이제 더 보낼 데이터 없어)
- 4. A에서 B로: ACK (확인했어, 정말 끝낼게)
네 단계가 되는 것은 B의 ACK와 FIN이 따로 나갈 때다. 보낼 데이터가 남았거나 애플리케이션이 늦게 닫으면 그렇게 갈라진다. B가 곧바로 닫으면 ACK와 FIN이 한 세그먼트로 합쳐져 3단계로 끝나기도 한다.
반이중(Half-Close) 상태가 남은 데이터를 지킨다.
소켓 API에서는 close()와 shutdown()의 차이로 이어진다.
close()는 디스크립터를 반납한다. 마지막 참조였다면 송수신이 함께 끝난다.
shutdown()은 인자로 닫을 방향을 고른다. Half-Close는 송신만 닫는 shutdown(SHUT_WR)로 만든다.