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

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

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

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

Оновити: Ось мій код Java. Це, здається, працює, і netstat -t ясно показує два активних вихідних з'єднання з порту 9990 (від 1 до 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 
10
"Якщо ви питаєте про верхню межу добре розроблених систем, ви майже напевно робите це неправильно "
додано Автор frameworkninja, джерело

5 Відповіді

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

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

Це максимум на практиці, як правило, нижче. Наприклад, 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.

5
додано

На додаток до відповіді Ієна (вище), що для вихідних з'єднань ядром може бути лише 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.

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

1
додано

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

0
додано
Як це додати що-небудь нове відповіді вже розміщені на цьому старе запитання?
додано Автор frameworkninja, джерело

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

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

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

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

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