Чи може TCP забезпечити більше 65535 портів?


50

Чи можна налаштувати систему Linux так, щоб вона містила більше 65535 портів? Наміром було б прослуховування понад 65 тис. Демонів у даній системі.

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


11
Яка мотивація цього питання? Чому ти хочеш, щоб стільки демонів слухали?
Warren Young

1
Крім того, вам доведеться важко запустити багато процесів. (Я припускаю, що ви маєте на увазі один процес на демон.)
Воррен Янг

13
Хоча формально не обмежує вас носити 65 пар брюк одночасно, спробувати практичну ідіотичність. Якщо ви можете показати мені машину, яка може плідно обробляти 10'000 портів TCP одночасно, то це може бути цікавим абстрактним питанням.
msw

13
Природа цього Q абсолютно теоретична, інакше, ніж зрозуміти обмеження TCP та кількість портів.
slm

1
Річ у тому, що ви її сформулювали таким чином, що це пов'язує її з різними практичними питаннями, що стосуються простору оперативної пам'яті, необхідного для 64k + демон-процесів. На будь-якій машині, яку ви, швидше за все, матимете зараз або протягом наступного десятиліття або близько того, буде вичерпано оперативну пам'ять, перш ніж ви досягнете межі слухача. Якщо ви перефразовуєте запитання, щоб говорити лише про слухачів TCP , залишаючи розмови про демонів повністю, ця проблема відпадає. Ви можете амортизувати простір стеків, призначивши, наприклад, тисячу розеток для кожного однопоточного демона, керованого подіями.
Warren Young

Відповіді:


84

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

    ss №1

Чи покращує ситуацію IPv6?

Ні. Навіть незважаючи на те, що IPv6 дасть нам значно більший простір IP-адрес, 32-бітний та 128-бітний, він не робить спроб покращити обмеження пакету TCP 16-бітними номерами портів. Цікаво, що специфікація RFC для IPv6: Інтернет-протокол, версія 6 (IPv6) , IP-поле потрібно розширити.

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

Будь-який транспортний або інший протокол верхнього рівня, що включає адреси з заголовка IP в його розрахунку контрольної суми, повинен бути модифікований для використання над IPv6, щоб включати 128-бітні адреси IPv6 замість 32-бітових IPv4-адрес.

                 ss №2

Тож як можна отримати більше портів?

Одним із підходів було б складання додаткових IP-адрес, використовуючи більше інтерфейсів. Якщо у вашій системі є декілька NIC, це простіше, але навіть за допомогою одного лише NIC можна використовувати віртуальні інтерфейси (ака. Псевдоніми ), щоб виділити більше IP-адрес, якщо це необхідно.

ПРИМІТКА. Використання псевдонімів було замінено, за допомогою iproute2якого ви можете використовувати для складання IP-адрес на одному інтерфейсі (тобто eth0).

Приклад

$ 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-адресою на кожному вхідному порту.
supercat

7

Чи можна налаштувати систему Linux так, щоб вона містила більше 65535 портів?

Ні.

Наміром було б прослуховування понад 65 тис. Демонів у даній системі.

Тоді вам потрібно:

  • iptablesконфігурація , яка перенаправляє на утримання трафіку або

  • "послуга брокера сервісу" або "послуга мультиплексора", яка прийме вхідні з'єднання на одному порту і направить його до відповідного демона "за ним". Якщо ви хочете, щоб стандартні протоколи проходили немодифікованими, можливо, вам доведеться реалізувати нюхання / розпізнавання протоколів у цій мультиплексорній службі таким чином, щоб брандмауер IDS або брандмауер шару-7 аналізував; цілком можливо з великою більшістю протоколів.

Згідно другого пункту, ви могли б спроектувати цю послугу для обробки більш ніж 2 ^ 16 "портів", якщо цього б дуже хотіли. Я впевнений, що вплив на продуктивність буде мінімальним порівняно з завантаженням 2 ^ 16 + слухачів, які працюють.

Демони в Linux можуть прослуховувати Unix-сокети, які існують у файловій системі, тому ваша "служба мультиплексора" може підтримувати внутрішнє відображення зовнішнього порту <-> внутрішнього сокета Unix. Ви, ймовірно, зіткнетеся з обмеженням процесу ядра (32 кбайт-процесів?) Перед тим, як вичерпати inode в будь-якій сучасній файловій системі.


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

2
Більше 64K портів в одній системі неможливо. Більше 64K слухачів , мабуть, можливо, але ви повинні мати проксі-сервера або фронтальних слухачів, які б "розділили" вхідні з'єднання на потрібних справжніх "резервних" слухачів. Ви можете зробити щось божевільне, як внутрішній NAT, наприклад, для кількох внутрішніх IP-адрес.
LawrenceC

2
Неправильно. Людям вдалося отримати півмільйона одночасних з'єднань в одній системі. Так, потрібні кілька IP-адрес і балансирів завантаження (не обов'язково для однієї і тієї ж системи), але одна система може відкрити більше 64-портових і навіть більше 64-тисячних слухачів, якщо зробити все правильно.
suprjami

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.