네트워크 프로그래밍 08 도메인 네임 서비

zh025700·2022년 4월 13일
0

네트워크 프로그래밍


7. 도메인 네임 서비스

도메인 이름?

기억하기 어려운 IP주소 대신 도메인 이름을 부여해 IP주소를 대신

DNS 서버

도메인 이름은 해당 서버에 부여된 가상의 주소, 실제 주소가 아니다

가상의 주소를 실제 주소로 변환하는 과정을 거쳐야함!

  • 디폴트 DNS 서버를 통해 도메인 네임에 대한 IP주소 정보를 얻음

    1. 유저가 도메인 네임을 입력
    2. 브라우저는 도메인 네임의 IP주소를 디폴트 DNS 서버를 통해 얻음
    3. 실제 서버에 접속

    그러나 디폴트 DNS 서버가 모든 도메인의 IP주소를 알지는 못한다

그러면 어떡해??

모르면 물어서라도 가르쳐준다.
  • 상위 계층에 있는 DNS서버에게 모르는 정보를 물어본다.

  • 제일 상위 = ROOT DNS서버까지 올라가 정보를 알아냄

    서버 계층은 다양함 com, org, edu 등 나뉘어져 있다

EX) 클라이언트가 www.amazon.com의 IP를 원할떄

  1. ROOT 서버가 com DNS 서버를 찾는다
  2. com DNS 서버가 amazon.com의 DNS 서버를 찾는다
  3. amazon.com DNS 서버가 www.amazon.com의 IP를 찾는다

왜 도메인을 써??

IP주소는 복잡하고 어렵고 도메인 네임에 비해 변경 확률이 높다.
반면 도메인 이름은 등록하면 평생 유지가 가능하다.
이를 이용해 도메인 네임을 이용해 해당 IP주소를 얻어 프로그램의 서버에 접속을 한다면 IP주소로 부터 클라이언트는 자유롭다

=> IP주소와 도메인 네임 사이 변환 함수가 필요!!

DNS records

문자열 도메인 이름 -> IP 주소 정보

struct hostent* gethostbyname(const char* hostname);
  • 성공시 hostent 구조체 변수의 주소값(포인터로 받아!!) 실패시 NULL 포인터 반환
  • 변환하고자 하는 도메인의 이름을 문자열로 전달하면 반환되는 구조체에 IP주소가 담겨서 온다

변환되는 IP주소가 담기는 구조체이다

struct hostent{
    char* h_name;           // 공식 도메인 네임
    char** h_aliases;       // 공식 도메인 이외 해당 페이지에 접속 가능한 다른 도메인 이름
    int h_addrtype;         // 주소 타입 AF_INET or AF_INET6
    int h_length;           // IP주소의 크기 정보, IPv4 = 4 IPv6 = 16
    char** h_addr_list;     // IP주소
}

구조체 변수 구조

hostent에서 h_addr_list 출력하는 법

printf("%s",inet_ntoa(*(struct in_addr*)host->h_addr_list[i]);
hostent구조체에서 h_addr_list는 문자열 배열이다.
하지만 실제 문자열 배열이 가리키는 값은 문자열의 주소 값이 아닌 in_addr 구조체 변수의 주소값이다!!

위의 구조체의 구조 그림을 본다면 h_addr_list 배열에서 다시 in_addr을 가리키는 것을 볼 수 있다

=> 그래서 inet_ntoa 함수로 변환을 해야한다

IP주소 -> 도메인 정보

struct hostent* gethostbyaddr(const char* addr,socklen_t len,int family);
  • 성공시 hostent 구조체 주소값(포인터로 받아!), 실패시 NULL 포인터 반환

  • addr: IP주소를 가지는 in_addr 구조체 변수의 포인터

  • len: addr의 길이 IPv4 = 4, IPv6 = 16

  • family: 주소체계 정보 전달, IPv4 = AF_INET, IPv6 = AF_INET6

    위에 함수와 똑같이 사용하면 됨. hostent 구조체를 통해 값을 받아오니깐.. 단지 차이는 IP를 이용해 도메인 정보를 얻는당...

profile
정리

0개의 댓글