ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TCP/IP 소켓 프로그래밍 - 8장 : 도메인 이름과 인터넷 주소
    네트워크 2024. 6. 18. 20:09

    8장

    DNS ( Domain Name System )는 IP주소와 도메인 이름 사이의 변환을 수행하는 시스템이다.

     

    도메인 이름을 IP 주소에 부여해,

    기억하기 쉽고 표현하기 좋은 형태의 주소정보를 이용할 수 있다.

     

    인터넷에서 특정 사이트에 접속하는 방법은 2가지가 있다.

    1. 직접 IP 주소 입력하기. ( 요즘은 ip로 직접 접근하는 것을 막는 경우가 많다. )
    2. 도메인 이름으로 접속하기

    모든 컴퓨터에는 디폴트 DNS 서버의 주소가 등록되어 있으며,

    이 디폴트 DNS 서버를 이용해 도메인 이름에 대응되는 IP 주소를 얻는다.

     

    ping 명령어를 치면, 도메인 이름에 해당하는 ip 주소를 알 수 있다. ( ex - ping www.naver.com )

    nslookup 명령어를 치면, 디폴트 DNS 서버의 주소를 알 수 있다. ( 리눅스의 경우 server도 쳐줘야 함. )

     

    Default DNS server에서 원하는 도메인 이름에 대한 ip를 찾지 못한 경우

     

    디폴트 DNS 서버는 자신이 모르는 정보에 대해 한 단계 위의 DNS 서버에게 물어본다.

    계속 올라가다 보면 ROOT DNS 서버까지 올라갈 수 있다.

     

    DNS는 계층적으로 관리되는 분산 데이터베이스 시스템의 일종이다.


    08-2 IP 주소와 도메인 이름 사이의 변환

    IP 주소를 직접 사용해 프로그램을 작성하는 것은 문제가 될 수 있다.

    IP 주소는 도메인 이름에 비해 상대적으로 변경될 확률이 높기 때문이다.

     

    클라이언트는 도메인 이름을 근거로 IP 주소를 얻어온 뒤 서버에 접속하게 되므로,

    서버의 IP 주소에 연연하지 않고 프로그램을 작성할 수 있다.

     

    그래서 IP 주소와 도메인 이름 사이의 변환 함수가 필요한 것이다.

    아래 함수는 IP 주소와 도메인 이름 사이의 변환함수이다.

     

    #include <netdb.h>
    
    struct hostent * gethostbyname ( const char * hostname );
    
    // 성공 시 hostent 구조체 변수의 주소 값, 실패 시 null 포인터 리턴

     

    도메인 이름을 문자열 형태로 전달하면,

    hostent 구조체의 변수에 IP 주소 정보가 담겨서 반환 된다.

    hostent 구조체는 아래와 같이 정의되어 있다.

     

    struct hostent
    {
    	char * h_name;    // 공식 이름
    	char ** h_aliases // alias list
    	int h_addrtype;   // host 주소 체계
    	int h_length;     // 주소 길이
    	char ** h_addr_list; // 도메인 이름과 대응되는 모든 IP 주소 정보
    }
    1. h_name : 공식 도메인 이름이 담겨져 있다.
    2. h_aliases : 공식 도메인 이름 이외에 접속할 수 있는 다른 도메인 이름 정보가 적혀있다.
    3. h_addrtype : 주소 체계, IPv4를 쓰는지 IPv6를 쓰는지에 대한 정보가 담겨져 있다.
    4. h_length : IP 주소 크기 정보. IPv4의 경우 4, IPv6의 경우 16이 저장된다.
    5. h_addr_list :

     

    IP 주소를 이용해 도메인 정보를 얻어올 수도 있다.

    #include <netdb.h>
    
    struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family);
    
    //성공 시 hostent 구조체 변수의 주소 값, 실패 시 NULL 포인터 리턴
    //addr : in_addr 구조체 변수의 포인터 전달. char 형 포인터는 IPv4이외에도 전달받을 수 있게 하기 위함.

     

    아래는 위 함수들을 이용해 예제 코드를 작성, 실행한 결과이다. 

Designed by Tistory.