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

Как сайты с высоким трафиком обслуживают более 65535 TCP-соединений?

Если существует ограничение на количество портов, которое может иметь одна машина, а сокет может быть привязан только к неиспользуемому номеру порта, как серверы, испытывающие чрезвычайно большое количество (превышающее максимальное количество портов) запросов, справляются с этим? Делается ли это просто за счет создания распределенной системы, то есть множества серверов на многих машинах?

Вы неправильно понимаете номера портов: сервер прослушивает только один порт и может иметь большое количество открытых сокетов от клиентов, подключающихся к этому одному порту.

На уровне TCP кортеж (исходный IP-адрес, исходный порт, целевой IP-адрес, целевой порт) должен быть уникальным для каждого одновременного подключения. Это означает, что один клиент не может открыть более 65535 одновременных подключений к серверу. Но сервер может (теоретически) обслуживать 65535 одновременных подключений. на клиента.

Таким образом, на практике сервер ограничен только тем, сколько мощности процессора, памяти и т.д. он должен обслуживать запросы, а не количеством TCP-соединений с сервером.

Вы ошибаетесь - уникальность сокета определяется четырьмя факторами:

  1. локальный IP-адрес
  2. номер местного порта
  3. удаленный IP-адрес
  4. номер удаленного порта

При предложении сетевых услуг 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.