Назад | Перейти на главную страницу

Смущенный! php-cgi открыл (и не закрыл) «соединение» UDP… но разве UDP не работает без установления соединения?

Этот вопрос больше для моего собственного образования, чем для решения какой-либо проблемы.

Я использую VPS на linode с 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? (Я установил IPv6-адрес локального DNS-преобразователя Linode по умолчанию, а не IPv4-адрес.)

Во-вторых, эта «связь» прижилась. Разве все соединения php не должны быть закрыты, когда процесс fastcgi завершит свою задачу? На странице состояния 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 () и receive () (вызовы, ориентированные на соединение) вместо sendto () и receivefrm (). Это НЕ будет поддерживать соединение открытым, но оно выделит порт для соединения и сохранит его активным ... отсюда и название - ориентированный на соединение. (из Вот)

Я думаю, что lsof отображает назначение UDP-соединений только для этих UDP-сокетов, ориентированных на соединение. Это правильно?

lsof показывает UDP-сокет (который указывает такую ​​информацию, как исходный порт, адрес назначения и порт назначения), который php-cgi использует для взаимодействия с DNS-сервером (а не «соединение»). Пока сокет остается открытым, он будет отображаться в вашем выводе lsof.