Číslování datagramů
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (→Příklad:  Přidán druhý příklad.) |  (Opraveno vysvětlení Acknowledgement Number.) | ||
| Řádka 13: | Řádka 13: | ||
| * Číslujeme odesílané oktety (byte), nikoli celé segmenty (pro případ, že by v rámci přenosu došlo k rozdělení segmentu na více datagramů — dnes nepravděpodobné, ale teoreticky to protokol IP v. 4 může udělat). | * Číslujeme odesílané oktety (byte), nikoli celé segmenty (pro případ, že by v rámci přenosu došlo k rozdělení segmentu na více datagramů — dnes nepravděpodobné, ale teoreticky to protokol IP v. 4 může udělat). | ||
| * Potvrzení jsou součástí segmentů, odesílaných opačným směrem (pokud nějaké opačným směrem jdou). (''Piggy-backing'') | * Potvrzení jsou součástí segmentů, odesílaných opačným směrem (pokud nějaké opačným směrem jdou). (''Piggy-backing'') | ||
| − | * Číslování komunikace začíná náhodně zvoleným číslem (nikoli od jedničky), aby se zamezilo pravděpodobnosti záměny čísel při restartu komunikace či novém spojení. | + | * Číslování komunikace začíná náhodně zvoleným číslem (nikoli od jedničky), aby se zamezilo pravděpodobnosti záměny čísel při restartu komunikace či novém spojení. Toto číslo se označuje ISN (Initial Sequence Number). | 
| * Oktet potvrzuji teprve tehdy, kdy jsem řádně obdržel '''všechny''' předchozí oktety. | * Oktet potvrzuji teprve tehdy, kdy jsem řádně obdržel '''všechny''' předchozí oktety. | ||
| Řádka 20: | Řádka 20: | ||
| ; Každý segment TCP má v hlavičce položky | ; Každý segment TCP má v hlavičce položky | ||
| * <tt>Sequence Number</tt>... pořadové číslo prvního oktetu tohoto segmentu. | * <tt>Sequence Number</tt>... pořadové číslo prvního oktetu tohoto segmentu. | ||
| − | * <tt>Acknowledgement Number</tt>... pořadové číslo  | + | * <tt>Acknowledgement Number</tt>... pořadové číslo dalšího oktetu, který očekávám od partnera. | 
| − | * <tt>Window</tt>... Počet oktetů, které lze odeslat předtím, než budou další data potvrzena | + | ** Například pokud pošlu číslo <code>1320</code>, pak tím říkám, že všechny oktety až po oktet <code>1319</code> již mám v pořádku a nyní od partnera požaduji oktet číslo <code>1320</code>. | 
| + | ** Může se stát, že při výpadku datagramu příjemce obdrží všechny oktety až po číslo 2500 a následně ještě segment s oktety 3001-3500. V takovém případě musí příjemce nastavit <code>Acknowledgement Number = 2501</code>. Oktety 3001-3500 tak dostane podruhé. Nicméně kdyby uvedl <code>Acknowledgement Number = 3501</code>, pak by mu odesilatel nikdy neposlal znovu oktety 2501-3000.   | ||
| + | * <tt>Window</tt>... Počet oktetů, které lze odeslat předtím, než budou další data potvrzena. | ||
| == Příklady == | == Příklady == | ||
| − | === Příklad 1  | + | === Příklad 1 — <tt>Sequence Number</tt> === | 
| − | ; <tt>Sequence Number</tt> | + | ; Zadání | 
| * Předpokládejme délky segmentů: | * Předpokládejme délky segmentů: | ||
| ** 1. segment: 856 oktetů,   | ** 1. segment: 856 oktetů,   | ||
| ** 2. segment: 377 oktetů, | ** 2. segment: 377 oktetů, | ||
| ** 3. segment: ... | ** 3. segment: ... | ||
| − | * Náhodné číslo, kterým začneme číslování oktetů, bude 15326. | + | * Náhodné číslo, kterým začneme číslování oktetů, bude ISN = 15326. | 
| * Čísla <tt>Sequence Number</tt> pro jednotlivé oktety budou | * Čísla <tt>Sequence Number</tt> pro jednotlivé oktety budou | ||
| Řádka 51: | Řádka 53: | ||
| ; Pořadí odeslaných datagramů | ; Pořadí odeslaných datagramů | ||
| [[File:seq_num-komunikace.png]] | [[File:seq_num-komunikace.png]] | ||
| + | |||
| == Úkoly == | == Úkoly == | ||
| Řádka 60: | Řádka 63: | ||
| * Jaké bude pořadí odeslaných čísel Sequence Number a Acknowledgement Number. | * Jaké bude pořadí odeslaných čísel Sequence Number a Acknowledgement Number. | ||
| </div> | </div> | ||
| + | |||
| + | |||
| + | == Zdroje == | ||
| + | * [https://jameshfisher.com/2018/02/24/what-are-tcp-sequence-numbers/ JamesHFisher.com → What are TCP Sequence Numbers] | ||
Aktuální verze z 31. 5. 2019, 10:58
| Obsah | 
Princip
- V datagramových sítích může dojít ke ztrátě či změně pořadí odesílaných datagramů.
- Tyto ztráty řeší transportní vrstva.
-  Aby bylo možné vůbec problémy řešit, je třeba:
- Očíslovat odesílané segmenty, abychom vůbec zjistili, že se nějaká data ztratila.
- Odesilatel si musí pamatovat odeslaná data až do okamžiku, kdy mu příjemce potvrdí, že data v pořádku dorazila.
- Příjemce musí odesílat potvrzení o tom, že data dorazila. (I potvrzení se přitom může ztratit.)
 
Realizace v TCP — pravidla
- Číslujeme odesílané oktety (byte), nikoli celé segmenty (pro případ, že by v rámci přenosu došlo k rozdělení segmentu na více datagramů — dnes nepravděpodobné, ale teoreticky to protokol IP v. 4 může udělat).
- Potvrzení jsou součástí segmentů, odesílaných opačným směrem (pokud nějaké opačným směrem jdou). (Piggy-backing)
- Číslování komunikace začíná náhodně zvoleným číslem (nikoli od jedničky), aby se zamezilo pravděpodobnosti záměny čísel při restartu komunikace či novém spojení. Toto číslo se označuje ISN (Initial Sequence Number).
- Oktet potvrzuji teprve tehdy, kdy jsem řádně obdržel všechny předchozí oktety.
Hlavička TCP
- Každý segment TCP má v hlavičce položky
- Sequence Number... pořadové číslo prvního oktetu tohoto segmentu.
-  Acknowledgement Number... pořadové číslo dalšího oktetu, který očekávám od partnera.
-  Například pokud pošlu číslo 1320, pak tím říkám, že všechny oktety až po oktet1319již mám v pořádku a nyní od partnera požaduji oktet číslo1320.
-  Může se stát, že při výpadku datagramu příjemce obdrží všechny oktety až po číslo 2500 a následně ještě segment s oktety 3001-3500. V takovém případě musí příjemce nastavit Acknowledgement Number = 2501. Oktety 3001-3500 tak dostane podruhé. Nicméně kdyby uvedlAcknowledgement Number = 3501, pak by mu odesilatel nikdy neposlal znovu oktety 2501-3000.
 
-  Například pokud pošlu číslo 
- Window... Počet oktetů, které lze odeslat předtím, než budou další data potvrzena.
Příklady
Příklad 1 — Sequence Number
- Zadání
-  Předpokládejme délky segmentů:
- 1. segment: 856 oktetů,
- 2. segment: 377 oktetů,
- 3. segment: ...
 
- Náhodné číslo, kterým začneme číslování oktetů, bude ISN = 15326.
-  Čísla Sequence Number pro jednotlivé oktety budou
-  1. segment: SeqNum = 15327 = 15326+1... začínáme prvním oktetem komunikace, přičteme zvolené startovní číslo.
-  2. segment: SeqNum = 16183 = 15326+856+1... 856 oktetů jsme již odeslali, nyní odesíláme 857. oktet a další oktety až do délky segmentu,
-  2. segment: SeqNum = 16560 = 15326+856+377+1... 16559 oktetů jsme již odeslali, nyní odesíláme další oktety až do délky segmentu,
 
-  1. segment: 
Příklad 2
- Zadání
- Předpokládejme délky segmentů max. 1000 oktetů
- Parametr Window: 2500 oktetů
- Odesíláme: 8300 oktetů dat
- Příjemce a odesilatel si vyberou náhodná čísla: 1520 a 2315.
- Předpokládejme, že nedojde k žádným ztrátám.
Zapište postupně hodnoty Sequence Number a Acknowledgement Number pro jednotlivé odesílané segmenty.
- Pořadí odeslaných datagramů
Úkoly
- Vypište posloupnost čísel segmentů
- Velikost segmentů je 2000 B (předpokládejme, že u všech stejná), parametr Window je 16 KB.
- 4. segment posloupnosti se ztratí.
- 2. potvrzení v řadě se ztratí.
- Jaké bude pořadí odeslaných čísel Sequence Number a Acknowledgement Number.


