读懂RFC 6762,掌握mDNS协议

在同一个链路网络(Link Local)中,Windows平台上的域名解析经历了netBIOS,到LLMNR,直到Windows 10才有mDNS. LLMNR(Link Local Multicast Name Resultion)协议和mDNS(multicast DNS)都是基于DNS这个传统协议,  而且在局域网环境中都采用了广播机制,并且在一定的时间内一般会多次广播同一查询消息, 但LLMNR在Query时使用broadcast, Reply使用unicast机制, mDNS的应答通常也是广播(除非在QCLASS字段最高位设置1),可以让其他主机收到消息更新cache,由于LLMNR适用于任何域名的解析需求, 而不仅仅是.local的域名, 因此也带了一些潜在的安全隐患, 这或许是LLMNR没有被IETF采纳的原因吧. mDNS是Apple公司的Bonjour协议基础上发展起来的, 最终成为一个正式标准(RFC 6762), 从Windows 10, Mac, Linux到RaspberryPi都支持这个协议(例如在Ubuntu中可以通过查询命令sudo fuser 5353/udp发现是avahi实现的mDNS).

mDNS除了可以解析域名,也可以配合DNS-SD(Service Discovery)查询服务, 返回的结果称为Resource Records. 在IPv4中它使用广播组224.0.0.251(IPv6中为FF02::FB), 端口为UDP 5353 (传统的DNS中端口为UDP/TCP 53, TCP通常在UDP包大小受限时使用). 类似于DNS, 消息的格式(参考RFC 1035)由四部分组成: header, questions,  answers, authorities和additionals. 其中:

1) header中的字段QR用来区分是查询还是应答, 其中下ID字段在广播查询和应答中被忽略,因为广播不需要识别符; 当QR=0表示查询, 当QR=1表示应答;OPCODE是0, 表示标准查询(在传统的DNS中可能还支持其他的OPCODE,比如逆向查询); 在应答消息中AA(Authoritative Answer)必须是1, 因为每一个应答都是单台主机发出的属于自己的权威信息;另外RA和RD这两个关于recursion的字段都被忽略 (c.f. 在DNS中要求实现iterative查询,而recursion查询是可选的). 剩下了的四个计数字段分别说明后面的questions,  answers, authorities和additionals各有多少Resource Records (RR)条目.

2)questions部分是查询的域名信息,mDNS中每个查询的questions可以一次发送多个(比如同时发送A和AAAA),这样可以提高效率.每个question包括三个字段QNAME, QTYPE和QCLASS. 其中QNAME是要查询的域名,例如raspberrypi.local.或2.1.168.192.in-addr.arpa.等;QTYPE对应DNS中的types,比如A, AAAA, PTR等记录类型,当QTYPE为Any时,在接下来的应答中要求返回所有的QTYPE类型的信息,而不像传统的DNS那样可能只返回一部分信息;QCLASS使用IN(表示internet),需要注意的是,由于QCLASS是一个16位的字段,平时最高位并没有被使用,当最高位设置为1表示接下来期望得到的应答是unicast的,即QU消息(应用场景:比如在主机刚上电,系统刚启动的时候,发送QU查询可以提高网络使用效率),其他情况是broadcast,即QM消息.说到网络效率,在QM查询时, 主机也往往在answers部分填充已经知道的信息(Known-Answers)和这些已知资源的TTLs,避免接下来收到重复发送应答, 当Known-Answers太多时,还需要设置header中的TC字段,表明后面还有其他包需要发送.

3)answers, authorities和additionals都是Resource Records (RRs)部分,每一条RR记录包含NAME, RTYPE, RCLASS,TTL, RDLENGTH和RDATA字段.其中NAME表明该资源的名称,RTYPE是类型,比如A, PTR(在mDNS中没有SOA这样的record);RCLASS通常使用IN,在answers部分,将资源的RCLASS字段的最高有效位可以设置为cache-flush=1,告诉其他主机需要将该资源更新; TTL若等于0表明该信息已经过时(比如打印机等共享资源可以通过unsolicited responses的形式发送TTL=0的包告诉该条旧资源已经过时,这样其他主机可以将该资源删除);RDLENGTH是指定RDATA的长度(因为RDATA是可变字段); RDATA根据RTYPE和RCLASS的不同,具有不同的值,比如当RTYPE=A,RCLASS=IN时,RDATA字段就是IPv4地址.

系统刚启动时一般还有Probe和Announcement过程,这点可以联想到IPv4 Link-Local Address中使用ARP的机制实现类似功能(RFC3927),其中Probe是查询当前主机的信息是否合法可用,Announcement是用unsolicited responses的形式,告诉其他主机关于当前主机的信息;mDNS和DNS的另一个不同之处在于,mDNS可以让主机主动否定某资源的存在,这往往发生在该主机独占该资源,但当前该资源还未加入使用的情况,这是通过借用NSEC记录来设置的,更多的内容可以参考RFC6762.

mDNS的协议抓包可以使用Wireshark工具,例如通过设置udp and udp.port ==5353过滤可以更容易查看UDP包.在Linux上可以安装avahi-utils,发送查询请求,例如:avahi-resolve --name raspberrypi.local. 另外在python 3中可以使用dnslib查询.

总之,mDNS作为标准,几乎在任何最新设备上都有实现,掌握mDNS的消息格式开发应用中具有非常重要的意义.

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RFC3261是一种通信协议,全称为“SIP:会话初始化协议”。它是一种基于IP的协议,用于建立、修改和终止多媒体会话,例如语音通话和视频会议。SIP协议在互联网通信中扮演着重要的角色。 RFC3261详细定义了SIP协议的各个方面,包括消息的格式、处理规则和状态维护机制等。它规定了通信终端之间如何进行会话请求和应答,以及如何处理错误和异常情况。 SIP协议的主要功能包括: 1. 定义了会话的建立和终止过程:SIP协议使用呼叫请求和应答进行会话的初始化和终止,允许用户在任何地点、任何设备上进行通信。 2. 支持多媒体通信:SIP协议可以传输语音、视频、即时消息和其他多媒体数据,支持实时通信和多媒体会议。 3. 具有灵活的扩展性:SIP协议允许新增自定义的头字段和方法,以满足特定应用需求,并可以与其他协议(如HTTP和LDAP)集成。 4. 提供呼叫管理功能:SIP协议可以进行呼叫转移、呼叫保持和会话协商等操作,提供了灵活的呼叫管理功能。 5. 支持用户鉴权和身份验证:SIP协议提供用户鉴权和身份验证机制,确保通信的安全性和用户身份的合法性。 总之,RFC3261定义了SIP协议的规范,它是一种重要的通信协议,广泛用于语音通信和多媒体会议等场景。通过SIP协议,用户可以方便地进行实时通信,并享受到多种多样的通信服务。 ### 回答2: RFC3261是SIP(会话初始化协议)的标准定义,它是一种用于建立、修改和终止多媒体会话的协议。SIP协议在互联网上的通信中起到了重要的作用,它能够在不同的终端设备之间传输语音、视频和其他媒体数据。 RFC3261详细规定了SIP协议的各个方面,包括消息格式、请求和响应的格式、状态码、会话建立过程以及会话管理。该协议使用文本和标签作为通信的基础,使用请求-响应模型进行通信。 在RFC3261中,SIP消息包括请求消息和响应消息。请求消息包括INVITE、ACK、OPTIONS、BYE等,用于发起、确认、查询和结束会话。响应消息包括1XX、2XX、3XX、4XX、5XX、6XX等状态码,用于确认请求的处理结果。 会话建立过程涉及到用户代理、代理服务器和重定向服务器之间的交互。建立会话需要发送INVITE请求,然后等待对端的响应。通过交换一系列的请求和响应,最终确定会话参数,并建立媒体通道。 会话管理主要包括会话保持、会话更新和会话终止等。通过发送和接收SIP消息,参与者可以保持会话活动。会话更新用于修改会话参数或扩展会话。而会话终止则是通过发送BYE请求来结束会话。 总而言之,RFC3261为SIP协议的设计和使用提供了详尽的规范和指导。它为多媒体会话的建立、修改和终止提供了一种标准化的方式,使得不同的终端设备能够在互联网上进行有效的通信。通过遵循RFC3261的规范,能够实现更可靠和互操作的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值