2011-01-21 15 views
19

Ho scritto un server semplice utilizzando l'API socket in C sotto linux che ascolta alla porta 80 su localhost. Ora quando invio una richiesta dal browser google chrome al programma riceve 2 richieste mentre ne riceve solo una quando invio da firefox.riceve 2 richieste HTTP quando invio da chrome e ne riceve uno quando invio da firefox

L'URL ho digitato nel browser è stata: http://localhost/xyz.html

OUTPUT quando si digita l'URL IN CROMO

[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 seconda richiesta non invia alcun dato quindi il mio codice attende alla chiamata di lettura e quindi devo terminarlo '^ C'.

OUTPUT quando si digita l'URL in 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# 

Domanda: Come può browser Chrome invia 2 richieste (uno è vuoto), quando ho digitato l'URL solo una volta. Come puoi vedere sopra ho rilevato 2 richieste. Ho provato a fare netstat nel caso di invio di URL da Chrome e ho riscontrato che entrambe le richieste erano state inviate solo dal browser. e come puoi vedere sopra quando invio l'URL da Firefox solo 1 richiesta viene ricevuta.

Ecco l'output di stat net quando invio richiesta da 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 

grazie in anticipo :)

+2

Hai provato a eseguire tcpflow o tcpdump per vedere se nella richiesta è effettivamente inviato qualcosa? Potrebbe aprire una connessione per richieste future. (come menzionato da RomanK). – Kylar

+2

Dopo due anni, ho la stessa domanda con Chrome 24. – Eye

risposta

46

Ho avuto un problema simile con il mio server nodo. È dovuto allo following bug in Chrome. In breve, Chrome ha inviato una richiesta per una favora ad ogni richiesta. Poiché è probabile che tu non stia inviando una favicon, ne richiede una dopo ogni richiesta legittima.

Firefox, e molti altri browser, inviano anche una richiesta di favicon quando si connettono per la prima volta, ma memorizzano nella cache il risultato, ovvero se non c'è una favicon restituita per la prima volta, non continuano a provare - ecco perché stai vedendo solo una singola richiesta da Firefox. Sembra che Chrome sia sfortunatamente un po 'troppo persistente con la sua richiesta favicon.

+0

molto utile, +1 – XORcist

+1

Per me dare una favicon non aiuta, ho il problema con la richiesta vuota perché blocca la lettura dello stream per un periodo di timeout (10s). –

+2

Ho trovato che: ** il secondo socket non è per favicon **, nulla verrà inviato in quel socket, come descritto nella risposta di davidlt. – WKPlus

1

di poter postare la fonte del server? La mia ipotesi è che Chrome apra semplicemente un socket sul server per ottimizzare le future richieste alla stessa pagina, ma non invia alcun comando su di esso.

+1

Non è il caso. In realtà ho rintracciato in wireshark e ho trovato un'altra richiesta per l'icona preferita. http://stackoverflow.com/a/12795169/986760 – fayyazkl

11

Attualmente sto scrivendo un piccolo server Web asincrono su Mono/.NET 4.0 e ho notato la stessa cosa. Chrome apre due connessioni TCP, ma solo una viene utilizzata per la comunicazione. Non ci sono dati inviati usando quel socket. Anche dopo aver interrotto il caricamento della pagina web dal browser, Chrome mantiene ancora attiva la connessione per un po 'di tempo.

Devo concordare con @RomanK, in quanto è probabilmente per le ottimizzazioni o è un bug, ma non è per favicon in quanto non ci sono dati trasferiti lanciare quella connessione.

+5

Recentemente sono incappato in questo comportamento. Apparentemente, Chrome apre un "socket speculativo", per poter effettuare immediatamente la richiesta nel caso in cui debba essere fatta una nuova richiesta. Ironicamente, sembra rallentare solo Chrome quando si tratta di eseguire il rendering della pagina. – Ruud

+0

Ho anche il problema con la richiesta vuota. Il mio server è scritto in java e questa richiesta causa un accept, quindi il prossimo passo viene letto il flusso di input del socket, ma sfortunatamente blocca il timeout (10s) l'unico lavoro che ho trovato è di ridurre il timeout a 1s. :( –

+0

Ingannato da questo problema. Ho scritto un server http in python, basato sul wsgiref/simple_server integrato che può gestire una sola richiesta una volta, quando apri l'url con chrome, rende il mio server bloccato. c'è un "nessun socket dati", il mio server è bloccato durante la lettura. – WKPlus

0

Non invia alcun dato nella presa dei secondi. Abbiamo i nostri registri del server Web Nginx pieni di 400 errori perché questa seconda connessione viene chiusa prima di inviare qualsiasi dato/actual_HTTP_request al server. Apre la prima connessione, apre la seconda immediatamente, quindi utilizza la prima e attende che la seconda muoia.

Ecco una discarica non dettagliato circa la seconda connessione

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

Sembra che se Chrome non può recuperare favicon (ha ricevuto 404 da me) si apre ancora la seconda connessione per la richiesta favicon, ma non lo fa in realtà lo richiede. sembra un bug (ancora). 'caching' andato storto forse aka cache ('ho già ricevuto nulla la volta precedente') il controllo viene eseguito dopo che la conn è già aperta?

0

Per me succede solo se scrivo/incolla nel campo dell'URL di cromo. Non viene mai attivato dal tag di ancoraggio. Se si registra l'url della richiesta, è possibile vederlo inviato due volte.

Il mio era/utenti. Ho aggiunto consloe.log() nel codice (server nodo) e potresti vedere/gli utenti compaiono due volte. E dal momento che non ero loggato nell'app ricevevo messaggi di doppia notifica.

Questo esempio può riprodurlo:

Script 1 Nome: 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 Nome: to.php

<?php  

session_start(); 

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

unset($_SESSION['x']); 

Quindi, se si copia incolla "SERVERNAME/redirect.php "nel campo url in caso si ottengano messaggi raddoppiati.

Problemi correlati