home       basis       routing       switching       advanced       security       overig       testen      

TCP (3): Packet Loss and Retransmission:

Bekijk het volgende verloop van pakketten:
 
(in dit gesimplifieerd verloop werken we met opeenvolgende SEQ-nummers,
we gaan straks zien dat dit in realiteit niet het geval is
)
 
Stap 1: Client (A) stuurt een data-pakket met nummer 3
 
Stap 2: het pakket gaat verloren onderweg
 
Stap 3: Client (A) stuurt al een volgend pakket nummer 4
 
Stap 4: Server (B) ontvangt pakket nummer 4
            er is een missing pakket (seq nr 3)
            (B) stuurt een ACK 3, (ik heb 2 ontvangen en wacht op 3).
 
Stap 5: Client (A) verstuurt opnieuw pakket nr 3 (seq nr 3).
 
Stap 6: Server (B) ontvangt 3 en stuurt een ACK 5,
             want hij had 4 al eerder ontvangen.
  
 
Onze volledige data-transfert, inclusief session-setup en session-tear-down ziet er nu als volgt uit:

Client (A)                Server (B)
    |                          |
    |---- SYN ---------------> |   (Step 1: Handshake)
    |                          |
    | <-- SYN-ACK ------------ |   (Step 2: Handshake)
    |                          |
    |---- ACK ---------------> |   (Step 3: Handshake)
    |                          |
    |---- Data(Seq=1) -------> |   (Step 1: Data Transfer)
    |                          |
    | <-- ACK(Ack=2) --------- |   (Step 2: Data Transfer) received 1 expecting 2
    |                          |
    |---- Data(Seq=2) -------> |   (Step 3: Data Transfer)
    |                          |
    | <-- ACK(Ack=3) --------- |   (Step 4: Data Transfer) received 2 expecting 3
    |                          |
    |---- Data(Seq=3) (lost)-> |   (Step 1: Data Transfer Packet Loss)
    |                          |
    |--- Data(S=4)(not lost)-> |   (Step 3: Data Transfer) 
    |                          |
    | <-- ACK(Ack=3) --------- |   (Step 4: Packet Loss)   expecting 3
    |                          |
    |---- Retransmit(Seq=3) -> |   (Step 5: Retransmission 3)
    |                          |
    | <-- ACK(Ack=5) --------- |   (Step 6: ack) expecting 5  (lost 3, got 4, then got 3)
    |                          |
    |---- FIN ---------------> |   (Step 1: Termination from client)
    |                          |
    | <-- ACK -----------------|   (Step 2: ack termination-client from server)
    |                          |
    | <-- FIN -----------------|   (Step 3: Termination from server)
    |                          |
    |---- ACK ---------------> |   (Step 4: ack termination-server from client)

SEQUENCE-numbers, ACKNOWLEDGEMENT-numbers
 
Elk TCP segment bevat een volgnummer, het SEQUENCE-number.
Deze volgnummers , vertegenwoordigen het aantal reeds verstuurde bytes in een transfert.
Ze volgen mekaar dus niet echt op.

Een sequence-number is eigenlijk een byte-positie in de TCP-stream, waar het pakket moet worden bijgepast (in volgorde, of niet in volgorde).
Maar, er wordt er als allereerste sequence-number een random getal genomen.
Dit random getal moet telkens worden afgetrokken van het vermelde sequence-number om de actuele plaats in een stream te kennen.
We zien dit vaak in wireshark omdat er een relatief seq.nr. vermeld staat [waar dan reeds de random integer is afgetrokken].

Sequence-numbers in TCP worden uitgedrukt in units of bytes: op welke byte-location in de TCP-stream 'past' dit pakket.
 
Een voorbeeld in wireshark ...

screenshot-at-2024-08-10-14-06-42

Kijk even in de meest rechtse kolom, daar zie je dingen als:
 
4 server - to - client Seq=0   Ack=1
5 client - to - server Seq=1   Ack=1
7 server - to - client Seq=1   Ack=366
9 client - to - server Seq=366 Ack=479
11 srvr - to - client   Seq=479 Ack=712
13 client - to - srvr   Seq=712 Ack=746
 
... elke ACK links betekent: we verwachten als volgend pakket NR ...
... en merk op dat die inderdaad telkens als nieuw SEQ nr optreedt ...
... in de regel eronder ...