DNS요청과 UDP

네임 서버의 요청-응답은 Http와 같은 TCP 통신이 아닌 UDP 통신을 사용한다. 따라서 일반적으로 우리가 이해하고 있는 통신과는 사뭇 다르다.

TCP는 hand-shake 과정을 통해 데이터 손실 없이 전송하지만 UDP는 손실이 발생하더라도 목적지까지 빠르게 전송한다. 그렇기에 TCP보다 훨씬 빠른 속도로 데이터 교환이 일어날 수 있다.

그렇다면 왜 DNS 서버는 UDP를 사용할까?

Node.js 의 dgram

이전 프로젝트를 하면서 node의 기본 패키지인 net 패키지을 사용해본 적이 있다. net 패키지은 TCP 통신을 지원하는 node의 가장 저수준 패키지이다(http 패키지도 net 패키지 위에서 동작한다).

dgram 도 마찬가지로 UDP 통신을 지원하는 node의 저수준 패키지이다. DNS 요청을 처리하기 위해서는 UDP 통신을 해야하는데 우리 네임 서버는 dgram을 사용하기로 했다.

DNS 요청에 대한 응답을 하려면 먼저 DNS 요청은 어떻게 오는지 확인해봐야 한다.

dns-packet 패키지 뜯어보기

Packet 객체 뜯어보기

export interface Packet {
    type?: "query" | "response" | undefined;
    id?: number | undefined;
    flags?: number | undefined;
    
    questions?: Question[] | undefined;
    answers?: Answer[] | undefined;
    additionals?: Answer[] | undefined;
    authorities?: Answer[] | undefined;
}

패킷 헤더

패킷 섹션