Domanda

Sto costruendo il mio webserver sulla base di un tutorial. Ho trovato un modo semplice per avviare una connessione TCP e inviare un segmento della http dati (il server web sarà eseguito su un microcontrollore, quindi sarà molto piccolo)

In ogni caso, il seguente è la sequenza che ho bisogno di passare attraverso:

  1. ricevere SYN

  2. inviare SYN, ACK

  3. ricevere ACK (la connessione è ormai consolidata)

  4. ricevere ACK con HTTP GET comando

  5. Invia ACK

  6. inviare FIN, ACK con HTTP i dati (per esempio 200 OK)

  7. ricevere FIN, ACK

  8. Invia ACK

Tutto funziona bene fino a quando io mando il mio riconoscimento e messaggio HTTP 200 OK. Il cliente non invierà un riconoscimento a quei due pacchetti e, quindi, nessuna pagina web viene visualizzato. Ho aggiunto un file pcap della sequenza come ho registrato con Wireshark.

file Pcap: http://cl.ly/5f5/httpdump2.pcap

Tutti i numeri di sequenza e di conferma sono corrette, checksum sono ok. Le bandiere sono anche a destra. Non ho idea di che cosa sta andando male.

È stato utile?

Soluzione 3

La lunghezza campo IP è stato quindi contando 8 bit troppo. Ho commesso un errore nei miei calcoli. Everythings funziona come un fascino ora!

Altri suggerimenti

Credo che il passaggio 6. dovrebbe essere solo FIN, senza ACK. Cosa pacchetto dal client stai ACKing in quel luogo? Anche io non vedo perché 4. dovrebbe essere un ACK invece di un normale pacchetto di dati -. Il client ACKed la connessione a 3

Questo diagramma su TCP afferma potrebbe aiutare.

WireShark dice (del pacchetto FIN):

  

TCP rotto: Il campo acknowledge è   diverso da zero mentre il flag ACK non è impostato

Non so per certo che è quello che sta causando il problema, ma se WireShark non piace quel pacchetto, forse il cliente non lo fa neanche. Quindi, dovrebbe essere FIN + ACK, o si dovrebbe impostare il campo acknowledge a 0.

Se questo non lo risolve, si potrebbe anche provare a inviare i dati, poi un pacchetto FIN separata. E 'valida per includere dati con la FIN, ma è più comune per inviare la FIN da solo (come si vede nel altra traccia pcap hai postato in precedenza).

Inoltre, si dovrebbe probabilmente essere impostando il flag PUSH nel pacchetto con il 200 OK

Infine, non vedo alcun tentativo di ritrasmissione per il pacchetto FIN -? È che perché è stata interrotta la cattura subito

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top