【问题标题】:Mac OS X slow connections - mdns 4-5 seconds - bonjour slowMac OS X 连接速度慢 - mdns 4-5 秒 - bonjour 慢
【发布时间】:2017-11-29 08:20:36
【问题描述】:

我终于无所适从了。我已经用谷歌搜索这个问题一周了。我已经尝试对我的 Mac (10.12 Sierra) 和我的域控制器 (Windows Server 2016) 进行故障排除,但我离解决我的问题还差得远。

我的问题是,当使用 PHP 的 ldap_connect() 函数时,大约需要 5 秒才能得到响应。事情只是挂了 5 秒钟,然后我得到了成功的连接。复制它的确切命令(假设我的 DC 的 IP 地址为 192.168.2.5):

$ldap = ldap_connect('ldap://192.168.2.5:389');

我没有使用 SSL 或 TLS。这只是一个与完全关闭防火墙的 DC 的简单明文连接。我最终在我的 DC 上安装了 Wireshark 以获取更多关于正在发生的事情的信息,我注意到了这一点:

No. | Time | Source | Destination | Protocol | Length | Info

1 | 327 | 192.168.2.108 | 224.0.0.251 | MDNS | 83 | Standard query 0x0000 A Ryans-MacBook-Pro.local, "QU" question

2 | 328 | 192.168.2.108 | 224.0.0.251 | MDNS | 83 | Standard query 0x0000 A Ryans-MacBook-Pro.local, "QM" question

3 | 331 | 192.168.2.108 | 224.0.0.251 | MDNS | 83 | Standard query 0x0000 A Ryans-MacBook-Pro.local, "QM" question

4 | 332 | 192.168.2.108 | 192.168.2.5 | TCP | 78 | 49860 > 389 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=32 TSval=371626102 TSecr=0 SACK_PERM=1

5 | 332 | 192.168.2.5 | 192.168.2.108 | TCP | 74 | 389 > 49860 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1 TSval=2494847497 TSecr=371626102

6 | 332 | 192.168.2.108 | 192.168.2.5 | TCP | 66 | 49860 > 389 [ACK] Seq=1 Ack=1 Win=131744 Len=0 TSval=371626102 TSecr=2494847497

7 | 332 | 192.168.2.108 | 192.168.2.5 | LDAP | 96 | bindRequest(1) "ldap" simple

8 | 332 | 192.168.2.5 | 192.168.2.108 | LDAP | 88 | bindResponse(1) success

如您所见,当我启动 ldap_connect() 函数时,我立即在 327 秒处看到第一个数据包(自运行 Wireshark 以来)。我看到 3 个 mdns 数据包总共 5 秒。然后在第四个、第五个和第六个数据包上,我看到了 TCP 三次握手,然后它继续给我一个成功的 ldap 连接。因此,我看到的 5 秒延迟是所有 mdns 数据包还是 Apple 的 Bonjour?在这一点上,我不知道如何解决这个问题。

免责声明:我使用的是使用 dnsmasq 的Laravel Valet。我不知道这是否导致了我的问题。这个软件我还没有卸载过。

编辑:我已经排除了 Laravel Valet。我完全卸载了它,它仍然是一个问题。我也排除了 Laravel。我正在运行此脚本,但问题仍然存在:

<?php

$start = microtime(true);

$ldap = ldap_connect('ldap://192.168.2.5:389');

$end = microtime(true);

echo $end - $start;

edit2:好的,我已经进一步解决了这个问题。我在我的 Mac 上安装了 Wireshark 并注意到以下内容。

然后我运行了这个命令: ➜ ~ scutil --dns 域名解析

resolver #1
  search domain[0] : corp.[redacted].com
  nameserver[0] : 192.168.2.4
  nameserver[1] : 192.168.2.5
  if_index : 7 (en3)
  flags    : Request A records
  reach    : Reachable, Directly Reachable Address

resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  reach    : Not Reachable
  order    : 300000

这是我的主机名!我的主机名导致尝试使用多播 DNS 解析它的 5 秒延迟。为什么? .local 是一个保留域,Apple 为什么要将它附加到我的主机名中?

如您所见,它会自动附加.local

无论如何,我已经通过将127.0.0.1 Ryans-MacBook-Pro.local 添加到我的/etc/hosts 文件来解决我的问题。由于某种原因,它不在里面。

我的ldap_connect() 现在应该是即时的!

【问题讨论】:

  • /etc/hosts 解析时我也得到了 5 秒 ... 似乎是 mDNSresponder 问题。
  • 由于我使用的是服务器的 IP 地址,而不是主机名或 FQDN,我不知道为什么它甚至会尝试从 /etc/hosts 甚至 DNS 中解析?
  • 经过调查,似乎我在来自 php 进程(cli 和通过 sapi)时得到了 5 秒......而不是在 shell 中。正在进行更多调查。
  • 这为我解决了这个问题,但不确定它与 ldap 的关系:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);,显然是 ipv6 的一些奇怪问题。如果您有权访问 php.ini,请尝试通过 curl 选项添加它。
  • 我没有看到类似 ldap_connect() php.net/manual/en/function.ldap-set-option.php 的选项

标签: php macos active-directory ldap domaincontroller


【解决方案1】:

确保您的主机名在 /etc/hosts 文件中,如下所示:

127.0.0.1 localhost Ryans-MacBook-Pro.local

只需将我的主机名替换为您的。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多