Я провел столько исследований, сколько смог, не копаясь в исходном коде ядра. Похоже, что существует много дезинформации / неверной информации по этому вопросу, поэтому я надеюсь, что это раз и навсегда ответит на этот вопрос для меня и других.
Строго говоря, IPv4, возможно ли исчерпание порта? Позволь мне объяснить:
- По-видимому, для использования доступно 65535 портов. 0 не доступно.
- Я прочитал, что исчерпание порта требует, чтобы кортеж (src ip, src port, dst ip, dst port) был уникальным.
- Для ясности и предположения, что я могу использовать 100% временных портов через настройку sysctl net.ipv4.ip_local_port_range
И это вопрос: так ли это работает?
- Я мог бы иметь 65 тыс. Соединений от 127.0.0.1:(x) до 127.0.0.1:80
- Я мог бы иметь 65 тыс. Соединений от 127.0.0.1:(x) до 127.0.0.1:555
- По сути, еще раз, вопрос (srcip, srcport, dstip, dstport) должен быть уникальным, правильно?
- Я не мог открыть больше чем 65k соединений от ip "A" к IP "B", порту "N"
- Аналогично, один IP-адрес не может открыть более 65 тыс. Подключений к моему веб-серверу в xxxx: 80, однако я мог бы поддерживать в целом гораздо более 65 тыс. Соединений, если они получены с разных исходных IP-адресов ?
Наконец, я немного озадачен (исходящими) эфемерными портами и входящими портами, которые прослушивают. Я понимаю, что как только соединение установлено, каждая сторона соединения является равноправной и равной, но до того, как это произойдет:
Например, если на самом деле кортеж (srcip, srcport, dstip, dstport) должен быть уникальным, почему, если я включу, например,
net.ipv4.ip_local_port_range = 1024 65535
Что позволяет использовать временные порты с 1024-65535, что если у меня есть службы, которые привязываются к порту 3306 (например, mySQL), они иногда не запускаются, потому что порт используется.
Связано ли это с тем, что: (И это утверждение, которое я прошу подтвердить):
- (srcip, srcport, dstip, dstport) должны быть уникальными для каждого соединения с диапазоном портов 1-65535 (не обращая внимания на использование в операционной системе эфемерных портов)
- Однако для связывания сокета это можно увидеть как (srcip, srcport, *, *). Или еще один способ выразить это: IP не должен использовать этот порт по какой-либо причине для привязки?
Я могу проверить вышеупомянутое поведение, то есть я использую точную строку sysctl выше, и из-за этого я переместил mySQL на порт ниже 1024, потому что он иногда и очень случайно перезагружался, потому что предполагал, что ОС использует этот порт (3306) для эфемерного порта.