ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [모의면접 CS 스터디] DNS
    CS/네트워크 2024. 1. 17. 13:20

     

    정의

    DNS(Domain Name System)란 사용자가 웹브라우저에 사람이 읽을 수 있는 도메인 네임을 컴퓨터가 이해할 수 있는 것으로 매핑하는 것을 말한다. 이를테면 우리가 naver.com이라는 도메인 명을 입력하여 엔터를 누르면 그걸  DNS를 통해 해당 도메인 명과 매핑되어 있는 IP 주소로 변환하여 받을 수 있다.

     

    도메인 네임의 구조

     

    먼저 DNS 요청의 동작과정에 살펴보기 전에 도메인 네임의 구조에 대해 살펴볼 필요가 있다.

    • Top-Level-Domain(TLD): .com, .org, .kr과 같은 최상위 레벨 도메인을 의미한다.
    • Second-Level Domain: www.google.com의 google과 같이 TLD 바로 옆에 있는 도메인을 의미한다.
    • Sub-domain: www, mail, blog와 같이 해당 웹사이트의 섹션을 의미하는 경우가 많다. 

     

    DNS의 IP 요청 과정

     

     

    1. 사용자가 브라우저에 www.example.com이라는 도메인을 입력한 뒤 엔터를 누른다.

    2. 현재 컴퓨터에 해당 도메인명의 IP가 캐시되어 있거나 C:\Windows\System32\drivers\etc\에 있는 host라는 파일에 있는지 확인하고 없으면 이 URL은 ISP(Internet Service Provider)가 관리하는 DNS resolver 전송된다.

    3. DNS resolver는 캐싱 여부를 확인하고 없으면 root 서버에 도메인명을 보내 .com 도메인의 TLD 서버의 IP주소를 알아낸다.

    4.  TLD 서버에 다시 URL을 요청하고 모든 도메인 네임에 대한 IP 주소를 가지고 있는 Authrotitative Name Server의 IP를 반환한다.

    5. Authrotitative Name Server을 통해 질의 하여 해당 도메인과 매핑되는 DNS 레코드의 IP 주소 정보를 찾아 반환한다.

    6. 해당 도메인과 일치하는 IP 주소를 응답 받는다.

    7. DNS resolver는 이 IP 주소를 클라이언트에게 다시 전송한다.

     

     

    DNS 질의 방식(재귀적 질의와 반복적 질의)

    많은 혼란을 줄 수 있는 그림이다

     

    재귀적 질의와 반복적 질의는 DNS 요청과정에서 각각 클라이언트의 관점(그림의 왼쪽)과 DNS 로컬 서버(그림의 오른쪽)의 관점으로 나눌 수 있다. 

     

    먼저 클라이언트는 DNS resolver에게 각 도메인 네임 서버에게 쿼리를 날릴 책임을 위임하고 자신이 원하는 도메인 네임의 IP 주소를 DNS 서버가 찾을 때까지 믿고 그저 기다릴 뿐이다.(재귀는 믿음이다라는 구절이 생각 난다) 이 때 클라이언트의 관점에선 DNS resolver가 어떤 방식으로 도메인 네임 서버를 찾는지는 모르겠지만 알아서 각 도메인 서버를 단계적으로 탐색하는 것으로 보이기 때문에 재귀적 질의를 하는 것이라고 볼 수 있다.

     

    하지만 직접 각 도메인 네임 서버에 질의하는 DNS resolver의 입장에서는 다른데, 위 DNS 동작 과정에서도 살펴 보았듯이 일일이 각 서버에게 질의를 날려서 ip주소를 얻기 때문이다. 그래서 이 과정을 반복적 질의라고 하는 것이다. 

     

     

    DNS 서버에 요청 시 왜 UDP를 사용하는가?

    일반적으로 웹에서 데이터를 주고 받을 때 전송 계층에서는 안정적인 전송을 위해 TCP를 사용하는 경우가 대부분이다. 그런데 DNS 서버에 요청을 보낼 때 TCP를 사용하기 하기도 하지만 UDP를 사용하는 경우가 많다. 그렇다면 왜 전송 시 UDP를 사용하는 걸까?

     

    이는 TCP에 비해  전송속도가 매우 빠르기 때문이다. TCP는 안정적인 데이터 전송을 위해 많은 절차가 필요하기에 전송 속도가 느릴 수밖에 없다. 그렇다면 여기서 자연스럽게 DNS 서버 요청 시에는 그런 절차가 필요하지 않나?라는 의문이 든다. 아무리 속도가 빠르다고 해도 DNS 서버에 요청할 때 안정적으로 전송되지 않으면 말짱도루묵이니 말이다. 게다가 UDP는 TCP와 달리 오류 검출 프로세스가 없어 다른 사람이 악의적으로 패킷을 가로채서 내용을 변경하더라도 막을 방법이 없다.

     

    그럼에도 UDP를 사용하는 이유는

    1. 요청 데이터의 크기가 작기 때문에 전송 계층에서 데이터를 쪼갤 필요없이 데이터그램 하나만으로 충분히 데이터를 담을 수 있어서 TCP의 이점 중 하나인 데이터 순서 보장이 필요 없고

    2.TLS 전송 계층에서의 암호화 프로토콜이 자주 쓰이기 때문에 전송 계층에서 데이터의 변조가 발생하더라도 이를 통해 잡아낼 수 있기 때문이다.

     

    다만 1에서 데이터의 크기가 커서 쪼개야하는 데이터를 쪼개야 하거나 상대 측 방화벽에서 UDP 프로토콜을 사용하는 데이터그램을 차단하는 경우 TCP를 사용한다고 한다.

     

     

     

    참고자료

    DNS란 | Cloudflare 

    Why does DNS use UDP? - ClouDNS Blog 

    DDNS - Dynamic DNS Explained - YouTube 

    DNS Queries — Recursive and Iterative | by Geeky much! | Networks & Security | Medium

    댓글

Designed by Tistory.