根据 Wikipedia,UNICAST-RESPONSE字段用于最小化网络上不必要的广播:如果设置了该位,响应者应该直接向查询节点发送定向单播响应,而不是将响应广播到整个网络。
当它被设置为响应时是什么意思?Wireshark 显示为Cache flush
,这是什么意思?我找不到更多文档。
TIA。
根据 Wikipedia,UNICAST-RESPONSE字段用于最小化网络上不必要的广播:如果设置了该位,响应者应该直接向查询节点发送定向单播响应,而不是将响应广播到整个网络。
当它被设置为响应时是什么意思?Wireshark 显示为Cache flush
,这是什么意思?我找不到更多文档。
TIA。
我正在寻找一种仅通过 IPv6 在 OSX 上进行反向 mDNS 查询的方法。我对使用 IPv4 的解决方案不感兴趣。
以下适用于dig
9.16.1 的 Linux:
dig +short @ff02::fb -p 5353 -x 2001:db8::1
我已经在 OSX 上安装dig
了带有 homebrew 的 9.16.7,该命令具有完全相同的参数会产生超时。并且在 Wireshark 上没有传出查询的迹象。
以下在 Linux 和 OSX 上运行良好:
dig +short @224.0.0.251 -p 5353 -x 192.168.1.23
该二进制文件avahi-resolve-address
在 OSX 上不可用,而且我没有找到使反向 DNS 与dns-sd
.
这是使用的操作系统版本:
我想avahi-resolve
并且dig -p 5353 @224.0.0.251
做了很多同样的事情。
但是,我有一个设备,我可以使用avahi-resolve
但不使用来解析其名称dig
:
$ avahi-resolve --name ding-5cd80b3.local
ding-5cd80b3.local 192.168.0.248
$ dig +short -p 5353 @224.0.0.251 ding-5cd80b3.local
;; Warning: ID mismatch: expected ID 60466, got 0
我也不能进行反向查找:
$ avahi-resolve --address 192.168.0.248
Failed to resolve address '192.168.0.248': Timeout reached
$ dig +short -p 5353 @224.0.0.251 -x 192.168.0.248
;; connection timed out; no servers could be reached
宣传其名称的设备是一个简单的物联网设备,因此我对它具有非常基本的 mDNS 支持(如果使用ESP-IDF 提供的mDNS 支持)并不感到惊讶。
我已经尝试对两者都使用详细标志,avahi-resolve
并dig
查看是否可以让我对正在发生的事情有所了解,但在这两种情况下,我都没有得到任何额外的见解。
我猜这ID mismatch
意味着它dig
实际上正在得到响应,但拒绝显示它,因为它将这解释为DNS 欺骗的情况,同时avahi-resolve
更加宽容。
除了使用 Wireshark 之外,有什么方法可以让dig
我变得更加宽容(我试过了)或者我可以看到这里发生了什么?+besteffort
我正在使用 Ubuntu,并且如前所述,有问题的设备正在使用ESP-IDF。
如标题所述,
我从 googlecast 地址检测到一些 MDNS 查询,这很奇怪,因为我没有安装任何 googlecast 应用程序或类似应用程序。
此外,我的 PC 正在向 239.255.255.250(子网?)发送关于“M-Search:HTTP/1.1”字符串到 Chrome OS 机器的 SSDP 数据包。
MDNS 数据包:192.168.1.65 224.0.0.251 MDNS 119 标准查询 0x000b PTR _674A0243._sub._googlecast._tcp.local,“QM”问题 PTR _8E6C866D._sub._googlecast._tcp.local,“QM”问题 PTR _googlecast._tcp.local ,“质量管理”问题
SSDP 数据包:192.168.1.67 239.255.255.250 SSDP 216 M-SEARCH * HTTP/1.1
也许值得一提的是,我注意到这些 SSDP 数据包的指定“用户代理”被声明为“Google Chrome”或“Chrome OS”。这只是谷歌浏览器的默认功能,包括他们的拨号技术。
是否有一个 ipfw 规则可以轻松地将 mDns 数据包从一个子网转发到另一个子网?我有一台 Snow Leopard Server 机器作为两个子网之间的网关,并且希望每个子网中的机器都能看到另一个子网中可用的服务。网关机器已确认配置正确,因此数据包在两个子网之间正确路由(ping 正常,traceroute 显示子网跃点等)。我在设计 ipfw 规则时遇到的问题是,我不知道如何指示我希望将发送到 en0 上的 224.0.0.251:5353 的多播数据包发送到相同的 ip/port 但在 fw0(另一个接口)上。我尝试了一个规则,例如
fwd 192.168.10.1 log udp from 192.168.1.0/24 to 224.0.0.251 recv en1
强制数据包跳到另一个接口(从 en1 到 fw0),但没有骰子。ipfw 日志显示该规则是由数据包触发的,但 tcpdump 没有显示其他接口上的任何数据包。此外,唯一的其他防火墙规则是转移端口 8668 和规则#65535“允许任何到任何”。
有什么建议么?谢谢。
首先,Bonjour 到底做了什么(请阅读我下面写的猜测)?
在这里,我发现 Bonjour 可以自动发现 IP 网络上的计算机、设备和服务。但我认为它不仅“发现 IP 网络上的设备”,它还通过将 IP 地址分配给运行 Bonjour 的设备来创建 IP 网络。我对吗?
我仍然怀念本质。它是否以下列方式工作?首先,我以物理方式连接设备(例如笔记本电脑),以便它们可以相互通信。然后,假设在一些笔记本电脑上我运行 Bonjour,然后,这些笔记本电脑会自动为它们分配 IP 地址。因此,笔记本电脑(运行 Bonjour 的地方)构建了一个 IP 网络。它以这种方式工作吗?
或者可能是运行 Bonjour 的计算机不被视为一项服务,并且它不会仅仅因为 Bonjour 在这台计算机上运行而广播自己。我的意思是计算机上运行的应用程序需要使用 Bonjour 进行广播。因此,是应用程序自己广播(而不是计算机)并且它不是自动完成的(应用程序需要明确地广播自己)。这样对吗?
我的应用程序究竟如何广播自己?我可以使用命令行注册服务(以便所有使用 Bonjour 的应用程序都知道出现了新服务)吗?
此外,我想要一个使用 Bonjour 创建的 IP 网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地说,我的应用程序需要有一个服务列表。列表中的每个服务都应该有一个名称、运行它的 IP 地址和应用程序使用的端口。Bonjour 能否以某种方式提供此信息?如果是这样,它究竟是如何工作的。我的程序如何从 Bonjour 获取这些信息?我的程序可以读取一些由 Bonjour 创建并包含上述信息的文件吗?我可以在命令行中使用一些命令来检索这些信息吗?
我对从文件、环境变量或命令行中的命令访问有关服务的信息特别感兴趣。这些选项在我看来是最简单的!因为在这些情况下,我不需要使用任何其他库来通过特定编程语言与 Bonjour 进行通信。
PS如果我的问题不清楚,请提出问题。我将尝试以更清晰的方式提出我的问题。
PPS我使用的是 Windows 7。
补充:我打算用 PHP 编写我的应用程序。每台计算机都应该运行 Apache Web 服务器。我想使用 Bonjour 帮助计算机发现彼此(计算机在本地网络中工作)。
我有一个 Ubuntu 9.04 盒子和一个 OS X 10.5 盒子。它们都在同一个子网 (192.168.10.0/24) 上。我可以从 OS X 机器上看到 ubuntu.local 和 osx.local,但我只能从 Ubuntu 机器上看到 ubuntu.local。当我 ping 他们时,ubuntu.local 是 192.168.10.50,但 osx.local 是 192.168.132.1。OS X 机器的 IP 显然是错误的,我不确定它是如何得到的。我用它连接到三个网络(192.168.20.0/24 以太网、192.168.2.0/24 无线和前面提到的 192.168.10.0/24 无线),所以 192.168.132.1 看起来很奇怪。
我会标记这个 mdns,但我还没有足够的积分。
这是结果ifconfig
,看起来好像 bonjour 正在抓取 VMWare 网络,而不是有线或无线网络。我如何告诉它使用无线(或有线)?
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:17:f2:d6:39:8a
media: autoselect status: inactive
supported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half-duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> none
fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030
lladdr 00:19:e3:ff:fe:77:30:9c
media: autoselect <full-duplex> status: inactive
supported media: autoselect <full-duplex>
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.10.102 netmask 0xffffff00 broadcast 192.168.10.255
ether 00:19:e3:d8:b3:5e
media: autoselect status: active
supported media: autoselect
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.132.1 netmask 0xffffff00 broadcast 192.168.132.255
ether 00:50:56:c0:00:08
vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.238.1 netmask 0xffffff00 broadcast 192.168.238.255
ether 00:50:56:c0:00:01