-
TCP/IP 소켓 프로그래밍 - 7장 : 소켓의 우아한 연결종료네트워크 2024. 6. 18. 14:27
7장
07-1 TCP 기반의 Half-close
리눅스의 close 함수를 호출하는 것은 완전 종료를 의미한다.
완전 종료는 데이터 전송 및 수신이 더이상 불가능한 상황을 의미한다.
한쪽에서의 일방적인 close는 아래 그림과 같은 경우를 야기할 수 있다.

호스트 A가 마지막 데이터를 전송하고 close함수를 호출하며 연결을 종료한 상황이다.
호출 이후부터는 호스트 A는 호스트 B가 전송하는 데이터를 수신하지 못한다.
이 문제를 해결하기 위해, 스트림의 일부만 종료하는 방법으로,
Half-close를 지원하고 있다.
두 호스트 간에 데이터 송수신 가능한 상태를 ‘스트림이 형성된 상태’라고 한다.

두 호스트 간에 소켓이 연결되면, 각 호스트 별로 입력 스트림과 출력 스트림이 형성된다.
한 호스트의 출력 스트림은 다른 호스트의 입력 스트림과 이어지고,
한 호스트의 입력 스트림은 다른 호스트의 출력 스트림과 이어진다.
close함수는 두 스트림을 동시에 끊어버리는 함수이다.
half-close에 사용되는 함수 : shutdown
#include <sys/socket.h> int shutdown(int sock, int howto); //성공 시 0, 실패 시 -1 리턴 //howto : 종료 방법에 대한 매개변수종료 방법은 위 함수의 두 번째 매개변수의 인자로 결정된다.
- SHUT_RD : 입력 스트림 종료
- SHUT_WR : 출력 스트림 종료
- SHUT_RDWR : 입출력 스트림 종료
입력 스트림을 종료하면 ( SHUT_RD ) , 더 이상 데이터를 수신할 수 없다.
입력 관련 함수의 호출이 허용이 안된다.
출력 스트림을 종료하면 ( SHUT_WR ) , 더 이상 데이터 전송이 불가능해진다.
다만, 출력 버퍼에 남아있는 데이터는 목적지로 전송된다.
Half-close가 필요한 이유
서버는 파일의 전송이 끝났음을 알리는 목적으로 EOF를 마지막에 전송해야 한다.
서버가 출력 스트림을 종료하게 되면, 클라이언트로 EOF가 전송이 된다.
half-close를 하게 되면,
- 클라이언트에 파일 전송이 끝났음을 알리는 EOF 전송
- 서버는 클라이언트로부터 여전히 데이터를 수신할 수 있게 된다.
'네트워크' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 - 9장 : 소켓의 다양한 옵션 (0) 2024.06.19 TCP/IP 소켓 프로그래밍 - 8장 : 도메인 이름과 인터넷 주소 (0) 2024.06.18 TCP/IP 소켓 프로그래밍 - 6장 : UDP 기반 서버/클라이언트 (0) 2024.06.18 TCP/IP 소켓 프로그래밍 - 5장 : TCP 기반 서버/클라이언트 2 (0) 2024.06.17 TCP/IP 소켓 프로그래밍 - 4장 : TCP 기반 서버/클라이언트 (2) 2024.06.16