2013-05-03 23 views
6

Sto costruendo un server con il chip ENC28J60 e uno PIC18F4620. Il chip è collegato al mio PC via ethernet. Attualmente, sto provando a configurare la connessione TCP su cui costruirò una connessione HTTP in seguito. Non ho mai lavorato con TCP prima.L'handshake TCP non riesce: cosa c'è di sbagliato nella risposta del server?

Sto implementando TCP solo sul dispositivo incorporato, non sul PC.

Dopo aver inviato le richieste e le risposte ARP necessarie, apro il browser, digito l'indirizzo IP del chip e premere invio. In wireshark, vedo una richiesta TCP con il flag SYN. Credo che la bandiera SYN indichi una nuova iniziazione alla stretta di mano, quindi va bene, no?

La risposta del mio chip ha il flag SYN e ACK abilitato. Da what I understood, questo è il modo corretto per rispondere a una richiesta segnalata SYN. Il numero di conferma che il chip invia è corretto. Ora, il chip dovrebbe ricevere una risposta con il flag ACK abilitato, in base allo stesso riferimento.

Tuttavia, il processo sembra ricominciare: il PC invia esattamente lo stesso pacchetto come primo pacchetto, solo l''identificazione' è cambiata. Ho programmato il mio chip per smettere di rispondere quando continua a ricevere richieste SYN sullo stesso socket, quindi questa è la fine della trasmissione, nel browser ho letto che il server non può essere raggiunto.

Questa connessione viene effettuata su quattro prese contemporaneamente, tutte con lo stesso risultato.

Poiché utilizzo il mio PC come client (e non c'è niente di sbagliato nella mia porta/driver Ethernet), il problema deve essere qualcosa con il server e quindi con il secondo pacchetto.

Cosa c'è che non va con il secondo pacchetto? Wireshark non contrassegna nulla come errato, ma il client non invia un ACK.


1: Qui sono il pacchetti wireshark preleva:

Client: 3085 > 80 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=8 TSval=0 TSecr=0 SACK_PERM=1 
0000 00 13 d4 c6 53 16 00 1a a0 03 c7 21 08 00 45 00 ....S... ...!..E. 
0010 00 40 de 48 40 00 80 06 9a e1 c0 a8 00 01 c0 a8 [email protected]@... ........ 
0020 00 3c 0c 0d 00 50 88 ab 7e 18 00 00 00 00 b0 02 .<...P.. ~....... 
0030 ff ff a1 4f 00 00 02 04 05 b4 01 03 03 03 01 01 ...O.... ........ 
0040 08 0a 00 00 00 00 00 00 00 00 01 01 04 02   ........ ...... 

Server: 80 > 3085 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=8 
0000 00 1a a0 03 c7 21 00 13 d4 c6 53 16 08 00 45 00 .....!.. ..S...E. 
0010 00 30 88 10 40 00 7f 06 f2 29 c0 a8 00 3c c0 a8 [email protected] .)...<.. 
0020 00 01 00 50 0c 0d 00 00 00 01 88 ab 7e 19 70 12 ...P.... ....~.p. 
0030 ff ff ef 77 00 00 02 04 05 b4 01 03 03 03   ...w.... ...... 

Client: 3085 > 80 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=8 TSval=0 TSecr=0 SACK_PERM=1 
0000 00 13 d4 c6 53 16 00 1a a0 03 c7 21 08 00 45 00 ....S... ...!..E. 
0010 00 40 de 6f 40 00 80 06 9a ba c0 a8 00 01 c0 a8 [email protected]@... ........ 
0020 00 3c 0c 0d 00 50 88 ab 7e 18 00 00 00 00 b0 02 .<...P.. ~....... 
0030 ff ff a1 4f 00 00 02 04 05 b4 01 03 03 03 01 01 ...O.... ........ 
0040 08 0a 00 00 00 00 00 00 00 00 01 01 04 02   ........ ...... 

Tutto ciò avviene, analogamente, con le porte origine altri tre cliente.

Per confronto, ho fatto una richiesta a google.com e qui è il flusso TCP:

Client: 49562 > 80 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1 
0000 00 1a a0 03 c7 21 08 9e 01 30 ee 69 08 00 45 00 .....!.. .0.i..E. 
0010 00 34 32 3f 40 00 80 06 38 ab c0 a8 00 3c 4a 7d [email protected] 8....<J} 
0020 84 78 c1 9a 00 50 74 b8 31 9c 00 00 00 00 80 02 .x...Pt. 1....... 
0030 20 00 56 f7 00 00 02 04 05 b4 01 03 03 08 01 01 .V..... ........ 
0040 04 02            ..    

Server: 80 > 49562 [SYN, ACK] Seq=0 Ack=1 Win=62920 Len=0 MSS=1430 SACK_PERM=1 WS=64 
0000 08 9e 01 30 ee 69 00 1a a0 03 c7 21 08 00 45 00 ...0.i.. ...!..E. 
0010 00 34 9e e3 00 00 2e 06 5e 07 4a 7d 84 78 c0 a8 .4...... ^.J}.x.. 
0020 00 3c 00 50 c1 9a f4 5e 12 bc 74 b8 31 9d 80 12 .<.P...^ ..t.1... 
0030 f5 c8 7a 22 00 00 02 04 05 96 01 01 04 02 01 03 ..z".... ........ 
0040 03 06            ..    

Client: 49562 > 80 [ACK] Seq=1 Ack=1 Win=65536 Len=0 
0000 00 1a a0 03 c7 21 08 9e 01 30 ee 69 08 00 45 00 .....!.. .0.i..E. 
0010 00 28 32 49 40 00 80 06 38 ad c0 a8 00 3c 4a 7d .([email protected] 8....<J} 
0020 84 78 c1 9a 00 50 74 b8 31 9d f4 5e 12 bd 50 10 .x...Pt. 1..^..P. 
0030 01 00 af 9e 00 00 00 00 00 00 00 00    ........ ....  
+0

Dovrai controllare una modalità più dettagliata/informativa in Wireshark. Wireshark può facilmente decodificare i pacchetti per te in un modo più ragionevole di un dump esadecimale. Dubito che molte persone cercheranno effettivamente di capire il dump esadecimale. Per non parlare del fatto che nessuno ricalcola il checksum a mano dal dump esadecimale. – jippie

risposta

5

ho usato text2pcap per caricare la cattura in Wireshark.

Se si abilita la convalida del checksum TCP e i numeri di sequenza assoluti, verrà visualizzato un checksum TCP errato nel pacchetto SYN-ACK del chip.

Inoltre, il chip che inizia con il numero di sequenza assoluto 0 è molto debole.

+1

È divertente, in realtà 5 minuti fa ho scoperto la stessa cosa! Grazie molte per il tuo lavoro! – Keelan

+0

@CamilStaps se hai scoperto una soluzione, dovresti averla condivisa. Ti è capitato di scrivere una risposta quando è arrivato questo? –

+0

@JanDvorak era solo 5 minuti (nessuna metafora), stavo ancora controllando se questo fosse _ il_ problema (e non anche un problema sul trasferimento di google, per esempio). Naturalmente, avrei scritto una risposta al più presto altrimenti! – Keelan