티스토리 뷰

IT/Network

[네트워크] half-close란 ?

주인장 진빼이

서론

소켓을 통해서 호스트 간 연결이 성립되면 데이터 송수신이 가능한 상태가 된다.

이러한 상태를 가리켜 " 스트림이 형성된 상태 "라고 한다.

다음 그림처럼 양방향 통신이 진행되어야 하기 때문에 소켓 통신에서 스트림은 또한 양방향으로 이루어져있다.

한 호스트의 입력(recv)은 다른 호스트의 출력(send)을 통해 이어진다.

반대로 한 호스트의 출력(send)은 다른 호스트의 입력을 통해 이어진다고 볼 수 있다.

 

지금까지 TCP 통신을 할 때 closesocket() 함수를 호출하여 소켓을 닫았다.

이 함수는 두 호스트 간에 연결을 완전히 종료시키고, 남아 있는 데이터도 송수신이 불가능하다.

 

half-close를 사용하면 두 호스트 간 연결이 성립(ESTABLISH)된 스트림을 반만 닫는 다는 의미이고

이는 데이터 송신은 가능하지만, 수신은 불가능한 상황이거나 수신은 가능하지만 전송은 불가능한 상황을 말한다.

 

소켓 통신이 이루어 질 때 요청을 받아 송신하는 호스트(Server)는 필요한 파일 및 데이터를 언제까지 송신하는지 알 수 있다.

하지만 수신하는 호스트(Client)는 Server가 언제까지 데이터를 송신하고 있는지에 대해 알 수 없다.

계속해서 데이터를 수신하는 recv() 함수를 호출했다간 블록킹 상태에 빠질 수 있다.

이때 half-close를 통해 마지막 송신 시점을 정확히 Client가 확인할 수 있다.

 

half-close가 필요한 이유

half-close를 사용하는 이유는 마지막 데이터의 송신 시점을 확인하기 위해서이다.

 

" 데이터를 송신하는데 마지막 송신 시점을 알려면 굳이 half-close를 사용해야 하는가? "

" 마지막 송신 시점에 대한 시그널 데이터를 포함해서 데이터를 송신하면 수신하는 호스트가 이를 확인하면 되지 않은가? "

half-close를 무조건 쓰라는 의미는 아니다. 하지만 사용자 정의 프로토콜이 겹칠 수도 있고 문제가 발생할 수 있기에 안전하게 데이터를 전송하고, 마지막 데이터 송신 시점을 확인 후 연결 종료할 수 있다.

 

마지막 송신을 의미하는 시그널 데이터를 보낼 수는 있다. 만약 스트림을 통해 파일을 주고 받는다면 파일 바이너리 데이터에 시그널 데이터가 포함되어 있으면 문제가 발생할 위험이 있어 시그널 데이터를 전송하는 것은 위험하다.

 

half-close 사용하기

half-close를 사용하려면 shutdown() 함수를 호출 해야 한다.

shutdown() 함수를 호출 시에 소켓은 더 이상 데이터를 송수신할 수 없다. (ICMP 오류 패킷은 생성되지 않음)

매개변수로는 종료 대상의 소켓 식별자(핸들)과 종료할 스트림의 상수값을 전달합니다.

함수가 성공적으로 호출됬다면 0을 반환하고 그 밖에는 SOCKET_ERROR(-1) 상수를 반환합니다.

 

shutdown() 함수는 소켓의 데이터 송수신 기능을 비활성화시키지만, 소켓을 닫아 주는 함수를 호출(closesocket)하여 소켓의 리소스를 반납하는 것은 아니다.

int shutdown(
  SOCKET s,
  int    how
);
상수 목록 설명
SD_RECEIVE 출력 스트림 우선 종료
SD_SEND 입력 스트림 우선 종료
SD_BOTH 입출력 스트림 종료

만약 매개변수로 SD_SEND를 전달한 경우 send() 함수는 더 이상 작동하지 않으며, 수신하는 호스트에게 버퍼에 남아 있는 모든 데이터가 송신된 후 FIN 메시지가 발생된다. 반대로 SD_RECEIVE를 전달한 경우 recv() 함수는 더 이상 작동하지 않으며, 버퍼에 남아 있는 데이터를 모두 수신한다.

SD_BOTH는 shutdown() 함수를 SD_SEND, SD_RECEIVE 각각 매개변수로 전달하여 호출한 것과 동일하다. (2번 호출)

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함