1) 도메인 이름이란? TCP/IP를 기반으로 인터넷상의 호스트를 구분 짓기 위해서 4byte로 표현되는 IP 주소가
사용된다. 그러나 이러한 숫자들은 사람들이 기억하기 어렵다. 그래서 나온것이 DNS이다.
2) DNS 서버 IP 주소가 아닌 도메인 이름을 통해서 임의의 호스트에
접근하고자 하는 경우 해당 호스트로 바로 접근을 시도하는 것이 아니다. 일단
도메인 이름을 IP 주소로 변환하는 과정을 거쳐야 한다. TCP/IP 프로토로은 IP
주소를 기준으로 호스트를 찾기 때문에 이는 당연한 과정이다. 이렇게 도메인 이름을
IP 주소로 변환하는 작업을 담당하는 서버를 DNS 서버라 한다.
기본적으로
각각의 시스템에는 디폴트 DNS 서버가 설정되어 있다. 따라서 인터넷 브라우저를 통해서
도메인 이름을 입력하게 되면 바로 그 디폴트 서버에게 질의를 던진다. 즉,
도메인 이름에 해당하는 IP 주소를 질의하는 것이다.
이러한 경우, 디폴트
DNS 서버가 해당 정보를 가지고 있을 경우에는 바로 응답을 해 줄
것이고, 그렇지 못한 경우에는 다른 DNS 서버에게 물어 보게 된다.
자세하게 설명하면, 디폴트 DNS 서버가 자신이 알고 있다면 바로 응답을 해
주지만 만약 그렇지 못한 경우에는 보다 상위 계층에 있는 DNS 서버에게
물어 보게 된다. 이러한 식으로 계속 물어다가 보면 결국에는 최상위 DNS
서버에게까지 올라가게 된다. 이를 ROOT DNS 서버라 한다.
ROOT DNS서버는
질문이 들어온 내용을 어느 서버에게 물어봐야 할지 알고 있다. 따라서 자신보다
하위에 있는 DNS 서버에게 다시 질의를 던져서 결국은 IP 주소를 얻어내고,
그 결과는 질의가 진행돼 왔던 반대 방향으로 응답되어서 질의를 시작했던 호스트에게
IP 주소가 전달된다.
8-2. IP 주소와 도메인
이름 사이의 변환
1) 도메인 이름을 이용해서 IP 주소 얻어내기 다음은 도메인 이름을 사용해서 IP 주소를 얻어낼 수 있는 함수이다.
*
name : 변환하고자 하는 도메인 이름을 전달한다.
변환하고자 하는 도메인
이름을 인자로 전달하면 IP 주소가 리턴된다. 단 IP 주소가 바로 리턴되는
것이 아니라, hostent라는 구조체 변수를 통해서 리턴하게 된다. hostent 구조체는 다음과
같다.
* h_name : 공식 도메인 이름이 저장된다. * h_aliases : 공식
도메인 이름 외에 alias(별명) name 정보들이 저장된다. * h_addrtype : gethostbyname
함수는 IPv4뿐 아니라 IPv6까지 지원을 한다. 그렇기 때문에 h_addr_list로 전달된 IP
주소 체계가 무엇인지를 가르쳐 준다. * h_length : 결과로 전달되는 IP
주소의 길이를 가르쳐 준다. IPv4인 경우는 주소의 길이가 4바이트이므로 4가 전달될
것이고, IPv6인 경우는 16바이느가 되므로 16이 저장될 것이다. * h_addr_list :
gethostbyname 함수로 전달된 도메인 이름에 해당하는 IP 주소를 전달해 준다. 그런데
큰 회사 같은 경우는 여러 대의 서버를 운영하기 때문에 하나의 도메인
이름에 대응하는 IP 주소가 여러 개가 될 수 있다.
h_addr_list가 가리키는
것은 문자열 포인터이다. 그런데 참조를 할 때는 in_addr 구조체의 포인터로 형
변환을 하고 나서 참조를 한다. 이 말은 h_addr_list가 가리키는 배열은 문자열을
가리킬 수 있는 char 포인터 배열이지만, 이 배열이 저장하고 있는 포인터가
실제로는 in_addr 구조테 변수를 가리키고 있다는 뜻이 된다.
따라서, 참조하기
전에 반드시 형 변환을 해야만 한다. 이렇게 하는 이유는 hostent 구조체는
IPv4 만을 위한 것이 아니라, IPv6 기반의 주소 정보를 나타내는 데에도
사용되기 때문이다. 그래서 일반화하기 위해서 char*로 선언한 것이다.
2) IP
주소를 이용해서 도메인 이름 알아내기 다음은 gethostbyname과 상대적인 기능을 하는 함수이다.
즉 IP 주소를 사용해서 도메인 이름을 얻을 때 사용할 수 있는
함수이다.
* addr : 선언은 char*로 되어 있지만 실제로 요구하는 것은
변경할 IP 주소 정보를 지니고 있는 in_addr 구조체 변수 포인터이다. 물론
IPv4와 IPv6 두 주소 체계를 모두 수용하기 위해서 선택한 일반화에 해당한다. * len : 입력되는 주소의 길이를 전달한다. IPv4인 경우 4, IPv6인
경우 16을 전달한다. * type : 입력되는 주소의 주소 체계(타입)를 전달한다.
AF_INET 혹은 AF_INET6가 될 것이다.
다음은 gethostbyaddr 함수를 이용한 코드이다.
실행 화면
아마도 자신의 컴퓨터에서 IP를 입력하여도 결과값이 제대로 나오지
않는 경우가 있을것이다.