Как идентифицируются разные TCP-соединения в HTTP-запросах? - PullRequest
9 голосов
/ 24 июня 2009

Насколько я понимаю, каждый HTTP-запрос использует свое собственное TCP-соединение (пожалуйста, исправьте меня, если я ошибаюсь). Итак, допустим, что к одному серверу существует два текущих подключения. Например, код JavaScript на стороне клиента, запускающий пару запросов POST AJAX с использованием объекта XMLHttpRequest, один за другим, перед получением ответа на первый. Итак, мы говорим о двух подключениях к одному серверу, каждое из которых ожидает ответа, чтобы направить его к каждой отдельной функции обратного вызова.

Теперь вот что я не понимаю: пакет TCP включает ip и порт источника и назначения, но не будут ли оба этих подключения иметь одинаковые адреса src и dest ip и порт 80? Как пакеты могут быть дифференцированы и направлены соответствующим образом? Имеет ли это какое-либо отношение к порядковому номеру пакета, который отличается для каждого соединения?

Ответы [ 3 ]

10 голосов
/ 24 июня 2009

Когда ваш браузер создает новое соединение с сервером HTTP, он использует другой исходный порт.

Например, допустим, ваш браузер создает два подключения к серверу, а ваш IP-адрес - 60.12.34.56. Первое соединение может исходить от исходного порта 60123, а второе от 60127. Это встроено в заголовок TCP каждого пакета, отправляемого на сервер. Когда сервер отвечает на каждое соединение, он использует соответствующий порт (например, 60123 или 60127), чтобы пакет вернулся обратно в нужное место.

Один из лучших способов узнать об этом - загрузить Wireshark и просто наблюдать за трафиком в собственной сети. Это покажет вам это и многое другое.

Кроме того, это дает представление о том, как преобразование сетевых адресов (NAT) работает на маршрутизаторе. У многих компьютеров может быть один и тот же IP-адрес, и маршрутизатор перезапишет запрос на использование другого порта, чтобы два компьютера могли одновременно подключаться к таким местам, как AOL Instant Messenger.

3 голосов
/ 24 июня 2009

Они различаются по порту источника.

Основная причина того, что каждый HTTP-запрос не генерирует отдельное TCP-соединение, называется keepalives , между прочим.

0 голосов
/ 27 сентября 2015

Сокет в пакетной сетевой связи считается комбинацией из 4 элементов: IP-адрес сервера, порт сервера, IP-адрес клиента, клиентский порт. Второй обычно фиксируется в протоколе, например http обычно слушают в порту 80, но клиентский порт - это случайное число, обычно в диапазоне 1024-65535. Это связано с тем, что операционная система может использовать эти порты для известных протоколов сервера (например, 21 для FTP, 22 для SSH и т. Д.). Одно и то же сетевое устройство не может использовать один и тот же клиентский порт для открытия двух разных подключений даже к разным серверам, и если два разных клиента используют один и тот же порт, сервер может различать их по их IP-адресам. Если порт используется в системе либо для прослушивания соединения, либо для установления соединения, его нельзя использовать ни для чего другого. Вот как операционная система может отправлять пакеты правильному процессу после получения сетевой картой.

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