본문 바로가기
Develop/Network

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

by Tarra 2023. 6. 28.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

01. TCP/IP 프로토콜 스택을 4개의 계층으로 구분 해보자. 그리고 TCP 소켓이 거치는 계층구조와 UDP 소켓이 거치는 계층구조의 차이점을 설명해보자.

 

TCP / IP 프로토콜 스택은 일반적으로 4개의 계층으로 구붆된다.

1. 네트워크 액세스 계층 (Network Access Layer)

물리적인 네트워크 인터페이스와 관련된 기능을 담당한다.

이 계층은 이더넷, Wi-Fi, PPP 등과 같은 하드웨어 장치와의 통신을 위한 프로토콜을 포함한다.

 

2. 인터넷 계층 (Internet Layer) 

IP 주소와 패킷 라우팅을 처리한다. 이 계층에서는 IP 프로토콜을 사용하여 데이터 그램을 다른 네트워크로 라우팅한다.

 

3. 전송 계층 (Transport Layer)

데이터의 전송을 관리하고 신뢰성 있는 통신을 제공한다. 주요 프로토콜로는 TCP와 UDP가 있다.

 

4. 응용 계층 (Application Layer)

사용자 애플리케이션과 네트워크 간의 상호작용을 담당한다.

이 계층에서는 HTTP, FTP, SMTP, DNS등과 같은 프로토콜을 사용하여 특정 서비스를 제공한다.

 

TCP 소켓과 UDP 소켓은 전송 계층에서 동작하는 소켓이다. 그러나 이 두 소켓의 계층 구조에는 다음과 같은 차이점이 있다.

 

- TCP

Application -> Transport(TCP) -> internet(IP) -> Network Access(LINK)

 

- UDP

Application -> Transport(UDP) -> internet(IP) -> Network Access(LINK)

 

더보기

모범 답안

TCP는 LINK 계층 ↔ IP 계층 ↔ TCP 계층 ↔ APPLICATION 계층의 구조를 지니며,

UDP는 LINK 계층 ↔ IP 계층 ↔ UDP 계층 ↔ APPLICATION 계층의 구조를 지닌다.

 

 

02. TCP/IP 프로토콜 스택 중에서 LINK 계층과 IP 계층이 담당하는 역할이 무엇인지 설명해보자. 그리고 이 둘의 관계도 함께 설명해보자.

 

1. LINK 계층( 또는 네트워크 액세스 계층)

- 물리적인 네트워크 인터페이스와 관련된 기능을 담당한다.

- 데이터를 전기 신호나 광 신호와 같은 신호로 변환하여 실제 네트워크로 전송한다.

- 네트워크 하드웨어 및 드라이버, 이더넷, Wi-Fi, PPP와 같은 프로토콜을 관리한다.

- 물리적인 주소인 MAC(Media Access Control) 주소를 사용하여 데이터를 전송한다.

 

2. IP 계층 (인터넷 계층)

- 호스트 간의 패킷 전달과 라우팅을 담당한다.

- 데이터그램을 사용하여 네트워크 간의 데이터 전송을 처리한다.

- IP 주소를 사용하여 각 호스트와 라우터를 식별한다.

- IP 패킷을 생성하고, 전송할 대상의 IP 주소를 확인하고, 라우팅 테이블을 참조하여 패킷을 올바른 목적지로 전달한다.

- 오류 검출 및 복구를 위한 기능을 제공한다.

 

LINK 계층과 IP 계층은 상호 작용하여 데이터를 전송한다.

LINK 계층은 IP 계층에게 IP 패킷을 전달하기 위해 데이터를 전기 신호로 변환하고, IP 계층은 LINK 계층을 통해 전송된 데이터를 받아 IP 패킷을 생성하고 목적지 IP 주소를 확인하여 전송한다. 이러한 과정에서 IP 패킷은 LINK 계층에서 사용하는 물리적인 주소인 MAC 주소로 캡슐화되어 전송된다. 수신 측에서는 MAC 주소를 확인하여 패킷을 해당 호스트로 전달한다.

 

더보기

모범 답안

LINK 계층은 LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역으로, 물리적인 성격의 표준을 정의하고 있는 계층으로 정리할 수 있다.

반면 IP 계층은 인터넷을 통한 데이터 전송의 표준을 정의하고 있는 계층이다. 

즉 IP 계층은 LINK 계층을 기반으로 구성되는 물맂거인 네트워크를 기반으로 하는 데이터 전송의 표준을 담당한다.

 

 

03. TCP/IP 프로토콜 스택을 4개의 계층(또는 7개의 계층)으로 나누는 이유는 무엇인가? 이를 개방형 시스템에 대한 설명과 함께 답해보자.

 

TCP/IP 프로토콜 스택을 4개의 계층 (또는 7개의 계층)으로 나누는 것은 네트워크 기능을 모듈화하고 계층적으로 구성함으로써 다양한 장비와 시스템 간의 상호 운용성과 확장성을 제공하기 위한 목적이다.

 

개방형 시스템은 다른 시스템과의 상호 운용성을 보장하며, 다른 기업이나 개인이 개발한 컴퓨터 시스템이나 소프트웨어를 통합하여 사용할 수 있는 시스템을 의미한다. 

 

TCP/IP 프로토콜 스택은 개방형 시스템의 핵심 기술로 채택되었다. 이를 위해 프로토콜을 계층으로 나누어 구성함으로써 다음과 같은 장점을 가지게 된다.

 

1. 모듈화

각 계층은 독립적으로 설계되어 기능을 분리하고 개별적으로 업그레이드하거나 대체할 수 있다.

이는 개방형 시스템에서 새로운 기술이나 프로토콜을 도입하기 쉽게 만든다.

 

2. 상호 운용성

계층 간의 인터페이스와 프로토콜을 표준화하여 다른 시스템과의 상호 운용성을 제공한다.

각 계층은 정의된 규약에 따라 동작하므로, 호환되는 시스템은 서로 통신할 수 있다.

 

3. 확장성

새로운 기능이나 서비스를 추가하기 위해 해당 계층에 집중할 수 있다.

즉, 상위 계층은 하위 계층의 변경없이 확장될 수 있다.

 

4. 디버깅과 유지보수 용이성

각 계층은 독립적으로 테스트하고 디버깅할 수 있으며, 문제가 발생한 경우 해당 계층만 수정하면 된다.

 

더보기

모범 답안

복잡한 TCP/IP 프로토콜을 계층화하면 문제해결을 전문화할 수 있으며,

계층화 된 영역을 표준화해서 개방형 시스템으로 발전시킬 수 있다.

실제로 TCP/IP는 개방형 시스템이기 때문에 각 계층 별로 표준화가 되어있고, 이 표준을 근거로 인터넷 망이 구성되어 있다.

따라서 계층별 표준을 따르는 하드웨어 및 소프트웨어의 상호 대체가 가능하며, 이러한 표준화는 TCP/IP가 발전할 수 있는 근거가 되었다. 

 

 

04. 클라이언트는 connect 함수호출을 통해서 서버로의 연결을 요청한다. 그렇다면 클라이언트는 서버가 어떠한 함수를 호출한 이후 부터 connect 함수를 호출할 수 있는가?

 

클라이언트는 서버가 listen 함수를 호출한 이후부터 connect 함수를 호출할 수 있다.

 

더보기

모범 답안

서버가 서버 소켓(리스닝 소켓)을 대상으로 listen 함수를 호출한 이후부터 연결요청이 가능하다.

 

 

05. 연결요청 대기 큐라는 것이 생성되는 순간은 언제이며, 이것이 어떠한 역할을 하는지 설명해보자. 그리고 accept 함수와의 관계도 함께 설명해보자.

 

연결요청 대기 큐는 listen 함수를 호출한 이후부터 생성되며, 연결을 요청한 클라이언트의 정보가 연결요청 대기큐에 쌓이게 된다.

여기서 클라이언트의 연결 요청은 connect 함수이며, 쌓인 연결 요청을 accept 함수를 통해 클라이언트와 연결하게 된다.

 

더보기

모범 답안

연결 요청 대기 큐가 생성되는 시점은 listen 함수가 호출되는 시점이다. 그리고 이때 생성되는 연결요청 대기 큐는 클라이언트의 연결요청 정보가 저장되는 공간이다. accept 함수가 호출되면 바로 이 공간에 저장된 연결요청 정보를 참조하여 해당 클라이언트와의 연결을 구성하게 된다.

 

 

06. 클라이언트 프로그램에서 소켓에 주소정보를 할당하는 bind 함수호출이 불필요한 이유는 무엇인가? 그리고 bind 함수를 호출하지 않았을 경우, 언제 어떠한 방식으로 IP주소와 PORT 번호가 할당되는가?

 

클라이언트에서 일반적으로 bind 함수를 호출하지 않는 이유는 클라이언트가 일시적인 통신을 위해 임시적인 포트 번호를 사용하기 때문이다.

 

클라이언트 소켓이 bind 함수를 호출하지 않은 경우, IP 주소와 포트 번호는 connect 함수가 호출될 때 할당된다.

 

더보기

모범 답안

클라이언트는 연결을 요청하는 프로그램이지 연결을 받아들이는 프로그램이 아니다.

때문에 서버의 주소정보가 더 중요한 요소가 된다. 따라서 bind 함수호출을 통해서 명시적으로 주소정보를 할당할 필요는 없다.

그러나 서버와의 통신을 위해서는 소켓에 자신의 주소정보가 할당되어야 하기 때문에 서버로의 연결요청을 시도하는 connect 함수가 호출될 때, 인자로 전달된 소켓에 자동으로 IP 주소와 PORT 번호가 할당된다.

 

 

07. Chapter 01에서 구현한 예제 hello_server.c 와 hello_server_win.c를 lterative 모델로 변경하고, 제대로 변경이 되었는지 클라이언트와 함께 테스트해보자.

 

Iterative 모델

Iterative 모델은 서버의 동시 접속을 처리하기 위한 방식 중 하나이다. 이 모델에서는 서버가 클라이언트의 요청을 순차적으로 처리하는 방식을 의미한다. 한 번에 하나의 클라이언트만을 처리하고, 다음 클라이언트 요청을 처리하기 위해 이전 클라이언트와의 연결을 완전히 종료해야 한다.

 

(생략)

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com