2015-03-25 3 views
4

Я пытаюсь понять, как HTTP-сервер гарантирует, что правильный ответ будет отправлен обратно правильному клиенту.Как HTTP-ответ отправляется обратно на правильный клиент в TCP?

На очень высоком уровне:

  1. На ТСР реализации сервера, некоторые ServerSocket (прослушивание на хост: порт, что запрос был адресован) создает «клиентский сокет» для обработки запрос

  2. (если взять на себя резьбовой сервер) - поток распределяется в приложении и работа выполняется

Вопросов: -

A.) Должен ли ответ возвращаться через тот же Socket, который обрабатывал запрос?

B.) Если да, то как ответ сопоставляется с тем же сокетом, который обрабатывал запрос?

C.) Является ли это ответственностью за сокет для поддержки IP-хоста клиента, на который должны быть отправлены ответные пакеты, или это HTTP-заголовки, которые поддерживают эту информацию и которые затем используются для ответа на ответ правильному клиенту?

Если информация заголовка HTTP используется для маршрутизации ответа обратно вызывающего клиента, то я предполагаю, что ответ не обязательно должны быть обработаны тем же разъем, обработал связанный запрос

Любая помощь очень оценили. James

ответ

3

Розетки двунаправленные.

Когда ServerSocket получает новое соединение, он создает новый Socket и передает его в поток, который будет обрабатывать запрос. Этот сокет уже подключен и поддерживает двустороннюю связь. Этот поток затем отправит ответ обратно через этот сокет, что приведет к его перенаправлению обратно подключенному клиенту. Рабочий поток явно не должен знать IP/хост другого конца, потому что сокет двунаправлен. Он просто должен отправить свой ответ через сокет и закрыть соединение, когда это будет сделано.

+0

Спасибо за комментарии Erick. Итак, это похоже на тот же сокет, который обрабатывал запрос HAS для обработки ответа - я думаю, потому что этот сокет - это то, что содержит детали вызывающего клиента? Что происходит в асинхронной модели, при которой поток, обрабатывающий Request (A), не обязательно является потоком, который создает ответ (B) - означает ли это, что потоки должны делиться сведениями о сокете, ожидающем ответа сообщение? – JamieP

+0

Да, тот же сокет должен использоваться как для получения запроса, так и для отправки ответа. Нить не имеет значения. Один поток может прочитать запрос, передать его другому потоку для обработки и передать его в другой поток для ответа. Важно то, что один и тот же сокет должен использоваться от начала до конца. Вся необходимая информация о маршрутизации хранится внутри этого сокета, вам просто нужно прочитать ее и записать в нее по мере необходимости. –

+0

Реми, спасибо за добавление к этому. Я все еще не понимаю механизм, связанный с тем, что Response привязан к сокету. В неблокирующей модели мы можем назвать удаленную веб-службу как часть обслуживания запроса, и на данный момент нет потоков, ожидающих ответа. Когда ответ веб-службы возвращается и поток назначается для работы с ним, как ответ возвращается к исходному сокету? – JamieP