본문 바로가기
Develop/Network

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

by Tarra 2023. 6. 27.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

01. 프로토콜이란 무엇을 의미하는가? 그리고 데이터 송수신에 있어서 프로토콜을 정의한다는 것은 어떠한 의미가 있는가?

 

프로토콜이란 데이터를 송수신 하기 위한 통신 규약을 의미한다.

 

따라서 프로토콜을 정의한다는 것은 네트워크 통신을 위한 규칙과 규약을 명시하는 것을 의미하게 된다.

이러한 프로토콜을 정의함으로써 통신에 참여하는 모든 시스템이나 장치들이 동일한 프로토콜을 따르고, 데이터를 일관되게 처리할 수 있게 된다.

 

더보기

모범 답안

프로토콜은 통신의 방법을 약속해 놓은 통신 규약을 의미한다.

따라서 프로토콜을 정의한다는 것은 데이터 송수신에 필요한 약속을 정의한다는 의미이다.

 

 

02. 연결지향형 소켓인 TCP 소켓의 전송 특성 세가지를 나열하여라.

 

1 - 연결 지향성 소켓 + 전송 순서대로 데이터가 수신된다. (순차성)

2 - 전송되는 데이터의 경계가 존재하지 않는다. (흐름 제어)

3 - 중간에 데이터가 소멸되지 않고 목적지로 전송된다. (신뢰성)

 

더보기

모범 답안

- 중간에 데이터가 소멸되지 않고 목적지로 전송된다.

- 전송 순서대로 상대 호스트로 데이터가 수신된다.

- 전송되는 데이터의 경계가 존재하지 않는다.

 

 

03. 다음 중 비 연결지향성 소켓의 특성에 해당하는 것을 모두 고르면?

 

a. 전송된 데이터는 손실될 수 있다.

b. 데이터의 경계 (Boundary)가 존재하지 않는다.

c. 가장 빠른 전송을 목표로 한다.

d. 한번에 전송할 수 있는 데이터의 크기가 제한되어 있지 않다.

e. 연결지향성 소켓과 달리 연결이라는 개념이 존재하지 않는다.

 

답 : a, c, e

 

 

04. 다음 유형의 데이터 송수신에 적합한 타입의 소켓은 무엇인지 결정하고, 그러한 결정을 하게 된 이유를 설명해보자.

 

a. 서태지와 아이들의 실시간 라이브 방송 멀티미디어 데이터

실시간 라이브 방송 멀티미디어 데이터의 경우, 빠른 전송 속도를 필요로 하며, (실시간 라이브 이므로) 중간에 데이터가 손실되더라도 영상이 잠깐 멈추는 등 자잘한 문제가 발생할 뿐, 치명적인 문제가 발생하지 않는다. 따라서 해당 데이터는 UDP를 사용하는 것이 옳다.

 

b. 철수가 압축한 텍스트 파일의 전송

압축 파일의 경우에는 데이터가 손실되면 압축 해제 자체를 못할 경우가 발생할 수 있으므로

데이터의 손실이 발생하지 않는 TCP를 사용해야 한다.

 

c. 인터넷 뱅킹을 이용하는 고객과 은행 사이에서의 데이터 송수신

압축 파일과 마찬가지로 은행과 고객 사이의 데이터가 절대로 유실되서는 안되므로 연결 지향형 소켓인 TCP가 사용되어야 한다.

 

더보기

모범 답안

a. 서태지와 아이들의 실시간 라이브 방송 멀티미디어 데이터

데이터의 손실에 덜 민감하고 속도가 중요시 되므로, 비 연결지향형 소켓 (UDP)

 

b. 철수가 압축한 텍스트 파일의 전송

압축 파일은 데이터가 일부 손실되면 전체 해제가 불가능할 수 있으므로 연결지향형 소켓(TCP)

 

c. 인터넷 뱅킹을 이용하는 고객과 은행 사이에서의 데이터 송수신

고객과 은행 사이에서는 데이터의 송수신 횟수가 많지 않으며 송수신 데이터의 크기도 크지 않으나, 데이터의 일부 손실되거나

변경되면 치명적이다. 따라서 연결지향형 소켓

 

 

05. 데이터의 경계(Boundary)가 존재하지 않는 소켓은 어떠한 타입의 소켓인가? 그리고 이러한 소켓은 데이터를 수신할 때 무엇을 주의해야하는지 서술해보자.

 

데이터의 경계가 존재하지 않는 소켓은 연결지향성 소켓인 TCP이다.

해당 소켓은 데이터의 경계가 존재하지 않기 때문에 서버에서 송신한 데이터를 클라이언트에서 정확히 전부 다 받았는지

확인하는 과정이 필요하다. 그렇지 않으면 TCP를 사용하는 이유가 없게 되고, UDP를 사용하는 것이 더 유용하다.

 

더보기

모범 답안

연결지향성 소켓인 TCP 소켓은 송수신 데이터의 경계가 존재하지 않는다. 

따라서 입출력 함수의 호출횟수는 의미를 지니지 않는다. 중요한 것은 함수의 호출횟수가 아니라 데이터의 송수신 양이다.

그러므로 송신된 데이터의 양과 수신된 데이터의 양이 일치하도록 코드를 작성해야 하며, 특히 함수의 호출횟수에 의존하는 코드를 작성하면 안된다.

 

 

06. tcp_server.c와 tcp_client.c에서는 서버가 한번의 write 함수호출을 통해서 전송한 문자열을 여러 차례의 read 함수호출을 통해서 읽어 들였다. 그럼 이번에는 서버가 여러 차례의 write 함수호출을 통해서 (횟수는 여러분이 결정) 전송한 문자열을 클라이언트에서 한번에 read 함수 호출을 통해서 읽어 들이는 형태로 예제를 변경해보자. 단, 이를 위해서 클라이언트는 read 함수의 호출 시기를 다소 늦출 필요가 있다. 서버가 데이터를 모두 전송할 때까지 기다려야 하기 때문이다. 그럼 이를 위해서 리눅스와 윈도우 양쪽 모두에서 다음 유형의 문장을 이용해서 read 또는 recv 함수의 호출 시기를 늦추도록 하자.

 

1
2
3
4
for(i = 0; i < 3000; i++)
{
    printf("Wait time %d \n", i);
}
cs

 

이렇게 CPU에게 불필요한 일을 시켜가면서 실행의 흐름을 지연시키는 것을 가리켜 "Busy Waiting"이라 하는데, 이를 적절히 활용하면 우리에게 필요한 만큼 호출 시기를 늦출 수 있다.

 

(생략)

 

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com