困惑!php-cgi 打开了(但并未关闭)一个 UDP“连接”……但 UDP 不是无连接的吗?

困惑!php-cgi 打开了(但并未关闭)一个 UDP“连接”……但 UDP 不是无连接的吗?

这个问题更多的是为了我自己的教育,而不是为了解决任何问题。

我正在 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 输出中。

相关内容