сокет сервера получает 2 http-запроса при отправке из chrome и один при отправке из firefox - PullRequest
28 голосов
/ 21 января 2011

Я написал простой сервер, использующий сокет API в C под Linux, который прослушивает порт 80 на localhost. Теперь, когда я отправляю запрос из браузера Google Chrome в программу, он получает 2 запроса, в то время как он получает только один, когда я отправляю из Firefox.

URL, который я набрал в браузере: http://localhost/xyz.html

РЕЗУЛЬТАТ, КОГДА Я ПЕЧУЮ URL В ХРОМЕ

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# ./DCMTOL_RUN 

Inside HTTP server Handler

Inside HTTP request Handler 

**Detected request: clientsocket_fd = 6 clientportnumber = 38027**

GET /xyz.html HTTP/1.1

Host: localhost

Connection: keep-alive

Cache-Control: max-age=0

Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10

Accept-Encoding: gzip,deflate,sdch

Accept-Language: en-US,en;q=0.8

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3


Inside HTTP request Handler

**Detected request: clientsocket_fd = 7 clientportnumber = 38029**

^C

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# 

второй запрос не отправляет никаких данных, поэтому мой код ожидает вызова чтения, и поэтому я должен завершить его '^ C'.

ВЫХОД, КОГДА Я ПЕЧУЮ URL В FIREFOX

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# ./DCMTOL_RUN 
Inside HTTP server Handler
Inside HTTP request Handler

**Detected request: clientsocket_fd = 6 clientportnumber = 45567**

GET /xyz.html HTTP/1.1

Host: localhost

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 115

Connection: keep-alive


^C

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# 

Вопрос: Как браузер chrome может отправлять 2 запроса (один пустой), когда я набрал URL-адрес только один раз. Как вы можете видеть выше, я обнаружил 2 запроса. Я попытался сделать netstat в случае отправки URL-адреса из Chrome, и я обнаружил, что оба запроса были отправлены только браузером. и как вы можете видеть выше, когда я отправляю URL из firefox, получен только 1 запрос.

Вот вывод net stat при отправке запроса из chrome

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 117.195.110.186:48701   74.125.77.102:80        TIME_WAIT   -

tcp        0      0 117.195.110.186:48700   74.125.77.102:80        ESTABLISHED 5699/google-chrome

tcp        0      0 117.195.110.186:55815   209.85.175.138:80       ESTABLISHED 5699/google-chrome

tcp        0      0 127.0.0.1:80            127.0.0.1:38029         ESTABLISHED -

tcp        0      0 127.0.0.1:38029         127.0.0.1:80            ESTABLISHED 5699/google-chrome

tcp        0      0 127.0.0.1:38027         127.0.0.1:80            ESTABLISHED 5699/google-chrome

tcp        0      0 127.0.0.1:80            127.0.0.1:38027         ESTABLISHED -

tcp        0      0 117.195.110.186:35402   74.125.153.125:5222     ESTABLISHED 4430/pidgin

заранее спасибо:)

Ответы [ 7 ]

50 голосов
/ 09 февраля 2011

У меня была похожая проблема с моим сервером узлов.Это связано с следующей ошибкой в Chrome.Таким образом, Chrome отправляет запрос на favicon на каждый запрос.Поскольку, скорее всего, вы не отправляете фавикон обратно, он запрашивает один после каждого законного запроса.

Firefox и большинство других браузеров также отправляют запрос на фавикон при первом подключении, но кешируютрезультат, т. е. если в первый раз не возвращается значок favicon, они не продолжают попытки - вот почему вы видите только один запрос от Firefox.Похоже, что Chrome, к сожалению, слишком настойчив в своей популярности.

17 голосов
/ 20 апреля 2011

Я сейчас пишу небольшой асинхронный веб-сервер на Mono / .NET 4.0 и заметил то же самое.Chrome открывает два TCP-соединения, но для связи используется только одно.Данные не передаются с использованием этого сокета.Даже после того, как вы перестанете загружать веб-страницу из браузера, Chrome будет поддерживать соединение в течение некоторого времени.

Я должен согласиться с @RomanK, так как это, вероятно, для оптимизации или это ошибка, но не для favicon поскольку нет данных, передаваемых через это соединение.

1 голос
/ 23 января 2011

Можете ли вы опубликовать источник вашего сервера? Я предполагаю, что Chrome просто открывает сокет на вашем сервере для оптимизации будущих запросов к той же странице, но не отправляет на него никаких команд.

0 голосов
/ 30 марта 2019

У меня был пустой tcp-пакет, отправленный Chrome на мой простой сервер перед обычным html-запросом GET и / favicon после. Favicon не был проблемой, но пустой tcp был, так как мой сервер ждал либо данных, либо соединения, которое будет установлено. У него не было данных, и он не установил соединение в течение 2 минут. Так что нить висела 2 минуты.

В связанном вопросе я нашел полезную ссылку о том, что она может быть вызвана настройкой «Предсказывать сетевые действия для улучшения производительности загрузки страницы». Я попытался отключить настройки прогнозирования один за другим, и это сработало. В версии chrome 73.0.3683.86 (официальная сборка) (64-разрядная версия) это вызвано включенной настройкой chrome «Использовать службу прогнозирования для более быстрой загрузки страниц».

Так что просто перейдите к настройке -> Дополнительно -> Конфиденциальность и безопасность -> Используйте службу прогнозирования, чтобы быстрее загружать страницы и выключать ее.

0 голосов
/ 14 мая 2016

Для меня это произойдет, только если я напишу / вставлю в поле chrome url.Он никогда не вызывается из тега привязки.Если вы запишете URL запроса, вы увидите, что он был отправлен два раза.

My was / users.Я добавил consloe.log () в код (сервер узла), и вы могли видеть, что / пользователи появляются дважды.И поскольку я не вошел в приложение, я получил бы двойные уведомления.

Этот пример может воспроизвести его:

Имя сценария 1: redirect.php

<?php

session_start();

$_SESSION['x'][] = 'This will show only once';
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0');
header('Location: /to.php');

Сценарий2 name: to.php

 <?php    

session_start();

if (isset($_SESSION['x']))
    foreach ($_SESSION['x'] as $x) {
        echo $x . '<br>';
}

unset($_SESSION['x']);

Так что, если вы скопируете вставку «SERVERNAME / redirect.php» в поле URL, в конечном итоге вы получите двойные сообщения.

0 голосов
/ 10 марта 2014

Похоже, что если chrome не может получить favicon (полученный от меня 404), он все равно открывает второе соединение для запроса favicon, но фактически не запрашивает его.выглядит как ошибка (до сих пор).«Кэширование» пошло не так, может быть, он также известен как «кеш» («я уже ничего не получил в прошлый раз») после того, как соединение уже открыто?

0 голосов
/ 27 февраля 2012

Он не отправляет данные в секундный сокет.У нас есть журналы нашего веб-сервера Nginx, заполненные 400 ошибками, потому что это второе соединение закрывается перед отправкой каких-либо data / actual_HTTP_request на сервер.Открывает первое соединение, сразу открывает второе, затем использует первое и ждет, пока второе не умрет.

Вот не подробный дамп о втором соединении

No.     Time        Source                Destination           Protocol Length Info
20227 38.688849   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      66     1758 > 80     [SYN] Seq=0 Win=65535 Len=0 MSS=1440 WS=2 SACK_PERM=1
20228 38.688870   80.XX.YYY.186         89.ZZZ.TTT.208        TCP      66     80 > 1758 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=128
20256 38.752121   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      60     1758 > 80 [ACK] Seq=1 Ack=1 Win=65536 Len=0
26351 50.565758   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      60     1758 > 80 [FIN, ACK] Seq=1 Ack=1 Win=65536 Len=0
26352 50.565830   80.XX.YYY.186         89.ZZZ.TTT.208        TCP      54     80 > 1758 [FIN, ACK] Seq=1 Ack=2 Win=5888 Len=0
26396 50.657612   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      60     1758 > 80 [ACK] Seq=2 Ack=2 Win=65536 Len=0
...