【Airplay_BCT】Bonjour API架构

news2024/10/1 19:33:29

Bonjour API 架构

OS X 和 iOS 为 Bonjour 服务应用程序提供了多层应用程序编程接口 (API): Foundation 框架中的 NSNetService 和 NSNetServiceBrowser 类; CFNetServices,Core Services 中 CFNetwork 框架的一部分; Java 的 DNS 服务发现(仅限 OS X);以及围绕 BSD 套接字构建的低级 DNS 服务发现 API。所有三个 API 集都为网络服务的发布、发现和解析提供便利。图 3-1 说明了 API 层的结构。如您所见,多播 DNS 响应程序(或其他 DNS 服务器)位于最低级别,因此您的软件不必直接与 DNS 交互。
在这里插入图片描述

NSNetService 和 NSNetServiceBrowser

NSNetService 和 NSNetServiceBrowser 类是 Cocoa 中基础框架的一部分,为服务发现和发布提供了面向对象的抽象。 NSNetService 对象表示 Bonjour 服务的实例,用于发布或由客户端发现的服务,而 NSNetServiceBrowser 表示用于特定类型服务的浏览器。大多数 Cocoa 程序员应该会发现这些类足以满足他们的需要。如果您需要更详细的控制,您可以使用来自 Cocoa 应用程序的 DNS 服务发现 API。

NSNetService 和 NSNetServiceBrowser 被调度在默认的 NSRunLoop 对象上,以异步方式执行发布、发现和解析。 NSNetService 和 NSNetServiceBrowser 对象返回的所有结果都由委托对象处理。这些对象必须与一个运行循环相关联才能运行,但它不必是默认的。

CFNet服务

Core Services 框架中声明的 CFNetServices API 提供了 Core Foundation 风格的类型和函数,用于管理服务和服务发现。 CFNetServices 定义了三种 Core Foundation 对象类型,CFNetService、CFNetServiceBrowser 和 CFNetServiceMonitor。 CFNetService 是服务实例的抽象表示,可用于发布或使用。关联函数为发布和解析服务提供支持。 CFNetServiceBrowser 表示特定域中特定类型服务的浏览器。通常只有在 OS X 或 iOS 的核心基础层编写代码时才应使用此 API。

CFNetService 和 CFNetServiceBrowser 对象通常在 CFRunLoops 中提供服务。为检索结果,应用程序实施回调函数来处理事件,例如新服务出现或消失、正在解析的实例以及发生的错误。与 NSNetService 和 NSNetServiceBrowser 不同,CFNetServices 类型不需要运行循环,并且可以在需要此行为时同步运行。但是,使用这些函数的同步模式是不好的做法。

DNS 服务发现

在 /usr/include/dns_sd.h 中声明的 DNS 服务发现 API 为 Bonjour 服务提供低级 BSD 套接字通信。 DNS 服务发现充当您的软件和多播 DNS 响应程序或 DNS 服务器之间的中间层。它为您管理多播 DNS 响应程序,让您根据服务和服务浏览器而不是 DNS 资源记录来编写程序。

因为 DNS 服务发现 API 是 Darwin 开源项目的一部分,所以您应该在编写跨平台代码(适用于 iOS 和 OS X 以外的平台)或需要使用更高版本中不可用的低级功能时使用它级 API,例如 NSNetService。

如果为 Windows、Linux 或 FreeBSD 开发 Bonjour 服务应用程序,DNS 服务发现也是应该使用的 API。


## Bonjour Operations

本章描述了作为三个网络服务 API 层和 API 层本身基础的服务发布、浏览和解析的 Bonjour 操作。如果你想编写一个发布或发现网络服务的应用程序或工具,你应该阅读本章。

架构概述

Bonjour 中的网络服务架构包括一个易于使用的机制,用于发布、发现和使用基于 IP 的服务。 Bonjour 支持三个基本操作,每个操作都是零配置网络服务的必要部分:

  1. 出版物(为服务做广告)
  2. 发现(浏览可用服务)
  3. 解析(将服务实例名称翻译成地址和端口号以供使用)

## 出版物

要发布服务,应用程序或设备必须通过高级 API 或直接与响应器 (mDNSResponder) 通信,向多播 DNS 响应器注册该服务。 Bonjour 还支持使用动态 DNS 更新在传统 DNS 服务器上存储记录。

注册服务时,会创建三个相关的 DNS 记录:服务 (SRV) 记录、指针 (PTR) 记录和文本 (TXT) 记录。 TXT 记录包含解析或使用服务所需的附加数据,尽管它通常也是空的。

服务记录

SRV 记录将服务实例的名称映射到客户端实际使用该服务所需的信息。然后,客户端将服务实例名称存储为访问服务的持久方式,并在需要连接时对主机名和端口号执行 DNS 查询。这种额外的间接级别提供了两个重要的特性。首先,该服务由人类可读的名称而不是域名和端口号来标识。其次,即使服务的端口号、IP 地址或主机名发生变化,只要服务名称保持不变,客户端也可以访问该服务。

SRV 记录包含两条信息来标识服务:

  1. 主机名
  2. 端口名

主机名是当前可以找到该服务的域名。给出主机名而不是单个 IP 地址的原因是它可能是具有多个 IP 地址的多宿主主机,或者它可能具有 IPv6 地址和 IPv4 地址,等等。通过名称识别主机可以优雅地处理所有这些情况。

端口号标识服务的 UDP 或 TCP 端口。

SRV 记录根据以下约定命名:

<Instance Name>.<Service Type>.<Domain>
<实例名称>.<服务类型>.<>

,服务实例的名称,可以是任何 UTF-8 编码的 Unicode 字符串,并且旨在供人类阅读。

是一个标准的 IP 协议名称,前面有一个下划线,后面是主机到主机的传输协议(TCP 或 UDP),前面也有一个下划线。例如,在 UDP 上运行的普通 FTP 服务将具有 _tftp._udp 服务类型,而在 TCP 上运行的 IPP 打印服务将在 _ipp._tcp 服务类型下注册。官方协议名称列表由 IANA 维护;有关详细信息,请参阅域命名约定。

是一个标准的 DNS 域。这可能是特定域,例如 apple.com.,或通用后缀 local。对于只能在本地链接上访问的服务。

以下是在 TCP 端口 515 上运行的名为 PrintsAlot 的后台打印程序的 SRV 记录示例(采用标准 DNS 记录格式):PrintsAlot._printer._tcp.local。 120 IN SRV 0 0 515 blackhawk.local。

该记录将在名为 blackhawk.local 的打印机的多播 DNS 响应器上创建。在本地链接上。初始 120 表示用于缓存的生存时间 (TTL) 值。两个零是权重和优先级值,在传统 DNS 中用于在与给定名称匹配的多个记录之间进行选择;对于多播 DNS,这些值将被忽略。

指针记录

PTR 记录通过将服务类型映射到该类型服务的特定实例的名称列表来启用服务发现。此记录添加了另一层间接寻址,因此只需查找标有服务类型的 PTR 记录即可找到服务。

该记录仅包含一条信息,即服务实例的名称(与 SRV 记录的名称相同)。 PTR 记录相应地命名为 SRV 记录,但没有实例名称:<Service Type>.<Domain>

以下是名为 PrintsAlot 的后台打印程序的 PTR 记录示例_printer._tcp.local。 28800 PTR PrintsAlot._printer._tcp.local。

同样,28800 是生存时间 (TTL) 值,以秒为单位。

文本记录

TXT 记录与对应的 SRV 记录同名,可以包含少量关于服务实例的附加信息,通常最多不超过 100-200 字节。此记录也可能为空。例如,网络游戏可以通告多人游戏中使用的地图名称,聊天程序可以通告用户的可用性(例如,闲置、离开或可用)。如果需要传输的数据量较大,主机应与客户端建立连接,直接发送数据。

从历史上看,此记录已用于在同一 IP 地址的同一端口上运行的多个服务,例如在同一打印服务器上运行的多个打印队列。在这种情况下,TXT 记录中的附加信息可用于识别预期的打印队列,如本例所示:

在这里插入图片描述这种做法是必要的,因为服务类型历来与众所周知的端口相关联。鼓励新的 Bonjour 协议的设计者在不同的动态分配的端口号上运行他们服务的每个实例,而不是试图在同一个众所周知的端口号上运行它们并使用额外的信息来指定客户端正在尝试交谈的实例到。

TXT 记录中数据的性质和格式是特定于每种服务类型的,因此每种新服务类型还需要为其关联的 TXT 记录(如果有)定义数据格式,并将此格式发布为协议规范。

例子

举一个具体的例子,假设有一个通过本地网络共享音乐的设备——支持 IP 的自动点唱机。假设它的传输协议是 TCP,它的应用协议名为 music。当有人将设备插入以太网集线器时,会发生许多事情,如图 4-1 所示。

在这里插入图片描述

在步骤 1 中,设备从 IPv4 链路本地范围 169.254.0.0 中随机选择子网掩码为 255.255.0.0 的链路本地 IP 地址 169.254.150.84,并将其公布到网络中。因为没有设备响应通知,所以设备将地址作为自己的地址。在第 2 步中,它启动自己的多播 DNS 响应程序,请求主机名 eds-musicbox.local.,验证其可用性,并将该名称作为自己的名称。接下来,在步骤 3 中,设备在 TCP 端口 1010 上启动音乐共享服务。最后,在步骤 4 中,它在本地以名称 Ed’s Party Mix 发布类型为 _music._tcp 的服务。域,首先确保不存在同名服务。这将创建两个记录:

  • 名为 Ed’s Party Mix._music._tcp.local 的 SRV 记录。指向 eds-musicbox.local。在 TCP 端口 1010 上
  • 名为 _music._tcp.local 的 PTR 记录。指向 Ed 的 Party Mix._music._tcp.local。服务。

注意:发布服务时,如果域名或服务名称不可用,没有接口的设备应选择一个新名称。遇到这种情况的应用软件应该呈现一个用户界面,通知用户该名称不可用,并允许用户选择一个不同的名称。


发现

服务发现利用在服务发布期间注册的 DNS 记录来查找特定类型服务的所有命名实例。为此,应用程序通常通过更高级别的 API 查询与服务类型(例如 _http._tcp)匹配的 PTR 记录。在每台设备上运行的多播 DNS 响应程序返回带有服务实例名称的 PTR 记录。

在这里插入图片描述

图 4-2 说明了浏览音乐共享服务的客户端应用程序。在第 1 步中,客户端应用程序发出对本地 _music._tcp 类型服务的查询。域到标准多播地址 224.0.0.251。网络上的每个多播 DNS 响应程序都会听到请求,但只有音乐共享设备会使用 PTR 记录进行响应(第 2 步)。生成的 PTR 记录包含服务实例名称 Ed’s Party Mix._music._tcp.local。在这种情况下。然后,客户端应用程序可以从 PTR 记录中提取服务实例名称,并将其添加到屏幕上的音乐服务器列表中。


解析

服务发现通常只偶尔发生一次——例如,当用户第一次选择打印机时。此操作保存服务实例名称,即任何给定服务实例的预期稳定标识符。端口号、IP 地址,甚至主机名每天都在变化,但用户不需要每次都重新选择打印机。因此,从服务名称到套接字信息的解析直到服务被实际使用时才会发生。

为了解析服务,应用程序使用服务名称执行 SRV 记录的 DNS 查找。多播 DNS 响应器使用包含当前信息的 SRV 记录进行响应。

图 4-3 说明了音乐共享示例中的服务解析。解析过程从向多播地址 224.0.0.251 请求 Ed’s Party Mix._music._tcp.local 的 DNS 查询开始。 SRV 记录(步骤 1)。在第 2 步中,此查询返回服务的主机名和端口号 (eds-musicbox.local., 1010)。在第 3 步中,客户端发出 IP 地址的多播请求。在第 4 步中,此请求解析为 IP 地址 169.254.150.84。然后客户端可以使用 IP 地址和端口号连接到服务。每次使用服务时都会发生此过程,因此总能找到服务的最新地址和端口号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在现实场景中随心放置AR虚拟对象?

随着AR的发展和电子设备的普及&#xff0c;人们在生活中使用AR技术的门槛降低&#xff0c;比如对于不方便测量的物体使用AR测量&#xff0c;方便又准确&#xff1b;遇到陌生的路段使用AR导航&#xff0c;清楚又便捷&#xff1b;网购时拿不准的物品使用AR购物&#xff0c;体验更…

【每天进步一点点】函数表达式和函数声明

函数声明 function 函数名&#xff08;&#xff09;{} 函数声明会被率先读取。 函数声明后不会立即执行&#xff0c;会在我们需要的时候调用到。 由于函数声明不是一个可执行语句&#xff0c;所以不以分号结束。 函数表达式 表达式赋值给了一个变量 const 变量名 functi…

GT-suite v2016解决许可证过期问题(附新版liscense下载地址)

安装GT-suite v2016时遇到了如图报错的问题。当时的报错找不到了&#xff0c;下图是贴吧相同问题的报错图。 为了解决问题&#xff0c;先根据某网友的如下答复操作&#xff1a; 添加环境变量后仍然有相同报错。 看来需要寻找其他方法。 再尝试着卸载GT-suite v2016&#xff0c…

【Python--torch.nn.functional】F.normalize用法 + 代码说明

【Python–torch.nn.functional】F.normalize介绍 代码说明 文章目录【Python--torch.nn.functional】F.normalize介绍 代码说明1. 介绍2. 代码说明2.1 一维Tensor2.2 二维Tensor2.3 三维Tensor3. 总结1. 介绍 import torch.nn.functional as F F.normalize(input: Tensor, …

(考研湖科大教书匠计算机网络)第四章网络层-第五节:静态路由配置及其可能产生的路由环路问题

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;静态路由配置&#xff08;1&#xff09;概述&#xff08;2&#xff09;举例说明A&#xff1a;静态路由配置B&#xff1a;默认路由C&#xff1a;特定…

【Python从入门到进阶】7、运算符

接上篇《6、变量规范及类型转换》 上一篇我们学习了Python变量的命名规范以及类型转换。本篇我们来学习Python的运算符部分&#xff0c;包括算数运算符、赋值运算符、比较运算符、逻辑运算符等。 一、运算符含义 运算符用于执行程序代码运算&#xff0c;会针对一个以上操作数…

网友眼中越老越吃香的行业,果然是风向变了!

越老越吃香的行业&#xff0c;一直都是被热议的话题。对于年轻人来说&#xff0c;找到一个适合自己的并且具有前景的工作&#xff0c;不是一件容易的事情。 最近&#xff0c;看到有人在平台上问相关的问题&#xff0c;本着认真看一看的态度点进去&#xff0c;却差点被热评第一…

MyBatis详解1——相关配置

一、什么是MyBatis 1.定义&#xff1a;是一个优秀的持久层框架&#xff08;ORM框架&#xff09;&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis是一个用来更加简单的操作和读取数据库的工具。 2.支持的操作方式&#xff1a;xml或者注解实现操作&#xff08;xm…

Hadoop集群配置

一、系统文件配置集群部署规划NameNode和SecondaryNameNode不要安装在同一台服务器ResourceManager也很消耗内存&#xff0c;不要和NameNode、SecondaryNameNode放在同一台机器上。这里装了四台机器&#xff0c;ant151,ant152,ant153,ant154。ant151ant152ant153ant154NameNode…

【JUC并发编程】18 CopyOnWriteArrayList源码也就够看2分钟

文章目录1、CopyOnWriteArrayList概述2、原理 / 源码1&#xff09;构造函数2、add()3&#xff09;get()4&#xff09;remove()5&#xff09;iterator()1、CopyOnWriteArrayList概述 CopyOnWriteArrayList相当于线程安全的ArrayList&#xff0c;底层是一个可变数组。 特点如下…

如何在外网访问内网的 Nginx 服务?

计算机业内人士对Nginx 并不陌生&#xff0c;它是一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;除了nginx外&#xff0c;类似的apache、tomcat、IIS这几种都是主流的中间件。 Nginx 是在 BSD-like 协议下发行的&…

PythonWeb Django PostgreSQL创建Web项目(一)

环境搭建与初始化 一、 python3下载安装测试 1. 下载地址 官网地址&#xff1a;https://www.python.org/ 国内速度比较慢 国内镜像网站地址&#xff1a;https://registry.npmmirror.com/binary.html?pathpython/ 推荐地址速度快 目前官网最新版本3.11.2如下官网截图 要用嘛…

物联网通信复习简记——助力通关期末考试

物联网通信复习简记——助力通关期末考试 文章目录物联网通信复习简记——助力通关期末考试1. 概述1.1 物联网通信体系架构的基本概念1.2 网络分层模型1.3 常见IoT通信技术2. 物理层2.1 编码/基带信号波形/数字基带调制2.2 信道编码-1- 奇偶校验码-2- 汉明码-3- 循环码差错检验…

人员定位需求多,场景目标各不同

GPS技术为现代人带来了许多便利&#xff0c;也提供了诸多基于位置的新型服务。随着科技的发展&#xff0c;人员位置信息在如今的生产生活中也越发重要起来。因此&#xff0c;不同行业领域开始关注人员定位&#xff0c;尤其关注室内人员定位。室内人员定位需求从目的性出发&…

Venom靶机

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;fv06 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 1.探测目标靶机开放端口和服务情况 nmap -p- -sV -A 10.10.10.133 2.查看网页最下面&#xf…

GaiaX开源解读 | 表达式作为逻辑动态化的基础,我们是如何设计的

GaiaX跨端模板引擎&#xff0c;是在阿里优酷、淘票票、大麦内广泛使用的Native动态化方案&#xff0c;其核心优势是性能、稳定和易用。本系列文章《GaiaX开源解读》&#xff0c;带大家看看过去三年GaiaX的发展过程。 前言 GaiaX【https://github.com/alibaba/GaiaX】是由优酷应…

详解ArrayList

目录 1.数据结构 2.初始化 2.1.默认构造 2.2.带参构造 3.扩容 3.1.判断需要多少容量 3.2.判断是否需要扩容 3.3.扩容 4.遍历 5.拷贝 6.序列化 JDK版本&#xff1a;JDK8 1.数据结构 底层使用Object类型的数组实现&#xff0c;线程不安全&#xff0c;添加元素时如果内存…

【遇见青山】基于Redis的Feed流实现案例

【遇见青山】基于Redis的Feed流实现案例1.关注推送2.具体代码实现1.关注推送 关注推送也叫做Feed流&#xff0c;直译为投喂。为用户持续的提供"沉浸式”的体验&#xff0c;通过无限下拉刷新获取新的信息。 Feed流产品有两种常见模式&#xff1a; 这里我们实现基本的TimeL…

Python 爬虫工程师面试经验分享,金三银四

&#x1f643; 作为一个 Python 爬虫工程师&#xff0c;我可以分享一些我在面试中的经验和建议。 首先一点是在面试中要表现自信、友好、乐于合作&#xff0c;同时对公司的业务和文化也要有一定的了解和兴趣&#xff0c;这些也是公司在招聘中看重的因素。 文章目录&#x1f55b…

第06章_MySQL多表查询

第06章_多表查询 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之…