Чи повинен порт джерела TCP бути унікальним для кожного хоста?


10

Я дізнався, що TCP-з'єднання ідентифікується кортежем (вихідний IP, вихідний порт, ip призначення, порт призначення). Теоретично, таким чином, має бути можливість мати клієнта з host1: port1 підключення до server1: port1 і одночасно іншого клієнта (працює на хості1) з host1: port1 до server2: port1.

Я трохи перевірив Java, і поки що це здається можливим.

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

Оновлення: Ось мій код Java. Це, здається, працює, і netstat -t чітко показує два активних вихідних з'єднання з порту 9990 (один до 9997, один до 9998). Принаймні, на сучасному Linux це здається можливим?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

І netstat -t вихід (усічений):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

"Якщо ви запитуєте про верхні межі добре розроблених систем, ви майже напевно робите це неправильно ™ "
Chris S

Відповіді:


16

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


2
Дякую, що повністю відповідає теоретичній частині мого питання! Мені потрібно просто спробувати для кожної реалізації TCP, я думаю.
lxgr

5

Це максимум, на практиці він зазвичай нижчий. Наприклад, Linux використовує net.ipv4.ip_local_portпараметр ядра для визначення портів, які використовуються для вихідних з'єднань. Зазвичай це щось на кшталт

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Ви можете збільшити кількість доступних за допомогою sysctl, наприклад

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

або ви можете редагувати /etc/sysctl.conf з тією ж інформацією

net.ipv4.ip_local_port_range = 10000 65535

Усі знайдені нами приклади показують і мінімальне значення - 1024.


1

На додаток до відповіді Іена (вище), що може бути лише 10 000 портів, дозволених для вихідних з'єднань вашим ядром, теоретично ваш принаймні обмежений одним набором XX, XXX портів на IP-адресу на адаптері. Оскільки 127.1 не доступний для зовнішнього світу, перебуваючи в локальній мережі, то для кожної іншої IP-адреси ( зовнішньої ) ви маєте набір вихідних портів у межах діапазону портів 65К.

Тож вихідний ліміт дійсно:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Щоб зробити цю роботу, вам потрібно буде прочитати відповідь на цю тему .


0

Так. Це правда.

Порти мають зв'язувати програми та програми з мережею.

Ви не можете мати більше 65553 додатків, підключених TCP, і 65535 підключитися UDP на одному хості. Операційні системи типово динамічно керували портами, присвоюючи їм кожний додаток, який підключається до мережі.

Якщо у вас є два додатки, які слухають один і той же порт, коли приходить мережевий пакет, комп'ютер не міг знати, до якого додатка збираються доставити дані. Наприклад, якщо у вас Messenger і Skype одночасно прив'язані до одного порту, ваше повідомлення-месенджер з’явиться в скайпі і навпаки :)


Я думаю, що питання стосувалося не верхньої межі кількості прослуховувальних програм - яка, як ви зазначаєте, обмежена кількістю унікальних номерів портів, а про кількості розеток, що працюють за один раз. Веб-сервери часто мають десятки сокетів, всі адресовані своєму одному порту 80 або 443. Якщо багато серверів на хості це зробили, то немає причин, щоб кількість відкритих сокетів не могла перевищувати 2 ^ 32.
Брендон Родос

0

Хоча система може мати обмеження кількості відкритих TCP-з'єднань, вона, як правило, не має обмежень щодо використовуваних номерів портів. Однак хороша реалізація TCP повинна перешкоджати використанню однієї і тієї ж пари розеток двічі. (socket = IP-адреса + порт). Порт, однак, призначається процесу для запобігання крадіжок з'єднань, і звичайним методом є запит на безкоштовний порт для порту прослуховування або для вихідного. Це запобігає дублюванню вихідних сокетів і, отже, дублюючих з'єднань. Якщо не використовувати цей метод, сама програма повинна запобігати створенню дублікатів з'єднань.


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