본문 바로가기
Programming/열혈 TCP, IP 소켓 프로그래밍(저자 윤성우)

Ch 07. 내용 확인문제

by minjunkim.dev 2020. 8. 8.

    모든 내용은 [윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!


1. TCP에서의 스트림 형성이 의미하는 바가 무엇인지 설명해보자. 그리고 UDP에서도 스트림이 형성되었다고 할 수 있는 요소가 있는지 없는지 말해보고, 그 이유에 대해서도 설명해보자.

 

- TCP에서의 스트림 형성은 두 소켓이 서로 연결되어서 데이터를 송수신할 수 있게 된 상태를 의미한다.

(TCP는 데이터 송수신을 위해 1:1 연결이 되어야 한다는 것을 기억하자)

- UDP의 경우는 스트림 형성과정이 존재하지 않는다. UDP는 소켓이 서로 연결되어 있는 상태에서 데이터 송수신을 하는 것이 아니기 때문이다.

 

2. 리눅스에서의 close 함수 또는 윈도우에서의 closesocket 함수 호출은 일방적인 종료로써 상황에 따라서 문제가 되기도 한다. 그렇다면 일방적인 종료가 의미하는 바는 무엇이며, 어떠한 상황에서 문제가 되는지 설명해 보자.

 

- 일방적인 종료는 소켓을 완전히 종료시켜서, 입출력스트림 둘다 연결을 끊어 데이터 송수신이 모두 불가능한 상태가 된다.

 

- 출력 스트림을 종료하더라도 출력버퍼에 남아있는 데이터는 목적지로 전송이 되나, 입력 스트림을 종료하면 데이터가 입력버퍼에 남아있더라도 데이터를 수신 할 수 없다.

 

- 한 호스트가 전송할 데이터를 전부 전송한 후에 일방적 종료를 했는데, 만약 상대 호스트가 전송할 데이터가 남아있었다면, 이를 수신할 수 없게 된다.

 

# close(리눅스) / closesocket(윈도우) => 완전 종료를 의미(데이터 송수신이 양쪽 다 불가능한 상황을 의미)
- 한 호스트의 일방적 연결종료는 의도치 않은 데이터 소멸을 야기할 수 있음
- 이를 위해 Half-close(스트림의 일부만 종료) 존재

 

3. Half-close는 무엇인가? 그리고 출력 스트림에 대해서 Half-close를 진행한 호스트는 어떠한 상태에 놓이게 되며, 출력 스트림의 Half-close 결과로 상대 호스트는 어떠한 메시지를 수신하게 되는가?

 

- 두 소켓 간에 스트림이 형성되면, 양방향 통신을 위해 두 개의 입출력 스트림이 생성된다. (즉, 한 호스트마다 1개의 입출력 스트림이 각각 생성됨) Half-close는 한 호스트가 자신의 입출력스트림 중 하나만 종료하는 것을 의미한다. 

 

- 출력 스트림에 대해 Half-close를 하면 상대 호스트에게 EOF가 전송되고, 상대 호스트는 이를 수신한다. 출력 스트림에 대해 Half-close를 한 소켓은 더이상 데이터 전송은 불가능하지만, 상대 호스트에게 데이터 수신은 여전히 가능한 상태이다.


 

[출처] : 윤성우 저, "열혈강의 TCP/IP 소켓 프로그래밍", 오렌지미디어