로컬 망에서는 전역 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.
├─ 인스턴스 이름 (사람이 읽을 수 있는)
└─ 서비스 타입
탐색 흐름
_networklogger._tcp.local에 PTR 쿼리 → 인스턴스 이름 목록- SRV 쿼리 → 호스트명(예:
macbook.local) + 포트(9999) - mDNS로 호스트명 → IP
- 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 (로컬) | mDNS | RFC 6762 |
| 서비스 탐색·광고 | DNS-SD | RFC 6763 |
| Apple 브랜드 | Bonjour | — |
| DNS-SD 레코드 | PTR · SRV · TXT | — |
중앙 DNS 없이 같은 망에서 이름과 서비스를 맞추는 문제를, 멀티캐스트와 위 레코드 조합으로 푼다.