Скажем, у меня есть две службы TCP A и B. A - это служба только для IPv4, прослушивающая 127.0.0.1:10000
. B - это служба только для IPv6, прослушивающая ::1:10000
. Могу ли я запустить эти службы на одной машине? То есть как назначаются IP-порты? На машину? На интерфейс? По протоколу? Так далее…
2 ответа
Я предполагаю, что вы говорите о портах TCP и UDP.
Скажем, у меня есть две службы TCP A и B. A - это служба только для IPv4, прослушивающая
127.0.0.1:10000
. B - это служба только для IPv6, прослушивающая::1:10000
. Могу ли я запустить эти службы на одной машине?
Да.
То есть как назначаются IP-порты? На машину? На интерфейс? По протоколу? Так далее…
Во-первых, не существует такого понятия, как «IP-порт». Порты являются функцией некоторых протоколов транспортного уровня. В частности, TCP и UDP используют номера портов. Я верю, что некоторые другие протоколы тоже их используют, но я сам работал только с TCP и UDP.
TCP-порты и UDP-порты полностью разделены. Сервер TCP и сервер UDP могут использовать одну и ту же комбинацию IP/ порт.
Серверы могут либо прослушивать определенную комбинацию IP-адрес / порт, либо прослушивать порт для всех адресов. Последний указывается путем указания адреса прослушивания 0.0.0.0 для IPv4 или :: для ipv6. Если сервер прослушивает порт для всех адресов, другие серверы не могут прослушивать этот порт для определенного адреса.
Наконец, в большинстве операционных систем сервер, прослушивающий ::, может принимать соединения как по IPv4, так и по IPv6. Существует опция сокета под названием "IPV6_V6ONLY", чтобы включить / отключить это поведение. Настройки по умолчанию для этой опции различаются. В Linux опция по умолчанию отключена, но это можно изменить с помощью sysctl "net.ipv6.bindv6only". В Windows Vista и более поздних версиях IPV6_V6ONLY включен по умолчанию. В более старых версиях Windows один сокет не может принимать соединения как v4, так и v6. Приложению, которое хочет прослушать оба, необходимо открыть два отдельных сокета.
Когда вы говорите «Порты», я предполагаю, что вы говорите о портах, которые используются в TCP и UDP. В этом случае каждый IP-адрес имеет порты, которые работают с 1-65,535 для TCP и 1-65,535 для UDP.
Что касается IPv6, он использует те же порты, вам просто нужно заключить квадратные скобки ([]
) вокруг вашего адреса, чтобы различать часть адреса и часть порта, так как адреса IPv6 ограничиваются двоеточиями, а не точками.