Numery sekwencyjne w TCP/IP

0

Witam,
Dzisiaj zabrałem się za pisanie obsługi stosu TCP/IP w moim systemie. Problem pojawił się z numerami sekwencyjnymi.
Testuje tak: na komputerze[A] z systemem linux odpalam "nc -l -p 90" oraz wireshark'a, a na moim systemie[B] łącze się i wysyłam tekst(2x).
Transmisja wygląda następująco:

/* Połączenie */
seq: 0x01000000 seq_ack: 0x00000000 [A] wysyłam SYN do [B]
seq: 0xade8acb1 seq_ack: 0x01000000 [B] odsyła SYN+ACK do [A]
seq: 0x01000001 seq_ack: 0xade8acb2 [A] wysyłam ACK do [B]

/* Wysłanie tekstu */
seq: 0x01000001 seq_ack: 9xade8acb2 [A] wysyłam ACK+PSH z danymi(11B) do [B]
seq: 0xade8acb2 seq_ack: 0x0100000c [B] odsyła ACK do [A]

/* Ponowne wysłanie tekstu - błąd związany z numerkami */
seq: 0x0100000c seq_ack: 0xade8acb3 [A] wysyłam ACK+PSH z danymi(11B) do [B]

Wireshark ozaznacza mi ten pakiet jako niepoprawny oraz nie otrzymuję żadnej odpowiedzi.
Numery sekwencyjne tworze tak([A] klient, [B] serwer):
Początkowy seq = 0x01000000, seq_ack: 0x00000000.
Zmienne seq i seq_ack modyfikują się tylko w tedy gdy nadejdzie pakiet z flagą ACK.

seq = odebrane->ack_seq
seq_ack = odebrane->ack + 1;

To co napisałem to dość uproszczony sposób obliczania numerów, ale nie powinno być żadnych błędów. Co jest nie tak?

0

W wireshark wygląda to tak:
user image

0

Udało się :-)

/* odbiór pakietu */
  if(tcp->flags & TCP_CODE_ACK){
   /* sprawdzenie poprawnosci pakietu */
   /* .... */
   /* nowe numerki */
      ether->seq = tcp->ack_seq;
      ether->ack_seq = tcp->flags & ~TCP_CODE_ACK ? tcp->seq + 1 : tcp->seq;
    }
   /* ... */
0

OK opanowałem sytuację.
W do numeru ack_seq przy odpowiedzi ACK dodaje się długość otrzymanych informacji.
Dziękuję za uwagę ;-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1