Як сайти з високим трафіком обслуговують понад 65535 TCP-з'єднань?


29

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

Відповіді:


55

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

На рівні TCP кортеж (джерело ip, порт джерела, ip призначення, порт призначення) повинен бути унікальним для кожного одночасного з'єднання. Це означає, що один клієнт не може відкрити більше 65535 одночасних підключень до сервера. Але сервер може (теоретично) сервер 65535 одночасних з'єднань на клієнта .

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


Цікаво, як НАТ на це вплине на якість перевізника
TheLQ

@TheLQ Без CGN кожен клієнт не може відкрити більше 65535 підключень до одного сервера, жодному клієнту не потрібно майже стільки підключень до одного сервера. З CGN кожна CGN не може відкрити більше 65535 підключень до одного і того ж сервера, вони повинні бути спільними для всіх клієнтів, які використовують цей CGN. Чи може CGN одночасно відкривати 65535 підключення до одного сервера та 65535 підключення до іншого сервера - це деталізація реалізації, яка може відрізнятися між різними реалізаціями CGN.
kasperd

Ліміт можна збільшити, додавши більше IP-адреси до CGN або розгорнувши більше CGN. Але ви також можете просто розгорнути подвійний стек. Тоді підключення до серверів із підтримкою IPv6 не пройдуть через CGN, тому вони не будуть споживати дорогоцінні порти.
kasperd

14

Ви помиляєтесь - унікальність сокета визначається чотирма факторами:

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

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

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

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


2

Питання полягало в тому, як обробити великі підрахунки (> 64k). Два найпоширеніші методи:

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

  • Розгорніть "NAT-клас NAT" (що друг, насмішливо і правильно, на мою думку, називає "NAT-клас"). Це по суті НАТ НАТ. Це має дуже погані наслідки для додатків, але це те, що роблять деякі великі провайдери, коли у них не вистачає простору IPv4 та / або номерів портів та / або вони не хочуть переходити на IPv6.


2
Якщо ви прочитаєте більше, ніж заголовок, ви побачите, що це питання стосується виснаження портів і ОП помилився, як це працює. Як саме ця відповідь додає до цього нічого нового?
MDMarra

2
ОП прямо (а не лише в заголовку) запитує "як сервери мають надзвичайно велику кількість ... запитів". Залишаючи осторонь плутанину щодо того, як працюють розетки, це правильне питання.
user8162

1
Відмінна робота щодо вирішення питання в середині речення. Інша частина цієї пропозиції говорить: (more than the max port number).
MDMarra

2
Можливо, ви пропустили ту частину, де я зазначав, що ОП не розуміє механіки розеток. Я вважаю, що як перевищити 64-портові поважні теми, це дискусія; Вибачте, якщо ви не погоджуєтесь, але це було ВІДПОВІДЬ питання, і Я БУЛО те, що я дав пару відповідей. Ви запитали, як це реагує; це як.
user8162

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