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

29

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

ALH
источник

Ответы:

55

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

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

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

Деннис Каарсемакер
источник
Интересно, как на это повлияет NAT операторского класса
TheLQ
@TheLQ Без CGN каждый клиент не может открыть более 65535 подключений к одному и тому же серверу, ни одному клиенту не нужно почти столько подключений к одному серверу. С CGN каждый CGN не может открыть более 65535 подключений к одному и тому же серверу, они должны быть общими для всех клиентов, использующих этот CGN. Возможность того, что CGN может одновременно открывать 65535 подключений к одному серверу и 65535 подключений к другому серверу, является подробностью реализации, которая может различаться в разных реализациях CGN.
Касперд
Ограничение может быть увеличено путем добавления большего количества IP-адресов в CGN или путем развертывания большего количества CGN. Но вы также можете просто развернуть двойной стек. Тогда соединения с серверами с поддержкой IPv6 не будут проходить через CGN, поэтому они не будут использовать драгоценные номера портов.
Касперд
15

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

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

При предложении сетевых сервисов 1. и 2. обычно являются статическими (например, IP 10.0.0.1, порт 80), но если вы не ожидаете тысячи соединений от одного клиента (или одного шлюза NAT), вы не собираетесь выдвигать границы возможных комбинаций 3. и 4. до того, как закончатся локальные ресурсы.

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

Проблема вполне реальная: шлюзы NAT (маршрутизаторы) обслуживают клиентов с большим количеством открытых исходящих соединений (например, торрентов) - там вы увидите истощение номера порта после опустошения пула портов, доступного для NAT. В этом случае шлюз NAT не может создать какие-либо дополнительные ассоциации, тем самым эффективно отключая клиентов от Интернета.

заместитель Wabbit
источник
2

Вопрос заключался в том, как обрабатывать большое (> 64 КБ) количество подключений. Два наиболее распространенных метода:

  • Добавление большего количества серверов, что увеличивает количество адресов src / dst и кортежей номеров портов. Есть несколько способов распределить нагрузку между несколькими серверами; DNS Round Robin является одним; есть другие

  • Разверните «NAT операторского уровня» (который, по моему мнению, недоверчиво и правильно друг называет «более грубым NAT»). По сути, это NAT NAT. Это имеет очень плохие последствия для приложений, но это то, что делают некоторые крупные провайдеры, когда им не хватает пространства IPv4 и / или номеров портов, и / или они не хотят переходить на IPv6.

user8162
источник
2
Если вы прочитаете больше, чем заголовок, вы увидите, что этот вопрос касается исчерпания порта, и OP ошибся в том, как он работает. Как именно этот ответ добавляет к этому что-то новое?
MDMarra
2
ОП спрашивает явно (и не только в заголовке) "как серверы испытывают очень большое количество ... запросов". Оставляя в стороне путаницу из-за того, как работают сокеты, это правильный вопрос.
user8162
1
Отличная работа, отрезав вопрос в середине предложения. Остальная часть этого предложения говорит: (more than the max port number).
MDMarra
2
Возможно, вы пропустили ту часть, где я указывал, что ОП не понимает механику сокетов. Я придерживаюсь мнения, что вопрос о том, как превышать 64 тыс. Портов, является актуальной темой для обсуждения; Извините, если вы не согласны, но это был вопрос, и именно на это я дал пару ответов. Вы спросили, как это было реагировать; вот как.
user8162
3
Это половина вопроса. Более общий вопрос - как подтверждается в последнем предложении ФП - как преодолеть барьер в 64 КБ.
user8162