Если существует ограничение на количество портов, которое может иметь одна машина, а сокет может быть привязан только к неиспользуемому номеру порта, как серверы, испытывающие чрезвычайно большое количество (превышающее максимальное количество портов) запросов, справляются с этим? Делается ли это просто за счет создания распределенной системы, то есть множества серверов на многих машинах?
Вы неправильно понимаете номера портов: сервер прослушивает только один порт и может иметь большое количество открытых сокетов от клиентов, подключающихся к этому одному порту.
На уровне TCP кортеж (исходный IP-адрес, исходный порт, целевой IP-адрес, целевой порт) должен быть уникальным для каждого одновременного подключения. Это означает, что один клиент не может открыть более 65535 одновременных подключений к серверу. Но сервер может (теоретически) обслуживать 65535 одновременных подключений. на клиента.
Таким образом, на практике сервер ограничен только тем, сколько мощности процессора, памяти и т.д. он должен обслуживать запросы, а не количеством TCP-соединений с сервером.
Вы ошибаетесь - уникальность сокета определяется четырьмя факторами:
При предложении сетевых услуг 1. и 2. обычно являются статическими (например, IP 10.0.0.1, порт 80), но если вы не ожидаете тысячи подключений. от одного клиента (или один шлюз NAT), вы не собираетесь расширять границы возможных комбинаций 3. и 4., пока у вас не закончатся локальные ресурсы.
Таким образом, хотя на практике клиент не будет использовать порт, который уже используется для соединения, чтобы открыть соединение с другим IP-адресом назначения, истощение номера порта будет наименьшей из ваших проблем практически для любого приложения - будь то на сервере или сторона клиента.
Проблема очень реальна, когда шлюзы NAT (маршрутизаторы) обслуживают клиентов с большим количеством открытых исходящих соединений (например, торренты) - там вы увидите истощение номера порта после того, как пул портов, доступный для NAT, будет опустошен. В этом случае шлюз NAT не может создавать никаких дополнительных ассоциаций, тем самым эффективно отключая клиентов от Интернета.
Вопрос был в том, как справиться с большим (> 64 КБ) количеством подключений. Два наиболее распространенных метода:
Добавление дополнительных серверов, что увеличивает количество адресов src / dst и кортежей номеров портов. Есть несколько способов распределить нагрузку между несколькими серверами; Циклический перебор DNS - один; есть другие
Разверните «NAT операторского уровня» (который, на мой взгляд, правильно и насмешливо назвал мой друг, «грязный NAT»). По сути, это NAT или NAT. Это имеет очень плохие последствия для приложений, но это то, что делают некоторые крупные провайдеры, когда у них заканчивается пространство IPv4 и / или номера портов, и / или они не хотят переходить на IPv6.