我正在尝试查明为什么 Web 应用程序会以与客户端的连接的形式积累文件描述符,即使客户端(浏览器)已断开连接。
该服务器正在运行 Ubuntu 14.04。
所讨论的连接通常如下所示(lsof 输出):
atc 10763 vcap 724u IPv6 309771865 0t0 TCP 10.32.108.171:8080->10.118.33.246:56379 (ESTABLISHED)
atc 10763 vcap 725u IPv6 309777427 0t0 TCP 10.32.108.171:8080->10.118.33.246:56397 (ESTABLISHED)
atc 10763 vcap 726u IPv6 309777428 0t0 TCP 10.32.108.171:8080->10.118.33.246:56396 (ESTABLISHED)
atc 10763 vcap 727u IPv6 309772456 0t0 TCP 10.32.108.171:8080->10.118.33.246:56380 (ESTABLISHED)
以下是我感到困惑的几点:
- 客户端系统 ( ) 上没有浏览器
10.118.33.246
与 Web 服务器 ( ) 建立连接10.32.108.171
,但连接仍处于该ESTABLISHED
状态。似乎永远如此,或者直到 Web 服务器重新启动。 - 服务器未配置 IPv6 地址。
- 服务器甚至没有启用 IPv6:
net.ipv6.conf.default.disable_ipv6 = 1
但 lsof 却显示了这样的连接。 - 来自浏览器的“合法”连接是通过 IPv4 建立的(至少根据 Mac OS 上的 lsof)。
- 如果我启动浏览器并建立连接,我可以在服务器上跟踪该连接并在我关闭浏览器时看到它消失。
- 客户端和服务器之间有一条直接路由。据我所知,中间组件可能为客户端保持连接打开,因此不会发生 nat/伪装/代理。
除非我最后一点错了,否则我不明白到底发生了什么。为什么ESTABLISHED
即使客户端已经离开,连接仍然保持?
感谢您的任何见解。