netstat -a
информация о списках команд как это:
tcp 0 0 :::30179 :::* LISTEN
tcp 0 0 :::www :::* LISTEN
tcp 0 0 :::10001 :::* LISTEN
tcp 0 0 :::telnet :::* LISTEN
Что это значит? Я пытаюсь узнать, но я не мог.
Те сокеты слушают на IPv6 неуказанный адрес, который является ::
. Это коротко для 0000:0000:0000:0000:0000:0000:0000:0000
(несколько блокируются 0, может быть сжат в ::
, видеть RFC 5952 ). Это подобно IPv4 неуказанный адрес 0.0.0.0
. Это означает, что сервис слушает на всех адресах хоста.
Обычно слушание на сокете IPv6 означает, что сокет только принимает входящие соединения от клиентов IPv6, и программное обеспечение должно было бы открыть второй сокет для прислушиваний к клиентам IPv4.
однако существует один особый случай: слушание на IPv6 неуказанный адрес и установка эти IPV6_V6ONLY
флаг к 0 (ложь). Во многих системах, включая Linux, это - значение по умолчанию. В этом случае сокет примет и IPv4 и клиенты IPv6 на единственном сокете. Эта функция помогает разработчикам программного обеспечения поддерживать IPv6: они могут записать программное обеспечение, которое просто прислушивается к обоим протоколам с помощью единственного сокета.
оборотная сторона этого - то, что не легко видеть, какие сокеты слушают на обоих протоколах и который снабжает сокетом, только слушают на IPv6. Это также сбивает с толку, что :
используется в адресе IPv6 и также как разделитель между адресом и портом. Тем путем Вы получаете путание :::
бит.
BSD базировался, системы имеют тенденцию показывать ту же информацию по-другому. Там Ваш пример был бы отображен как, например:
tcp46 0 0 *.30179 *.* LISTEN
tcp46 0 0 *.www *.* LISTEN
tcp46 0 0 *.10001 *.* LISTEN
tcp46 0 0 *.telnet *.* LISTEN
сервер А, который использует два отдельных сокета для IPv4 и IPv6, обнаруживается как:
tcp4 0 0 *.ssh *.* LISTEN
tcp6 0 0 *.ssh *.* LISTEN
и
udp4 0 0 *.ntp *.*
udp6 0 0 *.ntp *.*
мне лично нравится этот, это явно показывает, какие протоколы слушают на (т.е. tcp4
/ tcp6
/ tcp46
) и использующей *
символ для неуказанного адреса.
я просто заметил, что недавние версии Ubuntu используют эту нотацию:
tcp 0 0 *:ssh *:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 [::]:https [::]:* LISTEN
, Который уже намного более ясен. К сожалению, это не показывает различие между сокетом, который слушает только на IPv6 (как эти ssh
сокет) и сокет, который слушает и на IPv4 и на IPv6 (как эти https
сокет).