
DNS는 인터넷의 전화번호부이다. 사용자가 'naver.com'과 같은 도메인 이름을 웹 브라우저에 입력하는 경우 DNS는 해당 사이트의 올바른 IP주소를 찾는 역할을 한다.
일반적으로 우리는 웹 사이트에 접속할 때 외우기 어려운 IP주소 대신 도메인 이름을 사용한다. 인터넷에서 모든 장치는 고유한 IP주소를 가지고 있지만 우리는 IP주소보다 도메인 이름을 더 쉽게 기억하고 이해할 수 있기 때문이다.
때문에 이 도메인은 일종의 별명으로, 입력한 도메인을 실제 네트워크 상에서 사용하는 IP주소로 바꾸고 해당 IP주소로 접속하는 과정이 필요하다.
이러한 과정, 전체 시스템을 DNS(도메인 네임 시스템)이라고 한다.
도메인 네임과 그에 대응하는 IP주소는 네임 서버라고 불리는 특별한 서버에서 관리된다. 도메인 네임을 관리하는 네임 서버는 DNS 서버라고도 부른다. 호스트는 네임 서버에 '특정 도메인 네임을 가진 호스트의 IP주소가 무엇인지' 질의함으로써 패킷을 주고받고자 하는 호스트의 IP주소를 얻어낼 수 있다. 이를 '리졸빙(resolving)한다'라고도 표현한다.
도메인 네임과 관련해 알아야 할 내용은 크게 2가지, 하나는 도메인 네임의 계층적 구조이고 다른 하나는 도메인 네임을 관리하는 네임 서버(DNS)의 계층적 구조이다.

하나의 도메인 네임은 점(.)을 기준으로 계층적으로 분류되어 있다.
도메인 네임은 일반적으로 3~5단계로 구성되며 'www.example.com.'처럼 도메인 네임을 모두 포함하는 도메인 네임은 전체 주소 도메인 네임(FQDN; Full-Qualified Domain Name)이라고 하며, 이 FQDN을 알면 호스트를 식별할 수 있다.

계층적 형태로 이루어진 도메인 네임을 관리하는 네임 서버 또한 계층적 형태를 이룬다. 이렇게 계층적으로 분산되어 있는 도메인 네임에 대한 관리 체계를 도메인 네임 시스템(DNS)라고 부른다.
도메인 네임이 네임서버에서 리졸빙되는 과정 이해하기
한 호스트가 'michul.net'이라는 도메인 네임을 통해 IP주소를 알아내고자 하는 경우, 호스트는 가장 먼저 로컬 네임 서버에게 도메인 네임을 질의하게 된다. 로컬 네임 서버는 클라이언트와 맞닿아 있는 네임 서버로, 클라이언트가 가장 먼저 찾게 된다. 클라이언트가 로클 네임 서버를 찾을 수 있으려면 로컬 네임 서버의 주소를 알고 있어야 하기 때문에 많은 경우 ISP가 로컬 네임서버의 주소를 자동을 할당해 주고, 공개 DNS서버인 구글의 '8.8.8.8'이나 클라우드플레어의 '1.1.1.1'에서 할당해주기도 한다.
만약 로컬 네임 서버가 IP주소를 모른다면 로컬 네임 서버는 FQDN에 대응하는 IP주소를 알아낼 때까지 도메인 네임의 루트 도메인을 관장하는 서버(루트 네임 서버)에게 질의하고, 최상위 도메인을 관장하는 서버(TLD 네임 서버), 그 하위 레벨의 도메인 네임을 관장하는 네임 서버...등에 걸쳐 질의하게 된다.
그렇게 최종적으로 클라이언트가 원하는 IP주소를 반환받으면 해당 주소를 클라이언트에게 전달한다.

참고로, 이와 같은 질의 과정이 너무 많이 반복되면 네트워크 내 트래픽이 많아지고, 리졸빙에 지나치게 오랜 시간이 걸리기 때문에 실제로는 네임 서버들이 기존에 응답받은 결과를 임시로 저장했다가 추후 같은 질의에 사용하는 경우가 많은데, 이를 DNS 캐시라고 한다.
DNS질의는 크게 재귀적 질의, 반복적 질의, 역방향 질의로 나눌 수 있다.

클라이언트가 로컬 DNS 서버에 요청할 때 사용한다.
클라이언트는 최종 응답(IP 주소)을 받을 때까지 기다린다.
로컬 DNS 서버는 직접 IP를 찾거나 다른 DNS 서버로 요청을 전파한다.

로컬 DNS 서버가 다른 DNS 서버에 요청할 때 사용한다.
요청받은 DNS 서버가 해당 정보를 가지고 있지 않으면, 다른 DNS 서버를 추천하거나 가리킨다.
최종적으로 권한 있는 네임 서버에 도달하여 IP 주소를 획득한다.
IP 주소를 이용해 도메인 이름을 찾는 방식이다.
PTR(포인터) 레코드를 사용하여 IP 주소에서 도메인 이름으로 매핑한다.
주로 네트워크 문제 해결 및 보안 시스템에서 사용된다.

DNS 레코드는 도메인 이름과 관련된 정보를 저장하는 데이터로, DNS서버에서 사용된다. 도메인 이름을 IP주소로 변환하거나 이메일 서버와 같은 다양한 서비스 정보를 제공하기 위해 사용된다.
각 도메인 이름은 하나 이상의 DNS 레코드를 가지고 있으며, 이러한 레코드는 도메인 네임 서버에 저장된다. 각 레코드는 특정 역할을 하며, 클라이언트와 서버 간의 네트워크 통신을 지원한다.
도메인 www.example.com을 웹 브라우저에서 입력했을 때:
클라이언트는 DNS 서버에 A 레코드를 요청한다.
DNS 서버는 해당 도메인의 IP 주소를 반환한다.
클라이언트는 반환된 IP 주소를 사용해 서버에 연결한다.
DNS 서버와 클라이언트 간 통신에서 UDP를 사용하는 이유는 DNS의 설계 목적과 효율성 때문이다
1) 빠른 데이터 전송 : UDP는 연결을 설정하고 종료하는 과정이 없는 비연결혈 프로토콜이다. 따라서 TCP처럼 3-way handshake를 수행하지 않아 속도가 빠르다
2) 작은 데이터 크기 : 대부분의 DNS 요청과 응답은 512바이트 이하로 작고, 이런 작은 데이터는 TCP대신 UDP로 처리하는 것이 효율적이다
3) 적은 오버헤드 : UDP는 상태를 유지하지 않으므로 클라이언트-서버 간 연결을 유지할 필요가 없고, 메모리와 CPU자원을 절약할 수 있다
1) 짧은 응답 시간 : DNS요청은 매우 빈번하게 발생하기 때문에 빠른 응답이 중요하다. UDP는 TCP보다 훨씩 적은 시간으로 요청과 응답을 처리할 수 있다.
2) 단순한 통신 구조 : DNS는 기본적으로 간단한 쿼리-응답 모델을 따른다. 요청과 응답만 필요하므로 TCP의 복잡한 연결 관리가 필요하지 않다
3) 신뢰성 보안 : UDP는 신뢰성이 낮지만, DNS는 이를 보완하는 재전송 매커니즘을 내장한다. 응답이 오지 않으면 클라이언트가 동일한 요청을 다시 보내는 방식으로 작동한다.
출처 : https://velog.io/@zinukk/9kpyzbdt, 책[이것이 컴퓨터 과학이다]