본문 바로가기
Develop/Network

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

by Tarra 2023. 6. 29.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

01. TCP보다 UDP가 빠른 이유는 무엇인가? 그리고 TCP는 데이터의 전송을 신뢰할 수 있지만 UDP는 신뢰할 수 없는 이유는 또 무엇인가?

 

1. 연결 설정 및 연결 해제 과정의 부재

TCP는 연결 설정 및 해제를 위한 Three-way handshaking과 Four-way handshaking의 과정을 거친다.

이에 반해, UDP는 연결 설정 과정이 없고, 단순히 데이터를 보내기만 하면 되기 때문에  TCP보다 상대적으로 빠르다.

 

2. 헤더 크기

UDP의 헤더 크기가 TCP의 헤더 크기보다 작다. UDP 헤더에는 소스 포트와 목적지 포트 정보, 그리고 길이 등의 필드만 포함되어 있다.

반면에 TCP 헤더에는 흐름 제어, 혼잡 제어, 순서화 등의 추가적인 정보가 포함되어 있어 더 많은 오버헤드가 발생한다.

 

3. 오류 검출 및 복구 메커니즘의 부재

TCP는 데이터의 신뢰성을 보장하기 위해 오류 검출과 복구 메커니즘을 제공한다.

이를 위해 패킷의 확인 응답 (ACK) 및 재전송 등의 기능을 사용한다. 

UDP는 오류 검출 기능은 제공하지만 복구 기능이 없기 때문에 오류 발생 시 패킷을 재전송하지 않는다.

이로 인해 UDP는 추가적인 처리 과정이 없어 TCP보다 빠르다.

 

TCP가 데이터의 전송을 신뢰할 수 있는 이유는 다음과 같다.

1. 확인 응답 (ACK) 메커니즘

TCP는 데이터 전송 시 수신 측으로부터 확인 응답(ACK)를 받아서 데이터의 정상적인 수신을 확인한다.

만약 확인 응답을 받지 못하면 재전송을 시도하여 데이터의 신뢰성을 보장한다.

 

2. 순서화

TCP는 데이터를 전송할 때 순서화 기능을 제공하여 데이터의 순서를 보장한다. 이를 통해 수신측에서는 데이터를 정확한 순서대로 재조립할 수 있다.

 

UDP가 데이터의 전송을 신뢰할 수 없는 이유는 다음과 같다.

1. 확인 응답 (ACK) 메커니즘이 없음

UDP는 데이터 전송 후 수식측으로부터 확인 응답을 기다리지 않는다.

따라서 데이터의 손실 여부를 확인하거나 재전송을 시도하지 않는다.

 

2. 오류 검출만 제공

UDP는 체크섬을 통해 데이터의 오류를 검출할 수는 있지만, 복구 기능은 제공하지 않는다.

오류가 발생한 경우에도 데이터의 재전송을 시도하지 않으므로 신뢰성이 떨어질 수 있다.

 

더보기

모범 답안

UDP는 TCP와 달리 흐름제어를 진행하지 않는다.

이 흐름제어는 소켓의 연결과 종료, 그리고 데이터 송수신 전반에 걸쳐서 진행되기 때문에 TCP의 데이터 전송은 언제나 신뢰할 수 있다.

반면 UDP는 이러한 흐름제어를 진행하지 않으니, 데이터의 전송을 신뢰할 수 없다. 하지만 UDP는 흐름 제어를 진행하지 않기 때문에 TCP보다 빠른 데이터의 송수신이 가능하다는 이점이 있다.

 

 

02. 다음 중 UDP의 특성이 아닌 것을 모두 고르면?

a. UDP는 TCP와는 달리 연결의 개념이 존재하지 않는다. 따라서 반드시 TCP에서 보인 것처럼 1 대 1의 형태로 데이터를 송수신하지 않을 수 있다.

 

b. UDP를 기반으로 데이터를 전송할 목적지가 두 군데라면, 총 두 개의 소켓을 생성해야 한다. 

UDP는 연결의 개념이 없기 때문에, 한 개의 UDP 소켓을 사용하여 여러 목적지로 데이터를 전송할 수 있다.

 

c. UDP 소켓은 TCP 소켓이 할당한 동일한 번호의 PORT에 재할당이 불가능하다.

PORT 번호는 프로토콜별로 구분되며, 동일한 호스트에서 UDP와 TCP를 동시에 사용하는 경우에도 각각 같은 포트 번호를 사용할 수 있다.

 

d. UDP 소켓과 TCP 소켓은 공존할 수 있다. 따라서 필요하다면 한 호스트상에서 TCP 방식과 UDP 방식의 데이터 송수신을 모두 진행할 수 있다.

 

e. UDP 소켓을 대상으로도 connect 함수를 호출할 수 있는데, 이러한 경우 UDP 소켓도 TCP 소켓과 마찬가지로 Three-way handshaking 과정을 거치게 된다.

UDP에서의 connect 함수는 단순히 소켓에 대한 설정을 하는 용도로 사용되며, Three-way handshaking 과정은 추가되지 않는다.

 

정답은 b, c, e 이다.

 

 

03. UDP 데이터그램이 최종 목적지인 상대 호스트의 UDP 소켓이 전달되는데 있어서, IP가 담당하는 부분과 UDP가 담당하는 부분을 구분지어 설명해보자.

 

IP

- IP는 네트워크 계층에서 동작하는 프로토콜로, 데이터그램을 최종 목적지까지 전달하는 역할을 수행한다.

- IP는 데이터그램을 송신 호스트에서 수신 호스트까지 전달하는 경로를 결정하기 위해 라우팅 기능을 수행한다.

- IP는 데이터그램의 패킷 분할과 조립을 담당한다. 큰 데이터그램이라도 IP는 네트워크의 MTU(Maximum Transmission Unit)에 맞게 적절히 분할하여 전송한다.

- IP는 각 데이터그램에 출발지 IP주소와 목적지 IP 주소를 부여하여 최종 목적지를 식별한다.

 

UDP

- UDP는 전송 계층에서 동작하는 프로토콜로, 데이터그램을 신회성 없이 전송하는 역할을 수행한다.

- UDP는 상위 걔층에서 받은 데이터를 데이터그램 형태로 분할하거나 결합하여 IP에게 전달한다.

- UDP는 각 데이터그램에 출발지 포트 번호와 목적지 호트 번호를 부여하여 최종 목적지의 UDP 소켓을 식별한다.

- UDP는 데이터그램을 송신 호스트에서 네트워크로 전송하고, 수신 호스트에서 네트워크로부터 받은 데이터그램을 UDP 소켓으로 전달한다.

 

요약

IP는 데이터그램의 라우팅과 전송 경로 설정, 패킷 분할 및 조립을 담당하며 ( 네트워크 계층에서 동작 )

UDP는 데이터그램의 신뢰성 없는 전송, 포트 번호를 통한 목적지 식별등을 담당한다. ( 전송 계층에서 동작 ) 

 

+ 데이터그램 - 컴퓨터 네트워크에서 전송되는 데이터의 작은 조각을 의미한다.

 

더보기

모범 답안

IP는 목적지 호스트로의 데이터 전달을 담당한다.

반면 UDP는 목적지 호스트에 전달된 데이터의 PORT번호를 확인해서 최종 목적지인 소켓으로의 데이터 전달을 담당한다.

 

 

04. UDP는 일반적으로 TCP보다 빠르다. 그러나 송수신하는 데이터의 성격에 따라서 그 차이는 미미할 수도 있고, 반대로 매우 클 수도 있다. 그렇다면 어떠한 상황에서 UDP는 TCP보다 매우 좋은 성능을 보이는지 설명해보자.

 

1. 실시간 통신

2. 단방향 통신

3. 소량 데이터 전송

4. 네트워크 부하

 

위의 4가지 이점으로 UDP는 특정 상황에서 TCP보다 우수한 성능을 보일 수 있다.

예를 들어 음성 통화, 비디오 스트리밍, 실시간 게임 등과 같은 응용 프로그램에서는 실시간성이 매우 중요하기 때문에 UDP가 사용될 수 있다.

 

더보기

모범 답안

UDP는 TCP와 달리 두 소켓간의 연결 및 연결해제의 과정을 거치지 않는다. 

때문에 매우 빈번한 연결 및 연결해제의 과정이 요구되는 경우에는 TCP 기반의 데이터 송수신보다 UDP 기반의 데이터 송수신이 좋은 성능을 보인다. 

정리하면 다음과 같다.

"한번에 실제 송수신하는 데이터의 양은 적지만 매우 빈번한 데이터의 송수신이 요구되어서 TCP 기반에서 구현할 경우 빈번한 연결 및 연결 해제의 과정을 거쳐야 하는 경우"

 

 

05. 클라이언트의 TCP 소켓은 connect 함수를 호출할 때 자동으로 IP와 PORT가 할당된다. 그렇다면 bind 함수를 호출하지 않는 UDP 소켓은 언제 IP와 PORT가 할당되는가?

 

UDP 소켓은 bind 함수를 호출하지 않는 경우에도 IP와 PORT번호가 할당된다. UDP 소켓은 일반적으로 sendto 함수를 사용하여 데이터를 전송할 때 목적지 IP 주소와 PORT번호를 명시적으로 지정한다. 

이 때, UDP 소켓은 해당 IP 주소와 PORT 번호로 데이터를 보낸다.

 

더보기

모범 답안

sendto 함수 호출 시까지 주소 정보가 할당되지 않았다면, sendto 함수가 처음 호출되는 시점에 해당 소켓에 IP와 PORT번호가 자옫으로 할당된다.

또한 이렇게 한번 할당되면 프로그램이 종료될 때까지 주소 정보가 그대로 유지되기 때문에 다른 UDP 소켓과 데이터를 주고 받을 수 있다. 물론 IP는 호스트의 IP로, PORT는 사용하지 않는 PORT 번호 하나를 임의로 골라서 사용하게 된다.

 

 

06. connect 함수의 호출문장은 TCP 클라이언트의 경우 반드시 삽입해야 하는 문장이다. 그러나 UDP의 경우는 선택적으로 삽입이 가능하다. 그렇다면 UDP에서 connect 함수를 호출하면 어떠한 이점이 있는가?

 

1. 목적지 주소 지정

connect 함수를 호출하여 UDP 소켓에 대상 서버의 IP 주소와 PORT 번호를 지정할 수 있다.

이렇게 연결이 설정되면, 해당 UDP 소켓은 다른 주소로의 통신이 제한되고, 오직 목적지 주소로만 데이터를 송신할 수 있다.

이는 UDP 통신에서 단일 목적지로의 통신을 원할 때 유용하다.

 

2. 송신 단순화

connect 함수를 호출한 후에는 send 함수를 사용하여 데이터를 송신할 때마다 목적지 주소를 지정하지 않아도 된다.

이미 connect 함수에서 지정한 목적지 주소로 자동으로 데이터가 전송된다.

UDP 소켓에서 동일한 목적지로 데이터를 송신해야 할 때 유용하다.

 

3. 수신 필터링

connect 함수를 호출하여 UDP 소켓에 목적지 주소를 지정하면, 해당 주소에서 수신된 데이터만 수신할 수 있다.

그러나 UDP는 비연결지향적인 특성을 가지므로 connect 함수를 호출하지 않고도 다양한 주소로 데이터를 송신할 수 있다.

따라서 connect 함수의 사용은 UDP 애플리케이션의 요구에 따라 선택적으로 결정되어야 한다.

 

더보기

모범 답안

UDP 소켓을 대상으로 sendto 함수가 호출될 때마다 다음의 과정을 거친다.

 

1단계 - UDP 소켓에 목적지의 IP와 PORT 정보 등록

2단계 - 데이터 전송

3단계 - UDP 소켓에 등록된 목적지 정보 삭제

 

이 중에서 데이터를 전송할 때마다 반복되는 1단계와 3단계 과정을 connect 함수를 호출하면 생략 가능하다.

물론 connect 함수를 호출한다고 해서 연결의 과정을 거치는 것은 아니며, 다만 IP와 PORT 번호를 UDP 소켓에 지정하는 효과만 얻게 된다. 그리고 이렇게 connect 함수 호출 후에는 sendto, recvfrom 함수가 아닌 write, read 함수의 호출로도 데이터를 송수신할 수 있다.

 

 

07. 본문에서 보인 예제 uecho_server.c와 uecho_clinet.c를 참고해서 서버와 클라이언트 상호간에 한번씩 메시지를 주고받는 형태로 대화를 진행하는 예제를 작성해 보자. 단, 주고받는 대화는 콘솔상에 출력되어야 한다.

 

(생략)

 

 

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com