본문 바로가기

Golang/etc

tcp/ip - 07 소켓의 종료

728x90
반응형

tcp 프로토콜에서는 소켓의 종료과정이 명확하게 이루어져야 한다. 

그렇지 않으면 양방향 통신을 하고 있는 두 호스트 사이에서 데이터의 손실등의 문제가 발생할 수 있다.

 

리눅스의 close함수는 소켓의 완전 종료를 의미하는데, 이렇게 되면 데이터 송수신이 다 완료되지 않았는데 소켓이 먼저 닫혀버리는 상황이 발생 할 수 있다. 

-> 데이터 소멸 위험

 

따라서 이를 해결하기 위해서는 half-close, 즉 한 방향의 스트림만을 종료시키는 과정이 필요하다. 

 

*Stream? 

소켓을 통해 두 호스트가 연결되면 그 다음부터는 상호간의 데이터 송수신이 가능한 상태가 됨 

-> 스트림이 형성된 상태

 

연결 종료 시에 위 그림처럼 생성된 입출력 스트림 중 하나만 연결을 끊는 것을 half-close라고 한다. 

 

Half-close가 필요한 이유

- 서버가 보낸 데이터를 전부 수신 완료했다는 메시지를 클라이언트가 보내야 하는 경우

-> 파일 데이터가 전부 전송이 되면 마지막에 포함된 EOF (end of file)를 읽어 들인다. / 클라이언트에서 보낸 수신 완료 메시지를 받은 서버에서 소켓을 종료

 

출력이 완료 되면 먼저 출력 스트림만 종료 시키고 클라이언트의 수신완료 메시지는 입력 스트림을 통해 받을 수 있게 열어 두는 것 

= Half-close

728x90
반응형

'Golang > etc' 카테고리의 다른 글

tcp/ip - 09 소켓 옵션  (0) 2022.07.06
tcp/ip -08 DNS  (0) 2022.07.06
golang udp example  (0) 2022.07.03
tcp/ip 05  (0) 2022.07.03
tcp/ip 04  (0) 2022.06.28