소켓프로그래밍#5 : DNS와 도메인

kkado·2022년 5월 31일
0

도메인이란

도메인은 이미 우리에게 매우 익숙하다. 어떤 웹 사이트에 접속하기 위해 그 사이트의 IP 주소가 필요한데 이렇게 숫자로 된 IP주소를 사용하는 것은 불편하기 때문에, 우리에게 친숙한 언어로 된 도메인을 사용한다.

  • www.naver.com
  • www.google.com

등과 같은, 우리가 주소창에 입력하는 그 주소가 도메인이다.
이 때, 우리가 'www.naver.com'이라고 주소창에 입력 했는데 어떻게 우리가 찾는 네이버의 웹페이지를 찾아서 띄워줄 수 있게 하는 것이 DNS이다.

DNS

DNS는 IP주소를 도메인으로, 도메인을 IP주소로 변환해주는 분산 데이터베이스 서버이다. 우리가 'www.naver.com' 이라고 주소창에 입력하면, DNS 서버에서 우리가 입력한 주소에 해당하는 IP 주소를 찾아서 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 함수를 통해 채워지는 정보는 위와 같다.

gethostbyname() 예제

gethostbyaddr

반대로 IP 주소를 통해 도메인 네임을 알 수 있는 함수도 물론 존재한다.

#include <netdb.h>
struct hostent * gethostbyaddr(const char *addr, socklen_t len, int family);
-> 성공 시 hostent 구조체 변수 값, 실패 시 NULL 반환

gethostbyaddr 함수를 통해, gethostbyname 함수의 반대 기능을 사용할 수 있다.

gethostbyaddr() 예제

도메인에 대한 나머지 내용

도메인은 트리 구조를 이루고 있다.

이런 식으로, 가장 위의 루트(.)에서부터 시작하여, 계층을 이루면서 아래로 뻗어나가는 트리 형태를 띠고 있다. 그리고 도메인은 우측부터 좌측으로 계층이 낮아진다.

우리가 입력한 www.naver.com은 사실 www.naver.com. 이었던 것이다.

루트의 자식 중 com을 찾는다. com의 자식 중 naver를 찾는다. 이렇게 해서 해당 도메인의 IP 주소를 찾아낸다.

naver.sports.com이 아니라 sports.naver.com인 이유도 좌→우로 도메인을 해석하기 때문.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글