Подтвердить что ты не робот

Серверный сокет получает 2 HTTP-запроса, когда я отправляю из chrome и получает их, когда я отправляю из firefox

Я написал простой сервер, используя API сокетов в C under linux, который слушает в порту 80 на localhost. Теперь, когда я отправляю запрос из браузера google chrome в программу, он получает 2 запроса, пока он получает только один, когда я отправляю из firefox.

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

OUTPUT, КОГДА Я ТИП URL В ХРОМЕ

[email protected]:/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

[email protected]:/home/anirudh/workspace/DCMTOL# 

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

OUTPUT, КОГДА Я ТИП URL В FIREFOX

[email protected]:/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

[email protected]:/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

заблаговременно:)

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Он не посылает никаких данных в соке секунд. У нас есть журналы журналов Nginx, заполненные 400 ошибками, потому что это второе соединение закрыто перед отправкой каких-либо данных /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

Ответ 5

Кажется, что если хром не может получить favicon (полученное мной 404), он все равно открывает второе соединение для запроса favicon, но на самом деле не запрашивает его. выглядит как ошибка (по-прежнему). "кэширование" пошло не так, возможно, ака-кеш ( "я уже ничего не получил в предыдущий раз" ) проверка выполняется после того, как conn уже открыт?

Ответ 6

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

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

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

Script 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');

Script 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, возможно, вы получите удвоенные сообщения.