Как системный стек TCP/IP различает несколько программ, подключающихся к одному и тому же адресу и порту?
Предположим, что два веб-браузера работают на одном компьютере и получают доступ к одному и тому же веб-сайту (другими словами, к тому же IP-адресу на одном и том же порту).
Как операционная система распознает, какие пакеты из/для какой программы?
У каждой программы есть уникальное поле id в заголовке TCP? Если да, то какое поле называется?
Ответы
Ответ 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-адреса источника и получателя и идентичные порты источника и назначения, они должны быть одинаковыми.
Ответ 6
Под номер порта.
Ответ 7
IP-адрес используется для идентификации компьютера, а порт используется для идентификации процесса (приложения) внутри компьютера. Когда порт используется одним процессом, другие процессы больше не могут его использовать. Поэтому, если какой-либо пакет отправляется на этот порт, только владелец этого порта может обрабатывать этот пакет.
Ответ 8
Соединения идентифицируются парой конечных точек.
- Конечная точка означает (ip, порт)