웹 서버 구현기 2-3 TCP/IP: TCP 연결의 우아한 종료

Plato·2023년 6월 10일
0

웹서버 구현기

목록 보기
9/11

TCP는 연결 지향형 프로토콜이기 때문에 데이터를 송수신하기 전에는 연결을 생성하고 데이터의 송수신이 완료된 후에는 연결을 종료해야한다. 이번 글에서는 연결을 종료하는 방법에 대해 살펴보자.

close

소켓또한 파일이기 때문에, close 시스템 함수를 통해 소켓을 닫아서 연결을 종료할 수 있다. 하지만 close 시스템 함수를 통해 연결을 종료하면, input 스트림과 output 스트림 두 개를 전부 다 닫는다. 서버가 연결의 종료를 원하는 상황을 가정해보자(서버가 아니라 클라이언트여도 동일하다). 서버는 클라이언트의 요청에 잘 응답했다고 판단했기에 연결을 종료시키고자 하는 것일거다. 서버가 연결을 종료한 이후에, 클라이언트가 추가적으로 보냈어야 할 데이터가 서버에 도달하게 되면 연결이 이미 종료됐기 때문에 read 함수를 통해 이 데이터를 읽을 수 없다.

그렇다면 연결을 우아하게 종료할 좋은 방법이 없을까? 물론 있다.

Half-close

그것은 절반만 닫는 것이다. 위 시나리오에서 서버는 더 이상 보낼 데이터가 없다고 판단하기 때문에 output 스트림을 닫고 input 스트림은 닫지 않으면 된다. 이는 shutdown 함수를 통해 할 수 있다.

int shutdown(int sock, int howto);

howto 인자를 통해 종료할 대상을 명시할 수 있다.

  1. SHUT_RD: 입력 스트림 닫기
  2. SHUT_WR: 출력 스트림 닫기
  3. SHUT_RDWR: 입출력 스트림 닫기

shutdown 함수를 통해 출력 스트림만 닫더라도 상대방에게 EOF를 전달할 수 있다. 이는 파이프에서 write단을 닫아버리면 read단에 EOF가 전달되는 것과 동일하다.

0개의 댓글