-
Notifications
You must be signed in to change notification settings - Fork 283
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RFC] peer discovery with mDNS #80
Merged
Changes from 8 commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
a4626ef
feat: initial description of peer discovery with MDNS
richardschneider 9e0e1f5
fix: grammar
richardschneider 154424f
fix: typos
richardschneider b2c450e
docs: multiaddress
richardschneider 105fd2b
fix: '_ipfs' => '_p2p'
richardschneider a9c587c
fix: use TXT dnsaddr for multi address
richardschneider 2e0219a
feat: open issues
richardschneider 8cc1297
fix: names are case insensitive
richardschneider 53d9faf
doc: long peer names
richardschneider 409c019
docs: link to discovery/mdns.md
richardschneider 59e0793
docs: worked example
richardschneider 2f3e55d
docs: few edits to the structure
daviddias 479f07c
editorial refinements.
raulk 4c5a459
feat: private networks
richardschneider File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# Multicast DNS | ||
Author: Richard Schneider (makaretu@gmail.com) | ||
|
||
|
||
## Overview | ||
|
||
The goal is to allow peers to discover each other when on the same local network with zero configuration. | ||
MDNS uses a multicast system of DNS records; this allows all peers on the local network to see all query responses. | ||
|
||
Conceptually, it is very simple. When a peer starts (or detects a network change), it sends a query for all peers. | ||
As responses come in, the peer adds the other peers information into is local database of peers. | ||
|
||
## Definitions | ||
|
||
`service-name` is the DNS-SD service name for all peers. It is defined as `_p2p._udp.local`. | ||
|
||
`host-name` is the fully qualified name of the peer. It is derived from the peer's name and `p2p.local`. | ||
|
||
`peer-name` is the case-insenstive ID of the peer and less than 64 characters. It is normally is the base-32 encoding of peer's ID. | ||
richardschneider marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Note that all names are case insensitive. | ||
|
||
## Peer Discovery | ||
|
||
### Request | ||
|
||
To find all peers, a DNS message is sent with the question `_p2p._udp.local PTR`. | ||
Peers will then start responding with their details. | ||
|
||
Note that a peer must respond to it's own query. This allows other peers to passively discover it. | ||
|
||
### Response | ||
|
||
On receipt of a `find all peers` query, a peer sends a DNS response message (QR = 1) that contains | ||
the **answer** | ||
|
||
<service-name> PTR <peer-name>.<service-name> | ||
|
||
The **additional records** of the response contain the peer's discovery details | ||
|
||
<peer-name>.<service-name> TXT "dnsaddr=..." | ||
|
||
The TXT record contains the multiaddresses that the peer is listening on. Each multiaddress | ||
is a TXT attribute with the form `dnsaddr=.../p2p/QmId`. Multiple `dnsaddr` attributes | ||
and/or TXT records are allowed. | ||
|
||
## DNS Service Discovery | ||
|
||
DNS-SD support is not needed for peers to discover each other. However, it is | ||
extremely usefull for network administrators to discover what is running on the | ||
network. | ||
|
||
### Meta Query | ||
|
||
This allows discovery of all services. The question is `_services._dns-sd._udp.local PTR`. | ||
|
||
A peer responds with the answer | ||
|
||
_services._dns-sd._udp.local PTR <service-name> | ||
richardschneider marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Find All Response | ||
|
||
On receipt of a `find all peers` query, the following **additional records** should be included | ||
|
||
<peer-name>.<service-name> SRV ... <host-name> | ||
<host-name> A <ipv4 address> | ||
<host-name> AAAA <ipv6 address> | ||
|
||
### Gotchas | ||
|
||
Many existing tools ignore the Additional Records and always send individual queries for the | ||
peer's discovery details. To accomodate this, a peer should respond to the following queries: | ||
|
||
- `<peer-name>.<service-name> SRV` | ||
- `<peer-name>.<service-name> TXT` | ||
- `<host-name> A` | ||
- `<host-name> AAAA` | ||
|
||
## Issues | ||
|
||
- MDNS requires link local addresses. Loopback and "nat busting" addresses should not sent and must | ||
be ignored on receipt? | ||
|
||
## References | ||
|
||
- [RFC 1035 - Domain Names (DNS)](https://tools.ietf.org/html/rfc1035) | ||
- [RFC 6762 - Multicast DNS](https://tools.ietf.org/html/rfc6762) | ||
- [RFC 6763 - DNS-Based Service Discovery](https://tools.ietf.org/html/rfc6763) | ||
- [Multiaddr](https://github.com/multiformats/multiaddr) | ||
|
||
## Worked Example | ||
|
||
**TODO** |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
peer-name
is just a unique name, we should not assume it's the peer id. Thednsaddr
ends with the peer ID.I think Workaround A: Split at 63rd character makes sense.