LODY/정리

컴퓨터 네트워크 / mDNS & DNS-SD

mDNS & DNS-SD

로컬 망에서는 전역 DNS가 이름을 못 잡는다. 그 위치에 mDNS로 이름을 붙이고, DNS-SD로 그 이름 아래 어떤 서비스가 떠 있는지까지 올린다. 아래는 RFC 6762·6763 기준으로 둘의 역할과 쿼리·광고 흐름만 정리한다.


일반 DNS의 한계

평소 DNS는 이렇게 동작한다.

중앙에 DNS 서버가 있고, 클라이언트는 거기에 물어본다.

문제는 로컬 네트워크다. 사무실 Wi-Fi에 연결된 내 맥의 IP가 뭔지, 같은 망에 있는 기기가 어떻게 알 수 있을까? 로컬 IP(192.168.x.x)는 어떤 중앙 DNS에도 등록되어 있지 않다.


mDNS: Multicast DNS (RFC 6762)

mDNS는 DNS 쿼리를 중앙 서버 대신 멀티캐스트로 뿌린다.

  • 쿼리 주소: 224.0.0.251 (IPv4 멀티캐스트), ff02::fb (IPv6)
  • 포트: UDP 5353
  • 도메인: .local — mDNS 전용 TLD

macbook.local을 물어보면 멀티캐스트로 뿌리고, 그 이름을 쓰는 기기가 직접 응답한다. DNS 서버가 없어도 된다.

멀티캐스트 vs 유니캐스트 vs 브로드캐스트

방식수신자특징
유니캐스트특정 1개일반 DNS, HTTP
브로드캐스트같은 망 전체ARP. 모두가 받아야 함
멀티캐스트구독한 기기mDNS. 관심 있는 기기만 처리

mDNS가 브로드캐스트 대신 멀티캐스트를 쓰는 이유는 대략 두 가지다. 라우터는 일반적으로 브로드캐스트를 서브넷 밖으로 넘기지 않는다. 멀티캐스트는 관심 없는 쪽에서 구독 여부로 부담을 줄이기 쉽다.


DNS-SD: DNS-Based Service Discovery (RFC 6763)

mDNS가 "이름 → IP"를 해결한다면, DNS-SD는 그 위에서 "이런 서비스가 있다" 고 광고하고 찾는 층이다.

DNS-SD는 DNS의 PTR, SRV, TXT 레코드 타입을 활용한다.

서비스 이름 구조

_networklogger._tcp.local.
│              │     │
│              │     └─ mDNS 도메인
│              └─ 전송 프로토콜 (_tcp 또는 _udp)
└─ 서비스 타입 (앱이 정의)

인스턴스가 붙으면:

NetworkLogger on MacBook Pro._networklogger._tcp.local.
├─ 인스턴스 이름 (사람이 읽을 수 있는)
└─ 서비스 타입

탐색 흐름

  1. _networklogger._tcp.local에 PTR 쿼리 → 인스턴스 이름 목록
  2. SRV 쿼리 → 호스트명(예: macbook.local) + 포트(9999)
  3. mDNS로 호스트명 → IP
  4. TCP로 접속

TXT 레코드

서비스에 메타데이터를 붙이는 방법이다.

버전, 기능 플래그, 프로토콜 버전 등을 key=value 형태로 전달
txtvers=1
protovers=2

클라이언트는 연결 전에 TXT 레코드를 보고 호환 가능한 서비스만 연결할 수 있다.


Bonjour

Bonjour는 Apple이 mDNS와 DNS-SD를 묶어 둔 구현·브랜드 이름이다. macOS·iOS·tvOS 등에 OS 수준으로 들어가 있다.

같은 계열이 다른 배포·이름으로도 불린다.

  • Avahi: Linux 구현체
  • Zeroconf: 이 모든 개념의 상위 개념 (zero-configuration networking)

Zero-configuration networking: 사람이 IP를 수동 설정하거나 DHCP 서버, DNS 서버 없이도 네트워크 연결이 자동으로 동작하도록 하는 개념의 묶음. IP 자동 할당(APIPA/Link-Local), mDNS, DNS-SD를 포함한다.


정리

역할기술RFC
이름 → IP (로컬)mDNSRFC 6762
서비스 탐색·광고DNS-SDRFC 6763
Apple 브랜드Bonjour
DNS-SD 레코드PTR · SRV · TXT

중앙 DNS 없이 같은 망에서 이름과 서비스를 맞추는 문제를, 멀티캐스트와 위 레코드 조합으로 푼다.