2011-01-21 11 views
19

Escribí un servidor simple usando socket API en C en Linux que escucha en el puerto 80 en localhost. Ahora cuando envío una solicitud desde el navegador google chrome al programa, recibe 2 solicitudes mientras recibe solo una cuando envío desde firefox.server socket recibe 2 solicitudes HTTP cuando envío desde chrome y recibe una cuando envío desde firefox

El URL que escribí en el navegador era: http://localhost/xyz.html

salida cuando me escribe la URL EN CHROME

[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# 

la segunda solicitud no envía ningún dato por lo que mi código de espera en la llamada de lectura y entonces tengo que terminarlo '^ C'.

salida cuando me escribe la URL en 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# 

Pregunta: ¿Cómo puede cromo navegador envía peticiones 2 (uno de ellos vacío) cuando escribió la dirección URL sólo una vez. Como puede ver arriba, detecté 2 solicitudes. Intenté hacer netstat en el caso de enviar URL desde Chrome y encontré que ambas solicitudes fueron enviadas solo por el navegador. y como puede ver arriba cuando envío la URL de Firefox, solo se recibe una solicitud.

Aquí está la salida del stat neta cuando envío petición de cromo

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 

gracias de antemano :)

+2

¿Ha intentado ejecutar tcpflow o tcpdump para ver si realmente se envió algo en la solicitud? Podría estar abriendo una conexión para futuras solicitudes. (como RomanK mencionó). – Kylar

+2

Después de dos años, tengo la misma pregunta con Chrome 24. – Eye

Respuesta

46

Tuve un problema similar con mi servidor de nodos. Se debe a following bug en Chrome. En resumen, Chrome está enviando una solicitud de favicon en cada solicitud. Como es probable que no esté devolviendo un favicon, este solicita uno después de cada solicitud legítima.

Firefox, y la mayoría de los otros navegadores, también envían un pedido de un favicon cuando se conectan por primera vez, pero almacenan el resultado en caché, es decir, si no se devuelve un favicon por primera vez, no lo intentan. solo está viendo una sola solicitud de Firefox. Parece que Chrome lamentablemente es demasiado persistente con su solicitud de favicon.

+0

muy útil, +1 – XORcist

+1

Para mí, dar un favicon no ayuda, tengo el problema con la solicitud vacía porque bloquea la lectura de la secuencia durante un período de tiempo de espera (10s). –

+2

Encontré que: ** el segundo socket no es para favicon **, no se enviará nada en ese socket, como se describe en la respuesta de davidlt. – WKPlus

1

Se puede publicar la fuente de su servidor? Supongo que Chrome simplemente abre un socket en su servidor para optimizar futuras solicitudes a la misma página, pero no envía ningún comando sobre él.

+1

Ese no es el caso. De hecho, rastreé Winshark y encontré otra solicitud de icono favorito. http://stackoverflow.com/a/12795169/986760 – fayyazkl

11

Actualmente estoy escribiendo un pequeño servidor web asíncrono en Mono/.NET 4.0 y noté lo mismo. Chrome abre dos conexión TCP, pero solo uno se usa para la comunicación. No hay datos enviados usando ese socket. Incluso después de que dejas de cargar la página web desde el navegador, Chrome aún mantiene la conexión activa durante bastante tiempo.

Debo estar de acuerdo con @RomanK, ya que es probable que se trate de optimizaciones o de un error, pero no es favicon, ya que no hay datos transferidos a esa conexión.

+5

Me encontré con este comportamiento también recientemente. Aparentemente, Chrome abre un "socket especulativo" para poder realizar la solicitud de inmediato en caso de que sea necesario realizar una nueva solicitud. Irónicamente, parece que solo desacelera Chrome a la hora de renderizar la página. – Ruud

+0

También tengo el problema con la solicitud vacía. Mi servidor está escrito en Java y esta solicitud causa una aceptación, luego el siguiente paso es leer el flujo de entrada del socket, lamentablemente bloquea el tiempo de espera (10s), el único trabajo que encontré es reducir el tiempo de espera a 1s. :( –

+0

engañado por este problema también. Escribí un servidor http en python, basado en el wsgiref/simple_server integrado que solo puede manejar una solicitud una vez, cuando abro la url con chrome, bloquea mi servidor. hay un "socket de datos no", mi servidor está bloqueado al leerlo. – WKPlus

0

No envía datos en el socket de segundos. Tenemos nuestros registros del servidor web Nginx rellenos con 400 errores porque esta segunda conexión se cierra antes de enviar datos/actual_HTTP_request al servidor. Abre la primera conexión, abre la segunda inmediatamente, luego usa la primera y espera hasta que la segunda muera.

Aquí es un vertedero no detallado sobre la segunda conexión

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 
0

Parece que si Chrome no puede recuperar favicon (recibió 404 de mí) que todavía se abre la segunda conexión para la solicitud favicon pero no lo hace en realidad lo solicita. parece un error (inmóvil). 'caché' salió mal tal vez aka caché ('ya he recibido nada la vez anterior') la comprobación se realiza después de que la interfaz ya está abierta?

0

Para mí solo ocurre si escribo/pego en el campo url de cromo. Nunca se desencadena desde la etiqueta de anclaje. Si registra la URL de la solicitud, puede ver que se envía dos veces.

Mi/usuarios. Agregué consloe.log() en el código (servidor de nodos) y se podía ver/los usuarios aparecen dos veces. Y como no estaba conectado a la aplicación, recibiría doble notificación.

Este ejemplo puede reproducirlo:

Guión 1 Nombre: 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'); 

Guión 2 Nombre: to.php

<?php  

session_start(); 

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

unset($_SESSION['x']); 

Así que si copia pegar "NOMBRESERVIDOR/redirect.php "en el campo url eventualy recibe mensajes duplicados.

Cuestiones relacionadas