본문 바로가기
Computer Science/Computer Networking

[Computer Networking] Application Layer : DNS (Domain Name System)

by __K.Jun__ 2024. 7. 14.

Hostname

  www.google.com,  www.naver.com  처럼 URL 형태의 호스트 식별자를 호스트 이름(hostname)이라고 한다. 하지만 호스트 이름은 인터넷에서의 그 호스트 위치에 대한 정보를 거의 제공하지 않는다. 더 나아가, 호스트 이름은 가변 길이의 문자로 구성되므로 라우터가 처리하는 데 어려움이 있다. 이러한 이유르 호스트는 흔히 말하는 IP 주소(IP address)로도 식별 된다.

 

IP Address

  IP 주소는 4바이트로 구성되느 계층 구조를 갖는다. IP 주소는 121.7.106.83과 같은 형태이고, 0~255의 십진수로 표현하는 각 바이트는 점으로 구분한다. IP 주소는 계층구조여서 주소를 왼쪽에서 오른쪽으로 조사함으로써, 그 호스트가 인터넷의 어디에 위치하는지에 대한 자세한 정보를 얻을 수 있다.

 

 DNS Service

  사람의 입장에서는 기억하기 쉬운 호스트 이름 식별자를 선호하지만, 라우터는 고정 길이의 계층구조를 가진 IP 주소를 선호한다. 이러한 선호 차이를 절충하기 위해, 호스트 이름을 IP 주소로 변환하는 디렉터리 서비스가 필요하다. 이것이 DNS(Domain Name System)의 주요 임무이다.

 

DNS 란?

- DNS 서버들의 계층구조로 구현된 분산 데이터베이스

- 호스트가 분산 데이터베이스로 질의하도록 허락하는 애플리케이션 계층 프로토콜

 

사용자의 호스트에서 수행되는 브라우저가 URL을 요청할 때 다음과 같은 일련의 일이 발생한다.

 

1. 사용자 컴퓨터는 DNS 애플리케이션을 수행한다.

2. 브라우저는 URL로부터 호스트 이름을 추출하고 그 호스트 이름을 DNS 애플리케이션에 넘긴다.

3. DNS 클라이언트는 DNS 서버로 호스트 이름을 포함한 쿼리를 보낸다.

4. DNS 클라이언트는 DNS 서버로부터 호스트 이름에 대한 IP 주소를 가진 응답을 받는다.

5. 브라우저가 DNS 클라이언트로부터 IP 주소를 받으면, 해당 IP 주소와 그 주소의 80번 포트에 위치하는 HTTP 서버 프로세스로 TCP 연결을 초기화 한다.

 

 

  DNS는 호스트 이름을 IP 주소로 변환하는 것 외에 다음과 같은 추가 서비스를 제공한다.

 

- host aliasing (호스트 별칭) : 복잡한 호스트 이름을 가진 호스트는 하나 이상의 별칭을 가질 수 있다. 이 경우에 원래 복잡한 호스트 이름을 canonical hostname (정식 호스트 이름)이라고 한다. 별칭 호스트 이름은 정식 호스트 이름보다 대체로 기억하기 쉽다. DNS는 호스트의 IP 주소 뿐만 아니라 별칭 호스트 이름에 대한 정식 호스트 이름을 얻기 위해 이용될 수 있다.

 

- mail server aliasing(메일 서버 별칭) : 이메일 주소는 기억하기 쉬운 것이 좋다. 실제 메일 서버의 호스트 이름은 매우 복잡하며, 사람들이 보통 사용하는 것 보다 기억하기 쉽지 않다. DNS는 호스트의 IP 주소 뿐만 아니라 별칭 호스트 이름에 대한 정식 호스트 이름을 얻기 위해 메일 애플리케이션에 의해 수행된다.

 

- load distribution(부하 분산) : DNS는 중복 웹 서버 같은 여러 중복 서버 사이에 부하를 분산하기 위해서도 사용되고 있다. 인기 있는 사이트는 여러 서버에 중복되어 있어서, 각 서버가 다른 종단 시스템에서 수행되고 다른 IP 주소를 갖는다. 중복 웹 서버는 여러 IP 주소가 하나의 정식 호스트 이름과 연관되어 있다. DNS 데이터 베이스는 이 IP 주소 집합을 갖고 있다. 클라이언트가 주소 집합으로 매핑하는 호스트 이름에 대한 DNS 쿼리를 보내면, 서버는 IP 주소 집합 전체를 가지고 응답한다. 각 응답에서는 주소는 순환식으로 보낸다.

 

DNS : a distributed, hierarchical database

 

DNS는 많은 서버를 이용하고 이들을 계층 형태를 구성하며 전 세계에 분산시킨다.

 

루트 DNS 서버 : 1000개 이상의 루트 서버 인스턴스가 전 세계에 흩어져 있다. 루트 서버는 TLD 서버의 IP 주소들을 제공한다.

TLD 서버 : com, org, net, edu, gov 같은 TLD와 kr, ur, fr, ca, jp 같은 모든 국가의 TLD에 대한 TLD 서버가 있다. TLD 서버는 책임 DNS 서버에 대한 IP 주소를 제공한다.

책임 DNS 서버 : 책임 DNS 서버는 호스트 이름을 IP 주소로 매핑하는 DNS 레코드를 제공한다.

 

간단한 예를 살펴보자

1. 클라이언트가 www.amazon.com의 IP 주소를 원한다.

2. 클라이언트가 루트 DNS 서버에 .con DNS 서버를 찾기 위해 쿼리를 보낸다.

3. 클라이언트가 .com DNS 서버에 amazon.com DNS 서버를 찾기 위해 쿼리를 보낸다.

4. 클라이언트가 amazon.com DNS 서버에 www.amazon.com의 IP 주소를 얻기 위해 쿼리를 보낸다. 

 

DNS name resolution : iterated query

호스트 engineering.nyu.edu가 gaia.cs.umass.edu의 IP 주소를 원한다.

1. engineering.nyu.edu가 먼저 자신의 로컬 DNS 서버 dns.nyu.edu에게 DNS 쿼리를 보낸다.

2. 로컬 DNS 서버는 그 쿼리 메시지를 루트 DNS 서버에게 전달한다.

3. 루트 DNS 서버는 edu를 인식하고, edu에 대한 책임을 가진 TLD 서버의 IP 주소 목록을 로컬 DNS 서버에게 보낸다.

4. 로컬 DNS 서버는 쿼리 메시지를 TLD 서버로 보낸다.

5. TLD 서버는 umass.edu를 인식하고 dns.cs.umass.edu로 이름 지어진 책임 DNS 서버의 IP 주소로 응답한다.

6. 로컬 DNS 서버는 쿼리 메시지를 책임 DNS 서버로 보낸다.

7. 책임 DNS 서버는 gaia.cs.umass.edu에 대한 IP 주소를 로컬 DNS 서버로 보낸다.

8. 로컬 DNS 서버는 gaia.cs.umass.edu에 대한 IP 주소를 요청 호스트에게 보낸다.

 

  TLD 서버는 호스트 이름에 대한 책임 서버를 안다고 가정했지만 일반적으로는 그렇지 않다. 대신에 TLD 서버는 호스트 이름에 대한 책임 DNS를 아는 중간 DNS 서버만 알고 있다. 이 경우에는 총 10번의 메시지를 보내게 된다.

DNS name resolution : recursive query

  이 예시는 재귀적 쿼리 인데, 일반 쿼리는 전형적으로는 반복적 쿼리를 따른다. 요청하는 호스트로부터 로컬 DNS 서버 까지 쿼리는 재귀적이고, 나머지 쿼리는 반복적이다. 

 

DNS records

- Type = A

name : 호스트 이름

value : 호스트 이름에 대한 IP 주소

- Type = NS

name : 도메인

value : 도메인 내부의 호스트에 대한 IP 주소를 얻을 수 있는 방법을 아는 책임 NDS 서버의 호스트 이름

- Type = CNAME

name : 별칭 호스트 이름

value : 정식 호스트 이름

- Type = MX

name : 메일 서버 별칭

value : 메일 서버의 정식 이름

 

DNS protocol message

- 처음 12 바이트는 헤더 영역(header section)으로, 여러 필드를 갖고 있다.

identification : 쿼리를 식별하는 16비트 숫자. 이 식별자는 쿼리에 대한 응답 메시지에 복사되어, 클라이언트가 보낸 쿼리와 수신된 응답 간의 일치를 식별하게 한다.

flag : 플래그 필드에는 여러 개의 플래그가 있다.

- 1비트의 쿼리/응답 플래그 : 쿼리(0) 인지 응답(1)인지 구별하게 한다.

- 1비트의 책임 플래그 : DNS 서버가 쿼리 이름에 대해 책임 서버일때 응답 메시지에 설정

- 1비트의 재귀 요구 플래그 : DNS 서버가 레코드를 갖지 않을 때 재귀적 쿼리를 수행하기를 클라이언트가 원할 때 설정

- 1비트의 재귀 가능 플래그 : DNS 서버가 재귀 쿼리를 지원하면 응답에 설정

4개의 개수 필드 :  헤더 다음에 오는 데이터 영역의 네 가지 타입의 발생 횟수를 나타낸다.

questions : 현재 쿼리에 대한 정보를 포함한다.

- 쿼리 이름을 포함하는 이름 필드

- 쿼리 타입을 나타내는 타입 필드

answers : 쿼리된 이름에 대한 자원 레코드를 포함한다. 응답으로 여러 개의 RR을 보낼 수 있다. 왜냐하면 호스트 이름은 여러개의 IP 주소를 가질 수 있기 때문이다. (ex. 중복 웹 서버)

authority : 다른 책임 서버의 레코드를 포함한다.

additional info : 다른 도움이 되는 레코드를 포함한다. 예를 들어 MX 쿼리에 대한 응답에서 응답 필드는 메일 서버의 정식 호스트 이름을 제공하는 자원 레코드를 갖고 있다. 추가 영역은 메일 서버의 정식 호스트 이름에 대한 IP 주소를 제공하는 Type A 레코드를 포함한다.

 

728x90