Может ли TCP обеспечить более 65535 портов?


50

Можно ли настроить систему Linux так, чтобы она обеспечивала более 65 535 портов? Предполагается, что в данной системе будет прослушиваться более 65 тыс. Демонов.

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


11
Какова мотивация для этого вопроса? Почему вы хотите, чтобы так много демонов слушали?
Уоррен Янг

1
Кроме того, вам будет трудно запустить столько процессов. (Я полагаю, вы имеете в виду один процесс на демона.)
Уоррен Янг

13
Хотя нет ничего, что формально ограничивало бы вас от ношения 65 пар брюк одновременно, попытаться было бы практичным идиотизмом. Если вы можете показать мне машину, которая может плодотворно обрабатывать 10 000 портов TCP одновременно, то это может быть интересным абстрактным вопросом.
Msw

13
Природа этого Q является полностью теоретической, и не предназначена для других целей, кроме понимания ограничений TCP и количества портов.
SLM

1
Дело в том, что вы сформулировали это таким образом, чтобы связать его с различными практическими вопросами, касающимися пространства ОЗУ, требуемого процессами демона 64k +. Любая машина, которая у вас может быть сейчас или в течение следующего десятилетия или около того, исчерпает ОЗУ, прежде чем вы достигнете предела количества слушателей. Если вы перефразируете вопрос, чтобы говорить только о прослушивателях TCP , оставив разговор о демонах целиком, эта проблема исчезнет. Вы можете амортизировать пространство стека, например, назначив тысячу сокетов каждому однопоточному демону, управляемому событиями.
Уоррен Янг

Ответы:


84

Если взглянуть на RFC для TCP: RFC 793 - Протокол управления передачей , ответ может показаться отрицательным из-за того, что заголовок TCP ограничен 16 битами для поля порта источника / назначения.

    сс # 1

IPv6 улучшает вещи?

Нет. Несмотря на то, что IPv6 даст нам гораздо большее пространство IP-адресов, 32-битное по сравнению со 128-битным, оно не пытается улучшить ограничение TCP-пакетов в 16 бит для номеров портов. Интересно, что в RFC для IPv6: спецификация интернет-протокола версии 6 (IPv6) поле IP необходимо расширить.

Когда TCP работает по IPv6, метод, используемый для вычисления контрольной суммы, изменяется согласно RFC 2460 :

Любой транспортный или другой протокол верхнего уровня, который включает адреса из заголовка IP в свои вычисления контрольной суммы, должен быть модифицирован для использования через IPv6, чтобы включать 128-битные адреса IPv6 вместо 32-битных адресов IPv4.

                 сс # 2

Итак, как вы можете получить больше портов?

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

ПРИМЕЧАНИЕ: было заменено использование псевдонимов, с помощью iproute2которых вы можете eth0вместо этого использовать IP-адреса в одном интерфейсе (то есть ).

пример

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

Источник: iproute2: Жизнь после ifconfig

Рекомендации


3
Невозможно было бы выбрать среди 65 536+ демонов, используя только порт назначения, но если бы у него была неограниченная память и пропускная способность, могло бы быть более 32 000 соединений с каждым отдельным TCP-адресом на каждом входящем порте.
суперкат

7

Можно ли настроить систему Linux так, чтобы она обеспечивала более 65 535 портов?

Нет.

Предполагается, что в данной системе будет прослушиваться более 65 тыс. Демонов.

Тогда вам нужно:

  • iptablesконфигурация , которая перенаправляет на содержание трафика или

  • «служба брокера служб» или «служба мультиплексора», которая будет принимать входящие соединения через один порт и направлять его соответствующему демону «за ним». Если вы хотите, чтобы стандартные протоколы передавались без изменений, вам, возможно, придется реализовать анализ / распознавание протоколов в этой службе мультиплексора таким образом, чтобы брандмауэр IDS или уровня 7 мог анализироваться; полностью возможно с подавляющим большинством протоколов.

По второму пункту вы можете разработать этот сервис для обработки более 2 ^ 16 «портов», если вы действительно этого хотите. Я уверен, что влияние на производительность будет минимальным по сравнению с загрузкой 2 ^ 16+ работающих слушателей.

Демоны в Linux могут прослушивать сокеты Unix, которые существуют в файловой системе, поэтому ваша «служба мультиплексора» может поддерживать внутреннее отображение внешнего порта <-> внутреннего сокета Unix. Скорее всего, вы столкнетесь с лимитом процессов ядра (32 Кбайтные процессы?), Прежде чем исчерпать inode в любой современной файловой системе.


Я отказался от этого, потому что вы говорите, что это невозможно, а затем объясните, как это сделать, используя несколько IP-адресов и балансировку нагрузки, хотя и очень запутанным окольным путем.
suprjami

2
Более 64 тысяч портов в одной системе невозможно. Вероятно, возможно использование более 64 тыс. Слушателей , но вам нужно иметь прокси-серверы или интерфейсные прослушиватели, которые бы «разделяли» входящие соединения на правильные настоящие «бэкэнд-слушатели». Например, вы можете сделать что-то безумное, например, внутренний NAT для нескольких внутренних IP-адресов.
LawrenceC

2
Неправильно. Людям удалось получить полмиллиона одновременных подключений в одной системе. Да, требуется несколько IP-адресов и балансировщиков нагрузки (не обязательно в одной и той же системе), но одна система может открыть более 64 тыс. Портов и даже более 64 тыс. Слушателей, если все сделано правильно.
СУПРЯМИ

2

Просто потому, что нет хорошего ответа, я хотел бы вмешаться.

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

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

Ограничения не будут автоматически работать в существующем программном обеспечении, просто добавив параметр в любом случае, их придется переписать, чтобы воспользоваться преимуществом параметра, независимо от того, как он реализован, существующее программное обеспечение и брандмауэры будут либо игнорировать пакет, либо обрабатывать его как обычно. используя значение в полях исходного и конечного портов.

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

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

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

Сервер Http также может сделать этот или любой другой тип сервера.

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


-2

Да, ты можешь !

Это было сделано раньше, например, сервер шифрования Edgehill, который имеет> 25.000.000 демонов, работающих в сети.


9
Подумайте о том, чтобы расширить свой ответ, включив в него некоторые рекомендации о том, как ОП может это сделать, документацию, подтверждающую ваш ответ, или соответствующее объяснение.
HalosGhost

Можете ли вы дать ссылки на это утверждение? Быстрый поиск заставляет меня поверить, что все это распространяется на множество машин.
Томас Гайот-Сионнест
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.