네임 서버의 요청-응답은 Http와 같은 TCP 통신이 아닌 UDP 통신을 사용한다. 따라서 일반적으로 우리가 이해하고 있는 통신과는 사뭇 다르다.
TCP는 hand-shake 과정을 통해 데이터 손실 없이 전송하지만 UDP는 손실이 발생하더라도 목적지까지 빠르게 전송한다. 그렇기에 TCP보다 훨씬 빠른 속도로 데이터 교환이 일어날 수 있다.
그렇다면 왜 DNS 서버는 UDP를 사용할까?
이전 프로젝트를 하면서 node의 기본 패키지인 net
패키지을 사용해본 적이 있다. net
패키지은 TCP 통신을 지원하는 node의 가장 저수준 패키지이다(http
패키지도 net
패키지 위에서 동작한다).
dgram
도 마찬가지로 UDP 통신을 지원하는 node의 저수준 패키지이다. DNS 요청을 처리하기 위해서는 UDP 통신을 해야하는데 우리 네임 서버는 dgram
을 사용하기로 했다.
DNS 요청에 대한 응답을 하려면 먼저 DNS 요청은 어떻게 오는지 확인해봐야 한다.
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;
}
type
: DNS 메시지의 종류
id
: 16비트 식별자
flags
: 16비트 플래그 필드로, DNS 메시지의 다양한 속성을 비트 단위로 표현