Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Исходный порт обычно является эфемерным, что означает, что он произвольно назначается ОС. Другими словами:

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

(my_ip, 10000, your_ip, 80)

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

(my_ip, 10001, your_ip, 80)

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Ответ Кристофера частично правильный.

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

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

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

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

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

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

Ответ 5

Во-первых, "порт" - это просто номер. Все "соединение с портом" действительно представляет собой пакет, который имеет этот номер, указанный в поле заголовка "порт назначения".

Теперь у вас есть два ответа на ваш вопрос: один для протоколов с поддержкой состояния и один для протоколов без состояния.

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

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

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

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

Ответ 7

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

Ответ 8

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