iOS Bonjour与MDNS协议
iOS Bonjour与MDNS协议
背景
在VibeOne的早期版本中,是通过后端接口获得跟手机同一网络下的白板设备的。而后端判断手机和设备是否在同一网络的逻辑也相对比较简单,只是通过判断手机和白板的IP地址是否相同来判断两者是否处于同一网络。这种判断方式在相对简单的网络环境下,有一定的效果。但是对于复杂的,多IP出口的网络,哪怕手机跟白板都连接在同一WI-FI下,也无法正确判断。这个时候,我们就需要采用局域网服务(设备)发现技术,在iOS端VibeOne采用了Bonjour协议,其中最核心的就是Multicast DNS(多播DNS)协议。
DNS协议
既然MDNS是多播DNS协议,那么首先我们需要大致了解一下,什么是DNS协议
DNS 的全称是 Domain Name System,DNS
,是一个由分层的 DNS 服务器(DNS server)
实现的分布式数据库,还是一个使得主机能够查询分布式数据库的应用层协议。最主要的作用,就是将我们平时访问网站的网址,例如www.baidu.com
,解析成路由器使用的IP地址,例如121.17.106.8
。
当我们在浏览器中输入www.xxxx.com/xxxxx.html
这个地址时,为了我们的主机能正确的将HTTP请求报文发送到对应的服务器主机,会经历以下的操作:
- 主机上运行着DNS应用的客户端
- 浏览器解析地址,获得主机名
www.xxxx.com
,并将主机名传递给DNS应用 - DNS应用向DNS服务器发送包含主机名的查询请求
- DNS服务查询后,返回包含主机名对应IP地址的回答报文
- DNS应用客户端获得IP地址后,提供给浏览器,浏览器向位于该 IP 地址 80 端口的 HTTP 服务器进程发起一个 TCP 连接
这就是DNS协议的基本作用和工作原理,详细的DNS协议内容可以阅读这篇文章万字长文爆肝 DNS 协议
单播、广播、多播(组播)
既然MDNS是多播DNS协议,那么什么是多播呢
单播、广播和多播(又称组播)是基本的计算机网络概念,表示在网络中报文的不同发送形式。
单播
当主机A中的某个程序想要将一段报文数据发送给计算机网络中的主机B的某个程序(及两个程序进行目标明确且唯一的数据传输)时,就可以采用单播的形式。通常的网络协议采用的就是单播的形式,例如TCP协议,需要建立点多点的连接。
但是单播有个前提,就是主机A必须明确的知道主机B的IP地址和主机B上某个程序所运行的端口
广播
如果主机A不知道主机B的IP地址,那么它还能用什么方式来找到主机B,答案就是采取广播的形式。
如果主机A中的某个程序采用广播的形式,那么报文信息将被发送到整个网络中的所有设备。
如果主机A在报文信息中携带了自己的IP地址和端口,那么主机B可以采用单播的形式应答主机A
如果没有,那么主机B也只能通过广播的形式应答主机A
组播
从单播和组播的局限性来看,单播必须明确知道通信方的IP地址,而广播会导致不想收到信息的网络中设备(主机C)也收到报文信息。因此还有另外一种方式,就是组播。
组播的形式就是将不同的主机按照服务类型分组,当请求报文到达组播路由器后,路由器就可以根据服务类型,发送到对应组内的主机。那么一台主机如何加入某个组中呢?
主机主动加入组:
主机主动告知网络中的组播路由器要加入某个组,这个时候组播路由器就知道网络内有224.0.0.251组的成员,会建立组的转发表
当有其他主机发送广播的目的地址为224.0.0.251时,组播路由器会将这个数据包转发给组内的其他成员,所以源主机根本不关注目的主机是谁。
组播路由器发现组:
组播路由器会周期的向局域网发送广播查询有哪些组存在
当组形成以后,主机就可以向组播路由器发送组播信息,组播信息就会被发送到组内所有主机
Bonjour
Bonjour协议是由三种协议实现的Link-Local Address协议、Multicast Dns协议和DNS-SD(dns-base service discovery)协议