도메인은 이미 우리에게 매우 익숙하다. 어떤 웹 사이트에 접속하기 위해 그 사이트의 IP 주소가 필요한데 이렇게 숫자로 된 IP주소를 사용하는 것은 불편하기 때문에, 우리에게 친숙한 언어로 된 도메인을 사용한다.
등과 같은, 우리가 주소창에 입력하는 그 주소가 도메인이다.
이 때, 우리가 'www.naver.com'이라고 주소창에 입력 했는데 어떻게 우리가 찾는 네이버의 웹페이지를 찾아서 띄워줄 수 있게 하는 것이 DNS이다.
DNS는 IP주소를 도메인으로, 도메인을 IP주소로 변환해주는 분산 데이터베이스 서버이다. 우리가 'www.naver.com' 이라고 주소창에 입력하면, DNS 서버에서 우리가 입력한 주소에 해당하는 IP 주소를 찾아서 IP 주소를 알려준다. 그렇게 해서 우리는 네이버 웹 사이트에 접속 할 수 있다.
gethostbyname
gethostname
함수를 이용하면 도메인을 통해 IP 주소를 비롯한 다양한 서버 정보를 얻을 수 있다.
#include <netdb.h>
struct hostent * gethostbyname(const char *name);
-> 성공 시 hostent 구조체 변수 값, 실패 시 NULL 반환
다음과 같이 사용한다. 그리고 hostent 구조체는 이렇게 생겼다.
struct host
{
char * h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
}
gethostbyname 함수를 통해 채워지는 정보는 위와 같다.
gethostbyaddr
반대로 IP 주소를 통해 도메인 네임을 알 수 있는 함수도 물론 존재한다.
#include <netdb.h>
struct hostent * gethostbyaddr(const char *addr, socklen_t len, int family);
-> 성공 시 hostent 구조체 변수 값, 실패 시 NULL 반환
gethostbyaddr
함수를 통해, gethostbyname
함수의 반대 기능을 사용할 수 있다.
도메인은 트리 구조를 이루고 있다.
이런 식으로, 가장 위의 루트(.)에서부터 시작하여, 계층을 이루면서 아래로 뻗어나가는 트리 형태를 띠고 있다. 그리고 도메인은 우측부터 좌측으로 계층이 낮아진다.
우리가 입력한 www.naver.com
은 사실 www.naver.com.
이었던 것이다.
루트의 자식 중 com
을 찾는다. com
의 자식 중 naver
를 찾는다. 이렇게 해서 해당 도메인의 IP 주소를 찾아낸다.
naver.sports.com이 아니라 sports.naver.com인 이유도 좌→우로 도메인을 해석하기 때문.