이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
기초개념 › 네트워크
DNS는 무엇을 무엇으로 바꿔 주는가
컴퓨터끼리는 IP 주소(숫자)로 연결하지만, 사람은 shop.example 같은 이름을 씁니다. DNS는 이름을 IP 주소로 바꿔 주는 서비스이고, 이름과 IP 주소를 짝지어 적어 둔 표를 가진 컴퓨터가 DNS 서버입니다. 화면의 코드 칸은 두 구역입니다. 위쪽은 DNS 서버에 등록된 것(이름 → IP 주소)이고, 아래쪽은 클라이언트가 접속하려는 주소입니다. 이름으로 접속하려는 클라이언트는 서버에 연결하기 전에 먼저 DNS 서버에 그 이름의 IP 주소를 묻고, 답으로 받은 IP 주소로 연결합니다. 이 실습은 이름을 등록하지 않거나, 다른 IP 주소로 등록하거나, 주소 칸에 이름 대신 IP 주소를 직접 적어 가며 같은 접속을 시켜, DNS 서버에 몇 번 묻는지, 어느 컴퓨터에 닿는지를 봅니다. 화면의 8080은 예시로 적은 포트 번호입니다.
실행으로 대조 · Node.js 24.18.0에서 127.0.0.x 안에 띄운 작은 DNS 서버(RFC 1035 메시지)와 dns.Resolver 클라이언트, HTTP 서버 둘로 여섯 가지 조합을 실행해 대조
# DNS 서버에 등록된 것 (이름 → IP 주소) shop.example 127.0.0.1 # 클라이언트가 접속하려는 주소 http://shop.example:8080/
여섯 가지 조합을 모두 이 PC의 127.0.0.x 주소 안에서만 실제로 실행해 대조했습니다. 외부 네트워크와 이 PC의 실제 DNS 설정에는 묻지 않았습니다. DNS 서버는 Node.js 24.18.0의 dgram으로 127.0.0.1의 빈 UDP 포트에 띄운 작은 서버입니다. 메시지는 RFC 1035 4.1절의 형식(머리 12바이트, 질문, 답)대로 직접 만들었고, 등록표에 있는 이름의 A 질의에는 그 IP 주소를 답하고 없는 이름에는 RCODE 3(Name Error, 4.1.1절)을 답합니다. 클라이언트는 화면의 두 구역 글자를 그대로 읽어, 주소의 호스트가 net.isIP로 IP 주소가 아니면 dns.Resolver에 setServers로 위 서버만 지정해 resolve4로 묻고 받은 IP 주소로 HTTP 요청을 보냈으며, IP 주소이면 Resolver를 부르지 않고 바로 보냈습니다. 화면의 "이름이면 먼저 묻고, IP 주소면 묻지 않는다"는 흐름은 이 Probe의 흐름과 같게 만든 것입니다. 운영체제의 이름 풀이 순서, hosts 파일, 브라우저와 운영체제의 캐시, 재귀 리졸버는 다루지 않았고, 실제 브라우저가 이 Probe와 같은 순서로 일하는지는 확인하지 않았습니다. 그 세부는 "세부 동작 실습: DNS"에서 다룹니다. 서버로는 HTTP 서버 둘을 같은 포트 번호의 127.0.0.1과 127.0.0.2에 띄웠습니다. 화면의 8080은 예시 번호이고 실제로는 빈 포트를 썼으며, 127.0.0.2는 "다른 컴퓨터"를 흉내 낸 것으로 실제로는 같은 PC의 다른 루프백 주소입니다. 이 PC(Windows)에서는 127.0.0.2에 바로 묶였습니다. 대조한 것은 DNS 서버가 받은 질의의 수와 종류, 이름 없음 답의 RCODE, 클라이언트가 받은 답, 서버가 받은 연결의 목적지 IP 주소, 응답의 상태와 본문, 이름 있는 조합에서는 질의가 연결보다 먼저라는 순서, 이름이 없다는 답일 때 두 서버가 연결도 요청도 받지 않았다는 것입니다. "DNS 서버에 물은 횟수"는 DNS 서버가 받은 A 질의의 수입니다. 이 Resolver는 A 말고 다른 종류의 질의를 보내지 않았고, 이름 없음 답을 받은 뒤에도 다시 묻지 않아서 질의 수와 A 질의 수가 같았습니다. 이것은 이 Node.js 버전의 기본 설정에서 관찰한 것입니다. 이름 없음 답을 Node.js가 ENOTFOUND 오류로 알려 주는 것도 관찰한 동작입니다. DNS 서버는 독립된 구현이 아니라 이 실습을 위해 만든 것이고, 그 답을 읽은 것은 Node.js의 dns.Resolver(c-ares)이므로 DNS 메시지를 독립된 구현이 읽어 보았다는 점에서만 외부와 대조한 셈이며 실제로 운영되는 DNS 서버와 대조한 것은 아닙니다. 문서로 확인한 것은 RFC 1034의 5.2.1절(호스트 이름을 호스트 주소로 바꾸는 요청은 A 레코드를 묻는 것이 되고, 이름이 없으면 name error가 돌아온다), 3.6절(리소스 레코드), 4.3.1절(이름이 존재하지 않는다는 응답), RFC 1035의 3.4.1절(A 레코드는 32비트 인터넷 주소), 4.1절과 4.1.1절(메시지 형식, RCODE 3 Name Error)과 RFC 6761의 6.5절(.example로 끝나는 이름은 문서용으로 예약돼 등록되지 않는다)입니다. 같은 이름에 IP 주소를 여럿 등록하거나 AAAA 레코드를 쓰는 경우는 다루지 않았고, 화면의 서버 코드는 보이지 않습니다.
줄을 그은 곳은 처음 코드에서 지운 것이고, 색을 칠한 곳은 새로 쓴 것입니다.