65536 +1 Підключення до системи


35

Є 65536 портів для кожної системи в мережі, і при кожному підключенні або надіслати / отримати буде використовуватися один із них.

Моє запитання: що станеться, якщо у нас 65536 + 1 підключення ?!

Я знаю, що це не відбувається нормально, але мені цікаво знати, як операційні системи справляються з цим.


12
У з’єднанні буде відмовлено. Але у вас реально виникнуть проблеми задовго до відкриття 65535 з'єднань.
ChrisInEdmonton

1
@ChrisInEdmonton Ні. Якщо це вихідне з'єднання, воно отримає помилку прив'язки, оскільки не може виділити локальний порт. Якщо це вхідне з'єднання, межа порту не застосовується.
користувач207421

якщо з'єднання існує, ви отримаєте відмову в з’єднанні, якщо він вихідний, ваш дзвінок в сокет буде помилковим. Я не буду ставити це як відповідь, тому що я не впевнений.
Хорхе Альдо

Відповіді:


61

Будь ласка, майте на увазі, що система може обробляти більше 65536 одночасних з'єднань, оскільки вони не обов'язково використовують окремий порт.

TCP-з'єднання або UDP потік визначається 4-канальним:

(source IP address, source port, destination IP address, destination port)

Тож навіть якщо у вас є машина веб-сервера з лише однією IP-адресою та єдиний пакет програмного забезпечення сервера HTTP, який прослуховує лише порт 80, теоретично він може обробляти 65536 з'єднань на IP-адресу клієнта, що підключається до нього . Отже, 64Ki з'єднання з IP-адресою клієнта 1, плюс 64Ki-з'єднання з IP-адресою клієнта 2 і т.д.

Таким чином, протоколи підтримують, до першого наближення, 2 48 з'єднань / потоків до одного порту TCP або UDP на одній адреси IPv4. Розглянемо і TCP, і UDP, і адресний простір IPv4, і космічно / комічно великий адресний простір IPv6, і ви можете бачити, що самі протоколи, ймовірно, ніколи не стануть джерелом обмеження кількості одночасних з'єднань, які приймає хост може впоратися.

Так само в протоколах TCP або UDP немає нічого, що не дозволяє клієнтській машині використовувати один вихідний порт на одній IP-адресі для здійснення декількох вихідних з'єднань з різними адресами та портами сервера. Іноді задані мережеві інтерфейси API можуть не зробити це простим, але важливо пам’ятати, що, скажімо, поважний старий "[BSD] Sockets" API - це лише один API для TCP та UDP. TCP і UDP можуть мати можливості, які не піддаються традиційному API Sockets.

Таким чином, кількість одночасних TCP-з'єднань або потоків UDP, якими може керувати даний хост, обмежена не стільки номерами портів, скільки системними ресурсами, такими як простір оперативної пам’яті та час процесора, необхідний для того, щоб відслідковувати всі ці з'єднання та обслуговувати їх усі. Також деталі щодо впровадження ОС можуть встановлювати штучні обмеження. Наприклад, у філософії Unix "все є файлом" може бути дескриптор файлу для кожного TCP-з'єднання або потоку UDP. Якщо ваше ядро ​​Unix має обмеження на кількість дескрипторів файлів, яке воно може відслідковувати, це обмеження дескриптора файлу є штучним обмеженням кількості одночасних підключень TCP або потоків UDP, з якими може працювати ядро.


2
Можливо, варто звернутися до en.wikipedia.org/wiki/C10k_problem у цій чудовій відповіді.
ChrisInEdmonton

1
Я реалізував TCP-сервер, який міг одночасно розмістити 65 534 з'єднання з кожної можливої ​​IP-адреси. Це не робить багато - він просто перегукується з текстом, що надходить, з кількома замінами символів - але він працює на дуже невеликій апаратній платформі. Я не думаю, що це досить сумісно з RFC, але, здається, працює досить добре, незважаючи ні на те, ні знати, ні піклуватися про те, скільки TCP-з'єднань відкрито на більшості його портів.
supercat

2
Якщо вам дійсно потрібно з'єднати більше 65536 з'єднань між двома машинами, ви можете налаштувати машини для використання декількох IP-адрес. Кожна IP-адреса, яку ви додаєте до двох машин, збільшує максимальну кількість з'єднань квадратично (принаймні теоретично, ви, швидше за все, спочатку зіткнетеся з іншими проблемами).
Лежи Райан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.