Как системный стек TCP / IP различает несколько программ, подключающихся к одному и тому же адресу и порту? - PullRequest
13 голосов
/ 20 июля 2009

Предположим, что два веб-браузера работают на одном компьютере и имеют доступ к одному веб-сайту (другими словами, к одному IP-адресу на одном и том же порту).

Как операционная система распознает, какие пакеты для какой программы и из какой программы?

Есть ли у каждой программы уникальное поле идентификатора в заголовке TCP? Если да, то как называется это поле?

Ответы [ 8 ]

36 голосов
/ 20 июля 2009

Две программы фактически не обращаются к «одному и тому же порту». Для целей TCP соединение определяется кортежем (src_ip, src_port, dst_ip, dst_port).

Порт источника обычно эфемерный, что означает, что он назначается операционной системой случайным образом. Другими словами:

Программа А будет иметь:

(my_ip, 10000, your_ip, 80)

Программа B будет иметь:

(my_ip, 10001, your_ip, 80)

Таким образом, ОС может видеть, что это разные «соединения», и может отправлять пакеты в правильные объекты сокетов.

4 голосов
/ 20 июля 2009

номер порта источника будет другим, даже если номер порта назначения совпадает. ядро свяжет номер порта источника с процессом.

3 голосов
/ 20 июля 2009

Ответ Кристофера частично верен.

Программы A и B фактически имеют дескриптор дескриптора сокета, хранящегося в реализации сокета базовой ОС. Пакеты доставляются в этот базовый сокет, и затем любой процесс, имеющий дескриптор этого ресурса сокета, может прочитать или записать его.

Например, скажем, вы пишете простой сервер на Unix-подобных ОС, таких как Linux или Mac OSX.

Ваш сервер принимает соединение, после чего соединение, состоящее из

( src IP, src Port, dest IP, dest Port )

появляется в нижележащем слое ОС. Затем вы разветвляете процесс для обработки соединения - теперь у вас есть два процесса с дескрипторами сокета, оба из которых могут его читать / записывать.

Обычно (всегда) исходный сервер закрывает свой дескриптор сокета и позволяет разветвленному процессу обрабатывать его. Для этого есть много причин, но одна, которая не всегда очевидна для людей, заключается в том, что когда дочерний процесс завершает свою работу и закрывает сокет, сокет остается открытым и подключенным, если у родительского процесса все еще есть открытый дескриптор.

3 голосов
/ 20 июля 2009

Когда клиент открывает соединение с получателем портом 80, он использует произвольный неиспользуемый порт source на локальном компьютере, скажем, 17824. Затем веб-сервер отвечает этому клиенту отправка пакетов на порт назначения 17824.

Второй клиент будет использовать второй неиспользуемый номер порта, скажем, 17825, и поэтому пакеты двух сокетов не будут смешиваться, так как они будут использовать разные номера портов на клиентском компьютере.

2 голосов
/ 18 октября 2016

Прежде всего, «порт» - это просто число. Все, что действительно представляет собой «соединение с портом», - это пакет, номер которого указан в поле заголовка «порт назначения».

Теперь есть два ответа на ваш вопрос, один для протоколов с отслеживанием состояния и один для протоколов без сохранения состояния.

Для протокола без сохранения состояния (т. Е. UDP) проблем нет, поскольку «соединений» не существует - несколько человек могут отправлять пакеты на один и тот же порт, и их пакеты будут поступать в любой последовательности. Никто никогда не находится в «связанном» состоянии.

Для протокола с состоянием (например, TCP) соединение идентифицируется 4-мя кортежами, состоящими из портов источника и назначения, а также IP-адресов источника и назначения. Таким образом, если две разные машины подключаются к одному и тому же порту на третьей машине, существует два разных подключения, поскольку исходные IP-адреса различаются. Если одна и та же машина (или две за NAT или иным образом совместно использующие один и тот же IP-адрес) дважды подключается к одному удаленному концу, соединения дифференцируются по порту источника (который обычно является случайным портом с большим номером).

Проще говоря, если я дважды подключусь к одному и тому же веб-серверу с моего клиента, два соединения будут иметь разные исходные порты с моей точки зрения и порты назначения с веб-сервера. Таким образом, нет никакой двусмысленности, даже если оба соединения имеют одинаковые IP-адреса источника и назначения.

Порты - это способ мультиплексировать IP-адреса, чтобы разные приложения могли прослушивать одну и ту же пару IP-адрес / протокол. Если приложение не определяет собственный протокол более высокого уровня, невозможно мультиплексировать порт. Если два соединения, использующие один и тот же протокол, имеют одинаковые IP-адреса источника и назначения и одинаковые порты источника и назначения, они должны быть одинаковыми.

0 голосов
/ 14 марта 2015

Соединения идентифицируются парой конечных точек. - Конечная точка означает (ip, порт)

0 голосов
/ 28 августа 2013

IP-адрес используется для идентификации компьютера, а порт используется для идентификации процесса (приложения) на компьютере. Когда порт используется одним процессом, другие процессы больше не могут его использовать. Поэтому, если какой-либо пакет отправляется на этот порт, только владелец этого порта может обработать этот пакет.

0 голосов
/ 20 июля 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...