DNS (Domain Name Server)
- 도메인을 IP로 바꾸어 주는 디렉터리 서비스
- DNS는 32bit 크기의 IP address를 저장하고 제공함으로써 distributed DB의 속성을 가짐
- 네임 서버들의 계층구조로 구현된 분산 데이터베이스
- Application Layer Protocol 중 하나
DNS가 제공하는 서비스들
- 호스트 네임 -> IP 주소
- 호스트 aliasing: 정식 호스트네임 외로 사본 또는 별칭을 가질 수 있음
- 메일 서버 aliasing
- 부하 분산: 인기 있는 사이트는 여러 서버에 중복되어 있어서 다른 IP 주소를 할당시켜 부하를 분배시킴
DNS(Domain Name System) 작동 방식
1. 사용자가 www.handong.edu에 접속하려고 하면, 사용자의 컴퓨터에서는 DNS 애플리케이션의 클라이언트 부분이 실행된다.
2. 웹 브라우저는 URL에서 호스트 이름인 www.handong.edu를 추출하고, 이 호스트 이름을 DNS 애플리케이션의 클라이언트 부분에 전달한다.
3. DNS 클라이언트는 이 호스트 이름을 포함하는 쿼리를 DNS 서버에 보낸다.
4. DNS 클라이언트는 결국 응답을 받게 되며, 이 응답에는 해당 호스트 이름의 IP 주소가 포함되어 있다.
5. 웹 브라우저가 DNS로부터 IP 주소를 받으면, 그 IP 주소의 80번 포트에 위치한 HTTP 서버 프로세스와 TCP 연결을 시작할 수 있다.
따라서 사용자가 웹사이트를 방문하려 할 때 마다, 해당 사이트의 도메인 이름을 실제 IP 주소로 변환하는 과정은 반드시 거치게 되며 이 과정에서 DNS 시스템은 핵심적인 역할을 한다.
DNS 계층 구조
3단계 구조
1. 루트 DNS 서버
2. 최상위 레벨 도메인(TLD) 서버: com, org, net, edu 등 기업, 기관, 대학, 나라를 대표하는 도메인 서버
3. 책임 DNS 서버: 기관이 실질적으로 DNS 서버를 가지고 있는 곳으로 정확한 이름의 IP 주소가 매핑된 곳. 그 주소로 접근할 권한을 가져 권한 서버라고도 함
Local DNS name servers
로컬 DNS 네임 서버는 다음과 같은 특징을 가지고 있다:
- 엄격하게 계층 구조에 속하지 않는다: DNS 시스템은 전체적으로 계층적이지만, 로컬 DNS 서버는 이러한 계층 구조에 엄격하게 속하지 않는다.
- 각 ISP가 하나를 가진다: 주거용 ISP, 회사, 대학 등 각각의 인터넷 서비스 제공자(ISP)는 하나의 로컬 DNS 서버를 가진다. 이것을 "기본 네임 서버"라고도 부른다.
- 호스트가 DNS 쿼리를 만들면 쿼리가 해당 호스트의 로컬 DNS 서버로 전송된다: 로컬 DNS 서버는 최근의 이름-주소 변환 쌍에 대한 로컬 캐시를 가지고 있다(그러나 이 정보가 최신이 아닐 수 있다!). 또한 프록시 역할을 하여 쿼리를 계층 구조로 전달한다.
따라서, 사용자의 컴퓨터가 웹사이트에 접속하려 할 때 첫 번째로 연결되는 것이 바로 이 로컬 DNS 네임서버인 것이며, 이곳에서 웹사이트 도메인 이름과 관련된 IP 주소 정보를 찾아내거나 없을 경우 상위 단계의 다른 DNS 네임서버에 요청하는 역할을 한다.
DNS name resolution: iterated query (반복 쿼리)
DNS 이름 해석에는 여러 방식이 있지만, 여기서 설명하는 것은 반복 쿼리(iterated query) 방식이다.
예를 들어, engineering.nyu.edu에 있는 호스트가 gaia.cs.umass.edu의 IP 주소를 원한다고 가정하자. 이 경우 반복 쿼리 과정은 다음과 같이 진행된다:
1. 먼저 호스트는 로컬 DNS 서버에 gaia.cs.umass.edu의 IP 주소를 요청한다.
2. 만약 로컬 DNS 서버가 해당 정보를 알지 못한다면, "나는 이 이름을 모르지만 이 서버에게 물어봐라"라고 응답하면서 다른 DNS 서버의 이름(또는 주소)을 제공한다.
3. 그런 다음 호스트(또는 로컬 DNS 서버가 대신해서)는 제공받은 DNS 서버에 동일한 질문을 다시 한다.
4. 이 과정이 계속 반복되며, 최종적으로 요청한 도메인 이름(gaia.cs.umass.edu)에 대한 IP 주소를 알고 있는 DNS 서버를 찾아낸다.
5. 찾아낸 DNS 서버에서 해당 IP 주소 정보를 응답으로 받으면, 원래 호스트로 전달되고 이 정보는 웹사이트 접속 등의 용도로 사용된다.
따라서 '반복 쿼리'란 이름을 해석하기 위해 여러 개의 DNS 네임서버와 연결되어야 하는 과정을 말한다.
DNS name resolution : recursive query
DNS 이름 해석에서 재귀 쿼리(recursive query) 방식은 다음과 같이 동작한다.
예를 들어, engineering.nyu.edu에 있는 호스트가 gaia.cs.umass.edu의 IP 주소를 원한다고 가정하자. 이 경우 재귀 쿼리 과정은 다음과 같이 진행된다:
1. 호스트는 로컬 DNS 서버에 gaia.cs.umass.edu의 IP 주소를 요청한다.
2. 로컬 DNS 서버는 이 요청을 받으면, 직접 해당 정보를 알고 있는 DNS 서버에 대해 쿼리를 전송한다. 이때 로컬 DNS 서버는 "나도 모르겠으니까 대신 찾아봐"라고 응답하지 않고, 자신이 역할을 수행하여 해당 정보를 찾아오기 위해 계속해서 다른 DNS 서버로 쿼리를 전달하는 방식을 사용한다.
3. 만약 중간 단계의 DNS 서버도 해당 정보를 알지 못하면, 더 상위 계층의 다른 DNS 서버로 요청을 전달한다. 이런 식으로 계속해서 상위 계층으로 올라가며 요청을 전달하고 처리 결과를 기다린다.
4. 최종적으로 IP 주소 정보가 포함된 응답이 내려온다면, 로컬 DNS 서버는 이 결과를 받아서 호스트에게 전달한다.
재귀 쿼리 방식은 이름 해석 과정에서 연결된 네임서버에게 해석 부담을 두는 특징이 있다. 상위 계층의 네임서버들은 많은 클라이언트들로부터 잦은 쿼리 요청을 받게 되므로 부하가 발생할 수 있다. 따라서 상위 계층 네임서버들은 효율적인 리소스 관리와 성능 최적화가 필요하다.
참고
Computer Networking: A Top-Down Approach 8th edition / Kurose, Ross / Pearson