도메인 이름 시스템 (DNS) 은 인터넷의 기본 프로토콜로, 사람이 읽을 수 있는
도메인 이름을 컴퓨터가 서로를 찾고 통신하는데 사용하는 IP 주소로 변환한다.
그렇기에 우리는 숫자로된 IP 주소를 외울 필요없이 웹사이트에 접근할 수 있다.
도메인을 IP 주소로 변환하려면 DNS 서버에 도메인 쿼리를 보내야 한다.
DNS 서버 없이 로컬에 도메인과 IP 주소를 직접 설정하여 사용할 수도 있다.
로컬에서 도메인과 IP 주소를 관리하는 파일을 hosts
파일이라고 한다.
이 파일에 설정해두면 해당 도메인 리스트는 항상 DNS 캐시에 저장된다.
도메인을 쿼리하면 가장 먼저 DNS 서버에 쿼리하기 전, 로컬에 있는 DNS 캐시를
먼저 확인한다. 이는 동일한 도메인을 매번 질의하지 않고 캐시를 통해 성능을
향상시키기 위함이다.
DNS 캐시 정보에 필요한 도메인 정보가 없으면 DNS 서버로 쿼리를 진행하고
응답을 받으면 그 결과를 캐시에 저장한다.
윈도우에서 DNS 캐시를 확인하려면 ipconfig /displaydns
명령을 사용한다.
DNS 서버에서는 수많은 도메인을 어떻게 저장하고 관리할까?
전 세계 도메인 정보를 DNS 서버 하나에 저장할순 없으므로 DNS는 분산된
데이터베이스로 서로 도와주도록 설계되어있다.
DNS 서버는 기본적으로 루트 DNS 관련 정보를 가지고있으며, 클라이언트의
쿼리가 자신에게 없는 정보라면 루트 DNS에 쿼리하고 루트 DNS에서는
쿼리한 도메인의 TLD 값을 확인해 해당 TLD 값을 관리하는 DNS가 어디인지 응답한다.
TLD(Top-Level Domain) 란 최상위 도메인으로, IANA에서 구분한 6가지 유형인
Generic, Country-code, Sponsored, Infrastructure, Generic-Restricted,
Test 등이 있다. 예시로www.naver.com
에서 TLD는.com
을 뜻하고
이는 일반 기업체를 뜻하는 gTLD에 속한다.
즉, www.zigispace.net
이라는 도메인을 쿼리했다면,
호스트는 zigispace.net
이라는 도메인 주소에 대해 로컬 캐시를 확인 - ①
이후 로컬 캐시에 없을경우 설정된 DNS에 쿼리 - ②
DNS 서버는 루트 DNS에 다시 쿼리 - ③
루트 DSN은 .net
을 관리하는 DNS 주소 정보를 DNS 서버에 응답 - ④
이후 응답을 받은 DNS 서버는 다시 .net
을 관리하는 서버에 zigispace.net
에 대해 쿼리 - ⑤
.net
을 관리하는 서버는 zigispace.net
을 관리하는 DNS 관련정보를 응답 - ⑥
그리고 마지막으로 zigispace.net
을 관리하는 서버로 쿼리 - ⑦
후 최종 결괏값을 받는다 - ⑧
이후 zigispace.net
에 대한 정보를 로컬 캐시에 저장 후 호스트에 응답 - ⑨
재귀적 쿼리와 반복적 쿼리
재귀적 쿼리는 쿼리를 보낸 클라이언트에 서버가 최종 결괏값을 반환하는
서버 중심 쿼리이며, 반복적 쿼리는 최종값을 받을 때까지 클라이언트에서
쿼리를 계속 진행하는 방식이다. 일반적으로 재귀적 쿼리는 클라이언트와
로컬 DNS 간에서, 반복적 쿼리는 로컬 DNS 서버와 상위 DNS 에서 사용한다.