본문 바로가기
Develop/Network

[윤성우의 열혈 TCP/IP 소켓 프로그래밍] Chapter07 - 내용 확인 문제 풀이

by Tarra 2023. 6. 29.

 

 

 

 

 [윤성우의 열혈 TCP / IP 소켓 프로그래밍] 책을 기반으로 개인적으로  문제 풀이 및 개념을 정리한 내용입니다.

모든 소스 코드와 강의, 확인 문제의 정확한 답안은 (23년 7월 1일부터 전면 무료화 예정)

http://www.orentec.co.kr/

 

====== 오렌지 미디어 ======

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

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

 

TCP에서의 "스트림"은 데이터의 흐름을 의미한다. TCP는 연결 지향적인 프로토콜로서, 데이터를 바이트 단위로 분할하지 않고, 송신자가 전송한 데이터를 수신자가 동일한 순서로 받을 수 있도록 보장한다. 이로 인해 TCP는 데이터를 일련의 연속적인 스트림으로 처리한다.

 

TCP에서의 스트림 형성은 다음과 같은 특징을 가지고 있다.

1. 연속성 

2. 순차성

3. 신뢰성

 

반면에 UDP는 비연결 지향적인 프로토콜로서, 데이터그램 단위로 독립적으로 처리된다.

UDP에서는 데이터의 연속성을 보장하지 않고, 순서와 관계없이 독립된 패킷으로 처리한다.

UDP는 데이터의 신뢰성을 보장하지 않고, 패킷 손실이나 오류가 발생할 경우 재전송을 수행하지 않는다.

이로 인해 UDP에서는 스트림 형성이라고 할 수 있는 요소가 없다.

 

더보기

모범 답안

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

그리고 UDP의 경우는 스트림의 형성 과정이 존재하지 않는다. 두 소켓이 서로 연결된 상태에 놓이지 않기 때문이다.

 

 

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

 

1. Half-Open 연결 문제

일방적인 종료를 통해 소켓을 닫을 경우, 해당 소켓이 연결된 상대방 소켓에게 아직 데이터가 도착하지 않았는지 확인 할 수 없다. 

이로 인해 Half-Open 연결 상태가 발생할 수 있다.

상대방 소켓은 여전히 데이터를 보낼 수 있으며, 종료된 소켓은 이를 처리할 준비가 없기 때문에 예기치 않은 동작이 발생할 수 있다.

 

2. 데이터 손실

일방적인 종료를 통해 소켓을 닫을 경우, 아직 송신 버퍼에 있는 데이터가 상대방에 도달하지 못하고 손실될 수 있다. 

상대방은 이 데이터를 받지 못하게 되며, 데이터의 일부 또는 전체가 손실될 수 있다.

 

3. 타이밍 문제

일방적인 종료로 인해 소켓이 닫히면, 종료된 소켓은 더 이상 데이터를 받거나 보낼 수 없다.

그러나 상대방이 아직 데이터를 보내고자 할 때, 종료된 소켓으로 데이터를 보내려고 시도하게 된다. 

이 경우 데이터 전송은 실패하게 되며, 상대방은 이를 처리하지 못하고 에러를 발생시킬 수 있다.

 

더보기

모범 답안

일방적인 종료는 소켓을 완전히 종료시켜서 데이터의 송수신이 모두 불가능한 상태로 만드는 것을 의미한다.

보통 자신이 전송할 데이터를 전부 전송한 다음에 일방적인 종료를 하게 되는데,

만약에 상대방이 전송할 데이터가 남아있는 경우에는 문제가 될 수 있다.

 

 

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

 

Half-close (반 폐쇄)는 TCP 소켓에서 사용되는 개념으로, 한쪽의 송신 스트림 또는 수신 스트림 중 하나를 종료하는 동작을 의미한다.

반 폐쇄는 소켓 연결을 종료하지 않고 한 쪽의 데이터 흐름을 중단하는 방식이다.

 

Half-close를 진행한 호스트는 출력 스트림의 상태에서 일부를 종료하므로, 여전히 입력 스트림은 열려있는 상태이다.

즉, 호스트는 데이터를 계속 수신할 수 있지만 더 이상 데이터를 송신할 수 없게 된다.

 

출력 스트림의 Half-close 결과로 상대 호스트는 EOF 메시지를 수신한다.

이는 송신 측에서 더 이상 데이터를 전송하지 않을 것임을 의미한다. 수신 측은 EOF를 수신하고 이를 처리함으로써 데이터의 끝을 인식하고 작업을 마무리할 수 있다. 

 

더보기

모범 답안

Half-close란 입력 스트림과 출력 스트림 둘 중 하나만 종료하는 것을 의미한다.

그리고 출력 스트림에 대해서 Half-close를 진행하면, 상대 호스트로는 EOF가 전송되고, Half-close를 진행한 소켓은 데이터의 전송은 불가능하지만 상대 호스트가 전송한 데이터의 수신은 가능한 상태가 된다.

 

 

 


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

https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com