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?