Яка теоретична максимальна кількість відкритих TCP-з'єднань, яку може мати сучасна скринька Linux


236

Якщо припускати нескінченну продуктивність апаратного забезпечення, чи може підтримка вікна Linux> 65536 відкрити TCP-з'єднання?

Я розумію, що кількість ефемерних портів (<65536) обмежує кількість з'єднань від одного локального IP до одного порту на одному віддаленому IP.

Кортеж (локальний ip, локальний порт, віддалений ip, віддалений порт) - це те, що однозначно визначає TCP-з'єднання; чи означає це, що більш ніж 65K з'єднань можна підтримувати, якщо більш ніж один з цих параметрів вільний. наприклад, з'єднання з одним номером порту на декількох віддалених хостах з декількох локальних IP-адрес.

Чи існує ще 16-бітове обмеження в системі? Можливо, кількість дескрипторів файлів?

Відповіді:


350

Один прослуховувальний порт може приймати більше одного з'єднання одночасно.

Існує обмеження "64K", яке часто цитується, але це вказано на клієнта на один порт сервера і потребує уточнення.

Кожен TCP / IP-пакет має в основному чотири поля для адреси; це:

source_ip source_port destination_ip destination_port
< client            > < server                      >

Всередині стеку TCP ці чотири поля використовуються як складений ключ для узгодження пакетів з з'єднаннями (наприклад, дескриптори файлів).

Якщо клієнт має багато підключень до одного і того ж порту одного і того ж пункту призначення, то три з цих полів будуть однаковими - source_portзмінюється лише для розрізнення різних з'єднань. Порти - це 16-бітні номери, тому максимальна кількість з'єднань, які може мати будь-який клієнт до будь-якого хост-порту, становить 64K.

Однак, декілька клієнтів можуть мати до 64K підключень до порту якогось сервера, і якщо у сервера є кілька портів або один з них є багатоповерховим, то ви можете помножити це ще більше.

Отже, реальна межа - це дескриптори файлів. Кожному окремому з'єднанню сокета надається дескриптор файлу, тому обмеження - це дійсно кількість дескрипторів файлів, які система налаштована для дозволу та ресурсів для обробки. Максимальний ліміт зазвичай перевищує 300 К, але його можна налаштувати, наприклад, із системою sysctl .

Реалістичні межі, якими можна похвалитися для звичайних коробок, - близько 80 К, наприклад, однопотокові сервери обміну повідомленнями Jabber.


3
Теоретично ви можете мати більше 64K вихідних з'єднань, якщо ви (a) використовуєте SO_REUSEADDR та (b) націлювати різні IP-адреси призначення. Але обмеження пам'яті ядра, ймовірно, спочатку зупинить вас.
Даррон

4
Межа sysctl є для всієї системи, правда? Існує також обмеження, налаштоване з ulimit, яке обмежує максимальну кількість дескрипторів файлів для процесу. Це за замовчуванням набагато менше 300
К

1
Невелика технічність: Клієнтська машина також може мати кілька IP-адрес, призначених від маршрутизатора. Усі вони можуть бути призначені одному MAC або ж машина може мати декілька фізичних мережевих інтерфейсів для додаткових IP-адрес. ОП вказав 1 IP, але для інших важливо не виключати більше IP-адрес.
Тодд

2
@Буду красиво пояснити !! Дуже корисно ... Хотілося б надіслати +100 нагород ... дякую :-)
Том Тейлор

1
Майте на увазі, що tcp_fin_timeout блокує той самий сокет (джерело, ціль, комбінація портів) ще 60 секунд за замовчуванням, що значно скорочує кількість фактично доступних tcp-з'єднань між двома системами, якщо з'єднання відключаються та знову підключаються. Цю проблему можна мінімізувати, дозволяючи повторно використовувати (tcp_tw_reuse = 1) сокети в стані TIME_WAIT (не завжди підтримується) або порушуючи стандарт TCP / IP, зменшуючи цей час очікування до нижчого значення (як правило, добре працює).
fgwaller

17

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


14
C10k 10 років і більше не цікаво. [Читайте це], щоб побачити, як можна вирішити C1024K.
Чандраншу

@Chandranshu - ти мав на увазі metabrew.com/article/… ?
Мікко Ранталайнен

1
@MikkoRantalainen - так. Я думаю, зараз є кращі орієнтири. Хлопці Phoenix вже підштовхнули його до 2 мільйонів одночасного підключення.
Чандраншу

3
@Chandranshu - є демонстрація Dell з підключенням 12M: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen

1
Ще кілька років тому: Intel Atom D2700, 2 Гб оперативної пам’яті, 1.2M одночасних підключень. Єдині проблеми, які виникли у мене з вікнами Windows під час тестової роботи; вони регулярно піднімалися на животі під час спроби зробити DoS коробкою Intel Atom ...
Klaws

12

Якщо ви використовували необроблений socket ( SOCK_RAW) і повторно реалізовували TCP в userland, я думаю, що відповідь у цьому випадку обмежена лише кількістю (local address, source port, destination address, destination port)кортежів (~ 2 ^ 64 на локальну адресу).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.