ZBLOG

mdns中组播发送 query

mDNS(Multicast DNS)是一种用于局域网中设备发现和名称解析的协议,它允许设备通过组播进行通信。在mDNS中,查询(Query)通常是指设备发送请求以查找特定服务或资源。

mDNS 查询流程

  1. 创建查询消息

    • 消息头部包含事务ID、标志位、问题数量、回答数量等信息。
    • 查询部分包含要查找的服务类型,例如 _http._tcp.local. 或者具体的主机名。
  2. 构造数据包

    • mDNS使用UDP协议,发送到224.0.0.251(IPv4)或FF02::FB(IPv6)的组播地址,端口为5353。
    • 数据包格式包括:Header + Question + Answer (通常在查询时没有) + Authority (通常也为空) + Additional (通常为空)。
  3. 发送查询

    • 将构建好的数据包通过网络接口发送出去。

示例

假设你想要查找局域网内的HTTP服务,可以构造如下mDNS查询:

  • 服务类型_http._tcp.local.
  • 事务ID: 随机生成,比如 0x1234

构造一个简单的mDNS查询示例

以下是一个简化的Python示例,演示如何使用 socket 库构建并发送mDNS查询:

import socket
import struct

def send_mdns_query(service_name):
    # 创建UDP套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)

    # mDNS multicast address and port
    mdns_address = ('224.0.0.251', 5353)

    # 生成随机事务ID
    transaction_id = 0x1234
    
    # 构建mDNS查询报文
    query = struct.pack('>HHHHHH',
                        transaction_id,         # Transaction ID
                        0x0100,                # Flags: Standard query (Recursion desired)
                        1,                      # Questions: Number of questions
                        0,                      # Answer RRs: Number of answers
                        0,                      # Authority RRs: Number of authority records
                        0)                      # Additional RRs: Number of additional records

    service_labels = service_name.split('.')
    
    for label in service_labels:
        query += struct.pack('B', len(label)) + label.encode('utf-8') 
    
    query += struct.pack('>BHH', 0, 1, 255) # Null byte (end), type A(1), class IN(255)

    print("Sending mDNS Query...")
    
    # 向mdns_address发送报文
    sock.sendto(query, mdns_address)

# 使用示例:发送_http._tcp.local 的mDNS查询
send_mdns_query('_http._tcp.local.')

注意事项

  • 在真实环境中,你需要处理来自其他设备的响应,这可能涉及到异步编程或线程,以便在接收到响应后继续处理。
  • 确保你的防火墙规则允许UDP流量通过5353端口。
  • mDNS主要用于小型网络中,对于大规模部署更推荐使用其他更可靠的方法。

希望这可以帮助你理解如何在mDNS中进行组播发送查询!如果有任何进一步的问题,请随时询问。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=5930

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?