C/TCPIP 소켓 프로그래밍(윤성우 저)

TCP/IP 소켓 프로그래밍 3장 내용 확인문제

꾸준함. 2017. 5. 18. 18:38

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


>IPv4는 4바이트 주소체계, IPv6는 16바이트 주소체계이다. IPv4 기반의 IP주소 고갈을 염려하여 IPv6가 등장하게 되었다.


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


>데이터 전송과정의 첫번째는 속한 목적지가 속한 네트워크로의 데이터 전송이다.  이 때 사용되는 것이 IP 주소 중의 네트워크 ID라고 불리는 부분이다. 네트워크 ID란 네트워크를 구분할 수 있는 주소 정보로써 이를 통해서 해당 네트워크로 데이터가 전송된다. 그리고 이렇게 전송된 데이터는 네트워크를 관장하는 라우터에게 전달되며, 데이터를 수신한 라우터는 IP 주소 중에서 네트워크 ID를 제외한 나머지인 호스트 ID를 참조하여 최종 목적지인 호스트로 데이터를 전송한다.


3. 소켓의 주소는 IP와 PORT번호 두 가지로 구성된다. 그렇다면 IP가 필요한 이유는 무엇이고, PORT번호가 필요한 이유는 또 무엇인가? 다시 말해서, IP를 통해서 구분되는 대상은 무엇이고, PORT 번호를 통해서 구분되는 대상은 또 무엇인가?


>IP주소는 인터넷 상에서의 호스트를 구분하기 위한 것이다. 따라서 IP주소 정보만 있으면 목적지인 호스트로의 전송은 완료된다. 허나 호스트 안에는 둘 이상의 소켓이 존재하기 때문에, IP주소만 가지고는 최종 목적지까지 식별하기는 힘들 것이다. 그래서 최종 목적지, 즉 소켓을 구분하기 위해 존재하는 것이 PORT 번호이다. 

정리하면, IP는 호스트의 구분을 목적으로, PORT번호는 소켓의 구분을 목적으로 존재한다.


1 BYTE1 BYTE1 BYTE1 BYTE
클래스 A(네트워크 ID 1 Byte, 호스트 ID 3 Byte)


1 BYTE 

1 BYTE 

1 BYTE 

1 BYTE 

클래스 B(네트워크 ID 2 Byte, 호스트 ID 2 Byte)


1 BYTE 

1 BYTE 

1 BYTE 

1 BYTE 

클래스 C(네트워크 ID 3 Byte, 호스트 ID 1 Byte)


1 BYTE 

1 BYTE 

1 BYTE 

1 BYTE 

클래스 D(멀티캐스트 IP 주소 4 Byte)


*클래스 E는 일반적이지 않은, 예약되어있는 주소체계입니다.(그림 생략)


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

(3번 문제 그림 참고)


>클래스의 구분 기준은 다음과 같다

  클래스 A의 첫번째 바이트 범위: 0~127

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

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


  214.121.212.102->첫번째 바이트가 214이므로 클래스 C

  120.101.122.89  ->첫번째 바이트가 120이므로 클래스 A

  129.78.102.211  ->첫번째 바이트가 129이므로 클래스 B


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


>라우터는 데이터의 목적지 전송을 돕는 중간 매개체 역할을 한다. 또한 로컬 네트워크에 연결된 컴퓨터들과 인터넷 연결을 돕는 역할도 한다.(스위치라고 불리는 이유)


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


>'잘 알려진 PORT(Well-known PORT)'는 특정 프로그램에 할당하기로 예약되어 있는 영역의 PORT 번호를 의미한다. 그 값의 범위는 0~1023번까지이며, 대표적으로 잘 알려진 HTTP는 80 PORT, FTP는 20(데이터 전송) PORT, 21(컨트롤) PORT이다.


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

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

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

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

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


>bind 함수의 매개변수에 선언된 sockaddr는 주소정보에 해당하는 IP번호와 PORT번호를 할당하기 쉽지 않은 구조이다. 그래서 IP주소와 PORT번호의 할당이 용이한 구조체 sockaddr_in이 정의되었다.  구조체 sockaddr_in의 멤버에 IP주소와 PORT번호를 할당하면, 이 구조체 변수의 바이트 열은 구조체 sockaddr과 동일한 형태의 바이트 열이 구성된다. 따라서 구조체 sockaddr를 대신해서 구조체 sockaddr_in을 사용할 수 있는 것이다.


*부가설명

struct sockaddr

{

        sa_family_t sin_family; //주소체계(Address Family)

        char sa_data[14]; //주소정보

}

 

struct sockaddr_in

{

        sa_family_t sin_family; //주소체계(Address Family), struct sockaddr 동일

        uint16_t sin_port; //16비트 TCP/UDP PORT 번호

        struct in_addr sin_addr; //32비트 IP주소

        char sin_zero[8]; //사용되지 않음

};

 

sockaddr_in 구조체에서 sin_port(2바이트)+sin_addr(4바이트)+sin_zero[8](8바이트)를 더하면 14바이트이다!

즉 sockaddr 구조체의 sa_data[14]의 구성요소가 sockaddr_in에 표현이 된 것이다.



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


>시스템에 값을 저장하는 방법이 빅 엔디안 방식과 리틀 엔디안 방식으로 나누어진다. 빅 엔디안은 상위 바이트의 값을 작은 번지수에 저장하는 방식이고, 리틀 엔디안은 반대로 하위 바이트의 값을 작은 번지수에 저장하는 방식이다. 이렇듯 값의 표현방식이 다르기 때문에 네트워크를 통한 데이터의 송수신에 기준이 생겼으며, 이를 가리켜 네트워크 바이트 순서라고 한다. 

*참고로 네트워크 바이트 순서는 빅 엔디안 방식을 따른다.


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


>네트워크 바이트 순서는 빅 엔디안 방식을 따르므로, 컴퓨터에서는 메모리 공간에 저장되어 있는 그대로 4바이트 정수 12를 네트워크에 전송한다. 그러나 데이터를 수신하는 컴퓨터는 리틀 엔디안 방식을 따르기 때문에 4바이트 정수 12를 리틀 엔디안 방식으로 변환 후 메모리에 저장한다.


00000000 00000000 00000000 00001100(빅 엔디안) -----> 00001100 00000000 00000000 00000000(리틀 엔디안)


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


>루프백 주소는 컴퓨터 자신의 주소를 의미하고 그 값은 127.0.0.1로 약속되어있다. 따라서 루프백 주소를 대상으로 데이터를 전송하면, 전송된 데이터는 데이터를 전송한 컴퓨터로 수신이 된다.


[참고] 윤성우 저 TCP/IP 소켓 프로그래밍

반응형