13개의 루트 DNS 서버가 있는 이유를 설명하는 모든 기사에서는 각 IP 주소가 32바이트를 차지하므로 (13 x 32) = 416바이트이며 다른 프로토콜 정보를 위해 최대 96바이트를 남겨둔다고 설명합니다. 예를 들어다음과 같은
"DNS를 설계할 때 사용된 IP 주소는 32비트를 포함하는 IPv4였습니다. 효율적인 네트워킹과 더 나은 성능을 위해서는 이러한 IP 주소가 단일 패킷에 맞아야 합니다(DNS의 기본 프로토콜인 UDP 사용). IPv4의 경우 단일 패킷 패킷에 들어갈 수 있는 DNS 데이터는 512바이트로 제한되어 있으며, 각 IPv4 주소에는 32바이트가 필요하므로 13개의 서버가 416바이트를 사용하고 나머지 프로토콜 정보에는 최대 96바이트가 남습니다."
모든 IP 주소는 32비트 아닌가요? 위의 설명에서 "IPv4 주소당 32바이트가 필요합니다"는 무엇을 의미합니까? 32비트 주소가 32바이트를 차지하는 이유는 무엇입니까?
답변1
"...각 IPv4 주소에는 32바이트가 필요하므로 13개의 서버를 보유하려면 416바이트가 필요하며 나머지 프로토콜 정보에는 최대 96바이트가 남습니다."
DNS 프로토콜은 일반 IP 주소만 전송하지 않고 DNS 리소스 레코드로 구성된 잘 구성된 쿼리와 응답을 전송합니다.
A
"IPv4 주소에는 32바이트가 필요합니다"는 일반 IP 주소의 크기가 아니라 DNS 프로토콜에서 전송을 위해 포맷된 리소스 레코드의 크기를 의미하는 것 같습니다.
이 값은 모든 루트 DNS 서버가 고유한 비시스템 이름을 가질 때 정확해야 하는 것처럼 보이지만 x.ROOT-SERVERS.NET
이제 루트 이름 서버의 이름이 해당 형식으로 변경되었기 때문에 현재 상태는 약간 복잡합니다.
방금 tcpdump
BIND9 DNS 서버 시작 시 실행했는데 첫 번째 A 레코드는 다음을 포함하므로 32바이트가 조금 넘는 공간을 차지할 것 같습니다.
- 전체 이름
a.root-servers.net
(각 이름 구성 요소는 길이가 1바이트이고 끝에 0바이트가 있음 = 총 20바이트) - 16비트 레코드 유형 코드(2바이트)
- 16비트 레코드 카테고리 코드(2바이트)
- 32비트 TTL 값(4바이트)
- 16비트 데이터 길이 값(2바이트)
- 32비트 IP 주소(4바이트)
따라서 루트 DNS 서버에서 A 레코드를 요청하면 첫 번째 응답 레코드는 실제로 34바이트를 차지하게 됩니다.
동일한 DNS 메시지의 후속 응답 레코드는 이전에 언급된 이름이나 이름의 일부를 참조할 수 있으므로 a.root-servers.net
전체적으로 언급된 경우 b.root-servers.net
단 4바이트(부분은 2바이트 b
, 다음은 2단어) 섹션)로 표시할 수 있습니다. 참조 접미사 root-servers.net
). 따라서 루트 서버에 대한 추가 A 레코드는 각각 17바이트만 차지합니다.
BIND9의 실제 시작 쿼리는 dig . NS
UDP가 아닌 TCP를 통해 발생하며 동일합니다.
결과적으로 첫 번째 응답 레코드는 첫 번째 루트 DNS 서버의 전체 이름을 나열하는 31바이트 NS 레코드입니다. 다른 루트 서버의 후속 NS 레코드는 각각 15바이트만 차지합니다. 추가 정보로 제시된 A 레코드는 각 루트 서버 호스트 이름을 완전히 역참조할 수 있으므로 루트 DNS 서버의 각 A 레코드는 16바이트만 차지합니다. 응답에는 루트 이름 서버에 대한 IPv6 AAAA 레코드도 포함됩니다. 그럼에도 불구하고 DNS 응답의 총 길이는 1097바이트에 불과합니다.