что сигнализирует клиенту об отправке следующего запроса в постоянных соединениях HTTP - PullRequest
0 голосов
/ 09 августа 2011

В HTTP / 1.1 (постоянные соединения), что такое «сигнал», который побуждает клиента отправить следующий HTTP-запрос?Есть ли что-то еще, кроме Content-Length?

Я пытаюсь создать простой шлюз, который бы соединял трафик TCP между файлами.У меня есть два приложения:

  • «сервер» открывает сокет и ждет подключения.Когда соединение установлено, оно пересылает все, что получает, из выходного файла, в то же время пересылает все из входного файла обратно в сокет
  • «клиент» ожидает содержимое в указанном выше выходном файле и устанавливает соединение ссервер отправляет на него данные и записывает полученные данные обратно в указанный выше входной файл.

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

AFAIK это должно быть полностью прозрачно, но постоянные соединения не работают должным образом.

Я тестирую с Firefox - происходит то, что FF отправляет два GET и получает два ответа.Но затем он просто сидит и ждет, как будто он еще не получил все данные ... Через 5 секунд (сервер отвечает «Keep-Alive: timeout = 5», так что это подходит), одна из сторон закрывает соединение ивосстанавливает его и отправка продолжается для нескольких файлов, когда он снова застревает.

Я слушал с WireShark, но не смог найти ничего необычного.Есть идеи, что происходит?

ОБНОВЛЕНИЕ : ниже приведен скриншот журнала WireShark.Это показывает, что HTTP-соединение отправляется слишком поздно, после того, как TCP-соединения закрываются (обратите внимание на время).Судя по моим логам, он был отправлен сразу.Есть идеи, почему это несоответствие?Стоит ли как-то «промывать» розетку?Я использую Python.

WireShark log

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Нет «сигнала». Клиент отправляет следующий запрос, когда он готов это сделать.

Но тогда он просто сидит и ждет, как будто он не получил все данных пока нет

Так что, вероятно, еще не получил все данные. Вы пишете это точно, когда это входит? и очистка каких-либо буферов?

1 голос
/ 09 августа 2011

Это либо Content-Length, либо Chunked-Encoding (или если соединение закрыто), который "сигнализирует" клиенту длину / конец данных.

После получения данных HTTP браузер сохраняетсоединение tcp / ip открывается в течение некоторого времени, чтобы разрешить дальнейшие запросы к тому же серверу через то же соединение tcp / ip.

...