[toc]

基础概念

路由

路由中有以下几种形式

单播:在网络地址和网络节点之间存在一一对应的关系。

任播:根据路由拓扑自动决定送到“最近”或“最好”的目的地

多播:是一种群组通信,它把信息同时传递给一组目的计算机。常指IP多播,组播地址224.0.0.0~224.0.0.255

广播:向指定网络范围内所以设备发送信息,主机标识段host ID 为全1 的IP 地址为广播地址,ARP、DHCP都使用了广播

地域性广播:一种“特殊”的多播

DNS

Domain Name System,域名服务,将域名和ip地址互相影射的分布式数据库,使用TCP和UDP的53端口

TCP:面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况,使用这个协议。

UDP:用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

zeroConf

Zero configuration networking,零配置网络服务规范是一种让用户武穴使用DHCP、DNS等设置就能自动连接设备的一种规范,主要包含以下协议

  • Link-Local Address: 无需利用DHCP Server 取得设备地址和IP的相关资料 【RFC3927】
  • Multicast Dns: 不需要DNS Server 就可以解决domain 和ip的绑定关系 【RFC6762】
  • DNS-SD(dns-based service discovery): 不需要目录服务器,就可以自动发现设备服务 【RFC6763】

mDNS

原理和特点

Multicast DNS (mDNS),多播DNS,使用5353端口,组播地址为 224.0.0.251[FF02::FB] 。在一个没有常规DNS服务器的小型网络内可以使用mDNS来实现类似DNS的编程接口、包格式和操作语义,mdns协议使用DNS协议一样的数据包

若主机开启了mDNS,在进入局域网内时会向224.0.0.251地址发送信息,信息内容包含,ip地址端口号,服务名等;

同时其mDNS服务会向其它mDNS询问获取局域网内的服务。

mDNS的顶级域名用 .local 和普通域名区分开的.

DNS-SD

DNS Service Discovery是一种基于 DNS 协议的服务发现协议,设备之间可以通过该协议自动发现服务

使用如下格式

<instance>.<service>.<transport>.<domain>

流程

启动DNS-SD的主机在进入局域网后或启动DNS-SD后会向组播地址发送组播消息,包括主机名、IP信息等,其他拥有相应服务的主机会响应

关闭DNS-SD的主机在关闭DNS-SD后会向组播地址刷新组播消息,清除信息

技术应用

avahi、bonjour、WiSe-Zeroconf是zeroconf协议的常用实现

在苹果家族中常使用Bonjour、linux中常用avahi、在嵌入式领域常用WiSe-Zeroconf

小玩具

安装&下载:rocket:

使用golang的zeroconf包进行简单封装的玩具

server端:amd64-linux amd64-mac amd64-win

client端:amd64-linux amd64-mac amd64-win

演示

AVAHI

安装

1
yum install nss-mDNS avahi avahi-tools -y

avahi-tools是avahi的工具包,包含avahi-browse、avahi-publish-address 、 avahi-resolve-host-nameavahi-browse-domains、avahi-publish-service、avahi-set-host-name、avahi-daemon、avahi-resolve、avahi-publish、avahi-resolve-address

常用的avahi-browse的功能如下

1
2
3
4
5
6
7
8
9
10
11
12
-D --browse-domains  浏览域而不是服务
-a --all 显示所有服务,忽略类型
-d --domain=DOMAIN 要浏览的域
-v --verbose 启用详述模式
-t --terminate 导出一个完整列表后终止
-c --cache 导出缓存中的所有条目后终止
-l --ignore-local 忽略本地服务
-r --resolve 解析找到的服务
-f --no-fail 如果 daemon 不可用也不中断
-p --parsable 输出可解析格式
-k --no-db-lookup 不查询服务类型
-b --dump-db 导出服务类型数据库

添加服务

创建文件 /etc/avahi/services/wltHello.service

1
2
3
4
5
6
7
8
9
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name>wlt@*Hello</name>
<service>
<type>_wlt@*Hello._tcp</type>
<port>5678</port>
</service>
</service-group>

重启服务

1
2
systemctl restart dbus
systemctl restart avahi-daemon

查询服务

1
2
3
[root@localhost ~]# avahi-browse -vrtp _wlt@*Hello._tcp
+;eth0;IPv4;wlt\064\042Hello;_wlt\064\042Hello._tcp;local
=;eth0;IPv4;wlt\064\042Hello;_wlt\064\042Hello._tcp;local;linux.local;172.20.65.36;5678;

通过avahi-browse即可在局域网内通过avahi-browse发现服务

在实际生产中,我们可以在开启服务时同时添加mDNS服务,消费者机器通过avahi-browse查询服务得到开启服务的ip地址,再进一步与服务建立链接。除此之外avahi还暴露了一些api:https://www.avahi.org/doxygen/v0.7/html/index.html