본문 바로가기
Develop/Network

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

by Tarra 2023. 6. 27.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

 

01. IP주소 체계인 IPv4와 IPv6의 차이점은 무엇인가? 그리고 IPv6의 등장배경은 어떻게 되는가?

 

IPv4와 IPv6는 인터넷 프로토콜 주소 체계의 두가지 버전으로, 가장 큰 차이는 주소의 길이에 있다.

IPv6는 IPv4 주소의 고갈 문제로 인터넷을 확장하기 위해서 등장하게 되었다.

추가적으로 IPv4에서 부족했던 보안과 자동 주소 구성, 흐름 제어등이 추가되었다/

 

더보기

모범 답안

IPv4는 4바이트 주소체계인 반면, IPv6는 16바이트 주소체계이다. 이렇듯 IPv6는 IPv4 기반의 IP주소 고갈을 염려하여 정의된 주소체계이다.

 

 

02. 회사의 로컬 네트워크에 연결되어 있는 개인 컴퓨터에 데이터가 전송되는 과정을, IPv4의 네트워크 ID와 호스트 ID, 그리고 라우터의 관계를 기준으로 설명하여라.

 

먼저 네트워크 ID, 호스트 ID, 라우터를 알고 가도록 하자.

 

- 네트워크 ID 

IPv4 주소는 네트워크 ID와 호스트 ID로 구성된다. 네트워크르 ID는 로컬 네트워크를 식별하는데 사용된다.

예를 들어, 로컬 네트워크의 IP주소가 192.168.0.0/24 라고 가정한다면, 여기서  네트워크 ID는 "192.168.0" 부분이다.

 

- 호스트 ID

호스트 ID는 로컬 네트워크 내에서 개별 장치를 식별하는데 사용한다. 

호스트 ID는 네트워크 ID 이후의 부분이다. 예를 들어 IP 주소가 192.168.0.1이라면, 마지막 "1"이 호스트 ID가 된다.

 

- 라우터

로컬 네트워크에는 라우터가 포함된다.

라우터는 패킷을 다른 네트워크로 전달하는 역할을 하며, 로컬 네트워크에 연결된 개인 컴퓨터가 외부 네트워크로 데이터를 전송하려면 라우터를 경유해야 한다.

 

그럼 이제 데이터가 전송되는 과정을 알아보자.

1. 개인 컴퓨터에서 데이터 전송 요청이 발생한다. ( 웹 브라우저를 통해 웹 페이지를 요청한다고 가정하자.)

2. 개인 컴퓨터는 데이터를 작은 조각인 패킷으로 분할한다.

3. 각 패킷에는 발신지와 목적지의 IP 주소가 포함된다. 발신지는 개인 컴퓨터의 IP 주소이고, 목적지는 데이터가 전송되어야 하는 서버의 IP 주소이다.

4. 패킷은 개인 컴퓨터의 로컬 네트워크를 통해 전송된다. 이때, 패킷은 라우터라는 중계 장치를 거쳐 다른 네트워크로 전달된다.

5. 라우터는 패킷을 받고, 패킷의 목적지 IP를 확인한다. 라우터는 최적의 경로는 결정하기 위해 라우팅 테이블을 이용한다.

6. 패킷은 다음 네트워크로 전달되고, 다시 다른 라우터를 거치며 최종 목적지에 도달한다.

7. 최종 목적이즤 서버는 패킷을 수신하고, 요청된 데이터를 패킷에 담아 응답 패킷으로 다시 전송한다.

8. 응답 패킷은 다시 개인 컴퓨터로 되돌아와 데이터가 화면에 표시된다.

 

더보기

모범 답안

데이터 전송과정의 첫 번째는 목적지가 속한 네트워크로의 데이터 전송이다.

그리고 이 때 사용되는 것이 IP주소 중에서 네트워크 ID라 불리는 부분이다.

이는 네트워크를 구분할 수 있는 주소 정보로써 이를 통해서 해당 네트워크로 데이터가 전송된다.

그리고 이렇게 전송된 데이터는 네트워크를 관장하는 라우터에게 전달되며, 데이터를 수신한 라우터는 IP주소 중에서 네트워크 ID를 제외한 나머지인 호스트 ID를 참조하여 최종 목적지인 호스트로 데이터를 전송한다.

 

 

03. 소켓의 주소는 IP와 PORT번호 두 가지로 구성된다. 그렇다면 IP가 필요한 이유는 무엇이고, PORT번호가 필요한 이유는 또 무엇인가? 그리고 라우터의 관계를 기준으로 설명하여라.

 

- IP 주소

IP 주소는 네트워트에서 장치를 식별하는데 사용된다. IP 주소는 전송 계층에서 패킷이 라우팅 되고 목적지를 찾는 데 필요하다.

IP 주소는 네트워크 간의 통신을 위해 사용되며, 출발지와 목적지 장치를 구분하는 역할을 한다.

 

- PORT 번호 

PORT 번호는 호스트 내에서 프로세스를 식별하는데 사용된다.

컴퓨터는 여러 개의 프로세스가 동시에 실행될 수 있고, 각 프로세스는 고유한 PORT 번호를 가지고 있어, 데이터가 올바른 프로세스로 전달 될 수 있다. 

 

라우터와의 관계를 기준으로 설명하면 다음과 같다.

 

1. 라우터

라우터는 네트워크 간의 데이터 패킷을 전달하는 역할을 한다.

데이터가 송신 장치에서 목적지로 전송되는 동안 여러개의 라우터를 거치게 된다.

 

2. IP 주소와 라우팅

라우터는 IP 주소를 기반으로 패킷을 다음 경로로 전달한다. 패킷은 출발지 IP 주소와 목적지 IP 주소를 포함하고 있으며,

라우터는 이 정보를 사용하여 패킷을 적절한 목적지로 전송한다.

 

3. PORT 번호와 프로세스

라우터는 패킷이 네트워크를 통과하는 동안, 포트 번호를 변경하지 않는다.

포트 번호는 송신 장치와 수신 장치 간의 프로세스 간 통신을 위해 사용되며, 라우터는 이러한 포트 번호를 변경하지 않고 

패킷을 전달한다. 수신 장치에서는 포트 번호를 통해 패킷을 올바른 프로세스에 전달할 수 있다.

 

더보기

모범 답안

IP 주소는 인터넷상에서의 호스트를 구분하기 위한 것이다.

때문에 IP 주소 정보만 있으면 목적지인 호스트로의 전송은 완료가 된다. 하지만 호스트 안에는 둘 이상의 소켓이 존재하기 때문에,

IP 주소만 가지고는 실질적인 최종 목적지에 해당하는 소켓에 데이터를 전송할 수가 없다.

그래서 소켓의 구분을 위해 존재하는 것이 PORT 번호이다. 정리하면 IP는 호스트의 구분을 목적으로, PORT 번호는 소켓의 구분을 목적으로 존재한다.

 

 

04. IP 주소의 클래스를 결정하는 방법을 설명하고, 이를 근거로 다음 IP 주소들이 속하는 클래스를 판단해보자.

 

IP 주소의 클래스는 주소의 첫 번째 바이트를 기준으로 결정된다.

- 클래스 A : 첫 번째 바이트의 범위가 1 ~ 126이다.

- 클래스 B : 첫 번째 바이트의 범위가 128 ~ 191이다.

- 클래스 C : 첫 번째 바이트의 범위가 192 ~ 223이다.

- 클래스 D : 첫 번째 바이트의 범위가 224 ~ 239이다. / 멀티캐스트 그룹에 할당된다.

- 클래스 E : 첫 번째 바이트의 범위가 240 ~ 255이다. / 예약된 용도로 사용된다.

 

- 214.121.212.102    C 클래스

- 120.101.122.89    A 클래스

- 129.78.102.211    B 클래스

 

 

05. 컴퓨터는 라우터 또는 스위치라 불리는 물리적인 장치를 통해서 인터넷과 연결된다. 그렇다면 라우터 또는 스위치의 역할이 무엇인지 설명해보자.

 

라우터

라우터는 패킷 기반의 네트워크에서 트래픽을 제어하고 전송하는 역할을 한다.  주요기능은 다음과 같다.

 

- 네트워크 연결

라우터는 여러 개의 네트워크를 연결하여 통신이 가능하게 한다. 

인터넷과 로컬 네트워크, 로컬 네트워크 간의 통신등을 관리한다.

 

- 패킷 라우팅

라우터는 목적지 IP 주소를 기반으로 패킷을 최적의 경로로 전송한다. 라우터는 라우팅 테이블을 사용하여 패킷의 출발지와 목적지 사이의 경로를 설정한다.

 

- 트래픽 제어

라우터는 네트워크의 트래픽을 관리하고 효율적인 데이터 전송을 위해 대역폭을 할당한다. 트래픽 제어는 네트워크 혼잡을 방지하고 성능을 최적화 하는데 도움을 준다.

 

- 보안

라우터는 패킷 필터링이나 방화벽 설정을 통해 네트워크 보안을 강화한다. 라우터는 네트워크 간의 데이터 흐름을 제어하고 외부에서의 불법적인 접근을 차단할 수 있다.

 

더보기

모범 답안

라우터는 데이터의 목적지 전송을 돕는 중간 매개체 역할을 한다. 뿐만 아니라 로컬 네트워크에 연결된 컴퓨터들과 인터넷의 연결을 돕는 역할도 한다. 때문에 라우터는 스위치라고도 불린다.

 

 

06. '잘 알려진 PORT(Well-known PORT)'는 무엇이며, 그 값의 범위는 어떻게 되는가? 그리고 잘 알려진 PORT 중에서 대표적인 HTTP와 FTP의 PORT 번호가 어떻게 되는지 조사해보자.

 

'잘 알려진 PORT'는 특정 서비스나 프로토콜에 할당된 포트 번호이다.

이러한 포트 번호들은 인터넷 상에서 널리 알려져 있으며, 대부분의 운영체제와 네트워크 기기에서 미리 정의되어 있어

사용자들이 일관성 있게 서비스에 접근할 수 있도록 한다. 

잘 알려진 포트의 범위는 0 ~ 1023까지이다.

 

대표적인 HTTP와 FTP의 포트 번호는 다음과 같다.

 

- HTTP

잘 알려진 포트 번호 : 80

일반적으로 HTTP 서비스는 TCP 프로토콜을 사용하며, 클라이언트는 80번 포트로 서버에 접속하여 웹 페이지를 요청하고 응답받는다.

 

- FTP

잘 알려진 포트 번호 : 20 (데이터 전송용), 21(제어용)

FTP는 파일 전송을 위한 프로토콜로, 데이터 전송에는 20번 포트가 사용되고, 제어에는 21번 포트가 사용된다.

클라이언트는 21번 포트로 FTP 서버에 접속하여 파일 전송을 수행한다.

 

더보기

모범 답안

'잘 알려진 PORT(Well-known PORT)' 는 특정 프로그램에 할당하기로 예약되어있는 영역의 PORT 번호를 의미한다.

그 값의 범위는 0부터 1023번까지이며, 대표적인 잘 알려진 PORT로 HTTP의 80 PORT와 FTP의 20(데이터 전송), 21(컨트롤) PORT가 있다.

 

 

07. 소켓에 주소를 할당하는 bind 함수의 프로토타입은 다음과 같다.

1
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
cs

그런데 호출은 다음의 형태로 이뤄진다.

1
bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
cs

여기서 serv_addr은 구조체 sockaddr_in의 변수이다. 그렇다면 bind 함수의 프로토타입과 달리 구조체 sockaddr_in의 변수를 사용하는 이유는 무엇인지 간단히 설명해보자.

 

가장 큰 이유는 호환성과 편의성 때문이다.

 

구조체 sockaddr은 일반적인 소켓 주소를 나타내는데 사용된다.

하지만 실제로 네트워크 프로그래밍에서 IP 주소와 포트번호를 다루기 위해서 사용되는 구조체는 sockaddr_in인데.

sockaddr_in은 IPv4 주소체계에 맞춰 정의된 구조체로, IP 주소와 포트번호를 저장할 수 있는 영역을 가지고 있다.

 

sockaddr_in 구조체는 sockaddr 구조체와 크기가 동일하며, sockaddr_in 을 사용하여 IP 주소와 포트 번호를 더 직관적이고

편리하게 다룰 수 있다. 따라서 bind 함수 호출 시 sockaddr_in 구조체의 변수를 사용하여 서버 소켓에 IP 주소와 포트 번호를 할당할 수 있게 된다.

 

더보기

모범 답안

bind 함수의 매개변수에서 선언된 구조체 sockaddr는 주소 정보에 해당하는 IP 주소와 포트번호를 할당하기가 쉽지 않은 구조이다.

따라서 IP 주소와 포트번호의 할당이 용이한 구조체 sockaddr_in이 정의되었다.

 

구조체 sockaddr_in의 멤버에 IP주소와 포트번호를 할당하면, 이 구조체 변수의 바이트 열은 구조체 sockaddr 과 동일한 형태의

바이트 열이 구성된다. 때문에 구조체 sockaddr를 대신해서 구조체 sockaddr_in을 사용할 수 있는 것이다.

 

 

08. 빅 엔디안과 리틀 엔디안에 대해서 설명하고, 네트워크 바이트 순서가 무엇인지, 그리고 이것이 필요한 이유는 또 무엇인지 설명해보자.

 

빅 엔디안와 리틀 엔디안은 컴퓨터에서 데이터를 메모리에 저장하고 표현하는 방식을 가리키는 개념이다.

 

- 빅 엔디안

가장 높은 자릿수(상위 바이트) 부터 낮은 자릿수(하위 바이트)의 순서로 데이터를 저장하는 방식이다.

예를 들어 0x12345678 이라는 4바이트 데이터를 메모리에 저장할 때 가장 높은 자릿수인 0x12가 가장 앞쪽에 위치하게 된다.

 

- 리틀 엔디안

가장 낮은 자릿수(하위 바이트)부터 높은 자릿수(상위 바이트)의 순서로 데이터를 저장하는 방식이다.

위의 예에서 0x78이 가장 앞쪽에 위치하게 된다.

 

네트워크 바이트 순서는 데이터를 네트워크 상에서 전송할 때 사용되는 바이트 순서를 의미한다.

네트워크 바이트 순서는 빅 엔디안 순서를 따르며, 이를 네트워크 바이트 오더(Network byte order)라고 한다.

따라서 네트워크 상에서 데이터를 전송할 때에는 빅 엔디안 순서로 데이터를 표현해야 한다.

 

네트워크 바이트 순서가 필요한 이유는 다양한 컴퓨터 아키텍쳐와 운영체제가 존재하며, 이들 간에 데이터를 주고 받을 때 일관성을 유지하기 위함이다. 네트워크 통신은 여러 시스템 간의 상호작용이므로, 데이터의 바이트 순서를 통일함으로써 서로 다른 엔디안을 가지고 있는 시스템간에도 올바르게 데이터를 해석하고 처리할 수 있게 된다.

 

따라서 네트워크 프로그래밍에서는 호스트 바이트 순서(Host Byte Order)와 네트워크 바이트 순서 간의 변환을 수행해야 하며,

이를 위해 네트워크 바이트 순서를 알고 있어야 한다. 주로 htons(host to network byte)와 ntohs(network to host) 와 같은 함수를 사용하여 변환 작업을 수행한다.

 

더보기

모범 답안

시스템에 따라서 값을 표현(저장)하는 방법이 빅 엔디안 방식과 리틀 엔디안 방식으로 나뉜다.

빅 엔디안은 상위 바이트의 값을 작은 번지수에 저장하는 방식이고,

리틀 엔디안은 하위 바이트의 값을 작은 바이트에 저장하는 방식이다.

 

이렇듯 값의 표현방식이 다르기 때문에 네트워크를 통한 데이터의 송수신에 기준이 마련되었으며,

이를 가리켜 '네트워크 바이트 순서'라 한다. 그리고 네트워크 바이트 순서에서는 데이터의 송수신의 기준을 빅 엔디안 방식으로 고정하고 있다.

 

 

09. 빅 엔디안을 사용하는 컴퓨터에서 4바이트 정수 12를 리틀 엔디안을 사용하는 컴퓨터에게 전송하려 한다. 이때 데이터의 전송과정에서 발생하는 엔디안의 변환과정을 설명해보자. 

 

1. 송신 컴퓨터에서 4바이트 정수 12를 메모리에 저장한다. 이때, 빅 엔디안 방식에 따라 가장 높은 자릿수부터 데이터를 저장한다. 

예를 들어 0x0000000C 와 같이 저장한다.

 

2. 네트워크 바이트 순서가 빅 엔디안이므로, 송신 컴퓨터는 데이터를 수신 컴퓨터로 전송한다.

이때, 데이터의 형식은 0x0000000C이다.

 

3. 빅 엔디안을 사용하는 데이터가 네트워크를 통해 수신 컴퓨터로 전송된다.

 

4. 수신 컴퓨터는 데이터를 받은 후, 리틀 엔디안 방식에 따라 데이터를 메모리에 저장한다. 이 때, 가장 낮은 자릿수부터 데이터를 저장하게 된다. 예를 들어 0x0C000000가 저장되게 된다.

 

더보기

모범 답안

네트워크 바이트 순서의 기준이 '빅 엔디안'이므로, 빅 엔디안을 사용하는 컴퓨터는 메모리 공간에 저장되어 있는 순서 그대로

4바이트 정수 12를 네트워크를 통해서 전송한다.

그러나 데이터를 수신하는 컴퓨터는 리틀 엔디안을 사용하므로 전송된 데이터를 리틀 엔디안의 형태로 변환한 다음 메모리 공간에 저장한다.

 

 

10. '루프백 주소(loopback address)'는 어떻게 표현되며, 의미하는 바는 무엇인가? 그리고 루프백 주소를 대상으로 데이터를 전송하면 어떠한 일이 벌어지는가?

 

'루프백 주소(loopback address)'는 자기 자신을 가리키는 특수한 IP 주소이다.

이 주소는 호스트(컴퓨터) 내부에서 사용되며, 네트워크 인터페이스를 통해 전송된 데이터를 동일한 호스트 내에서 수신하는 데 사용된다.

 

IPv4에서 루프백 주소는 127.0.0.1로 표현되며, 이 주소는 로컬 루프백 인터페이스를 통해 호스트 내부에서만 통신할 수 있는 특수한 주소이다.

 

데이터를 루프백 주소를 대상으로 전송하면, 호스트 내에서 데이터가 루프백 인터페이스를 통해 전송되고 동일한 호스트에서 수신된다.

이는 네트워크 통신을 흉내내며, 송신과 수신 사이에 네트워크 대역폭이나 네트워크 장비를 거치지 않는다.

'네트워크 루프백 주소'는 소프트웨어 테스트, 네트워크 스택의 정상 동작 확인, 로컬 서버 개발 등에 유용하게 사용될 수 있다.

 

더보기

모범 답안

루프백 주소는 컴퓨터 자신을 의미하는 주소로 그 값은 127.0.0.1로 약속되어 있다.

때문에 루프백 주소인 127.0.0.1로 데이터를 전송하면, 전송된 데이터는 데이터를 전송한 컴퓨터로 수신이 된다.

 

 

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com