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 ...
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 ...