这个问题更多的是为了我自己的教育,而不是为了解决任何问题。
我正在 linode 上运行一个 VPS,带有 lighttpd 和 PHP 5.3.13,通过 fast-cgi。
当我列出互联网连接时,我看到了这个奇怪的生物:
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
php-cgi 25095 lighttpd 13u IPv6 75194 0t0 UDP myhostname.com:48192->resolver2.fremont.linode.com:domain
我以前从未见过 UDP“连接”?有人能解释一下这种 UDP 连接是什么吗——UDP 不是无连接协议吗?它与 IPv6 有关吗?(我已将 Linode 本地 DNS 解析器的 IPv6 地址设置为默认值,而不是 IPv4 地址。)
其次,这个“连接”一直存在。当 fastcgi 进程完成其任务时,所有 php 连接难道不应该关闭吗?Lighttpd 的状态页面显示没有打开的连接,也没有打开的 fastcgi 请求。
澄清:
具体来说,我想知道为什么 lsof 在这里列出 UDP 套接字的目标,就像它通常在 TCP 连接中那样。这是我以前从未见过的。通常,UDP 连接如下所示:
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 1624 ntp 18u IPv6 2819 0t0 UDP myhostname.com:ntp
...没有列出目的地。
显然,有一种“面向连接”的 UDP 模式。您在套接字上调用 connect() 而不是 bind(),这允许使用 send() 和 accept()(面向连接的调用)而不是 sendto() 和 acceptfrm()。这不会使连接保持打开状态,但它会为连接分配一个端口并使其保持活动状态……因此得名 - 面向连接。(从这里)
我认为 lsof 仅针对这些“面向连接”的 UDP 套接字显示 UDP 连接的目标。对吗?
答案1
lsof显示 php-cgi 用于与 DNS 服务器通信(而非“连接”)的 UDP 套接字(指定源端口、目标地址和目标端口等信息)。只要套接字保持打开状态,它就会显示在您的 lsof 输出中。