Číslování datagramů

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Přidána zatím teorie...)
 
(Opraveno vysvětlení Acknowledgement Number.)
 
(Nejsou zobrazeny 3 mezilehlé verze od 1 uživatele.)
Řádka 8: Řádka 8:
 
*# Odesilatel si musí pamatovat odeslaná data až do okamžiku, kdy mu příjemce potvrdí, že data v pořádku dorazila.
 
*# 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.)
 
*# Příjemce musí odesílat potvrzení o tom, že data dorazila. (I potvrzení se přitom může ztratit.)
 +
  
 
== Realizace v TCP — pravidla ==
 
== 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).
 
* Čí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.
 +
  
 
==Hlavička TCP==
 
==Hlavička TCP==
 
; 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 posledního správně přijatého oktetu komunikace.
+
* <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&nbsp;pořádku a&nbsp;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&nbsp;oktety 3001-3500. V&nbsp;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říklad 1 &mdash; <tt>Sequence Number</tt> ===
 +
; 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&nbsp;=&nbsp;15326.
 +
 
 +
* Čísla <tt>Sequence Number</tt> pro jednotlivé oktety budou
 +
** 1. segment: <code>SeqNum = 15327 = 15326+1</code> ... začínáme prvním oktetem komunikace, přičteme zvolené startovní číslo.
 +
** 2. segment: <code>SeqNum = 16183 = 15326+856+1</code> ... 856 oktetů jsme již odeslali, nyní odesíláme 857. oktet a další oktety až do délky segmentu,
 +
** 2. segment: <code>SeqNum = 16560 = 15326+856+377+1</code> ... 16559 oktetů jsme již odeslali, nyní odesíláme další oktety až do délky segmentu,
 +
 
 +
[[File:seq_num.png]]
 +
 
 +
=== 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 <tt>Sequence Number</tt> a <tt>Acknowledgement Number</tt> pro jednotlivé odesílané segmenty.
 +
 
 +
; Pořadí odeslaných datagramů
 +
[[File:seq_num-komunikace.png]]
 +
 
 +
 
 +
== Úkoly ==
 +
<div class="Priklad">
 +
; 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.
 +
</div>
 +
 
 +
 
 +
== Zdroje ==
 +
* [https://jameshfisher.com/2018/02/24/what-are-tcp-sequence-numbers/ JamesHFisher.com &rarr; What are TCP Sequence Numbers]

Aktuální verze z 31. 5. 2019, 10:58


Obsah

Princip


Realizace v TCP — pravidla


Hlavička TCP

Každý segment TCP má v hlavičce položky


Příklady

Příklad 1 — Sequence Number

Zadání

Seq num.png

Příklad 2

Zadání

Zapište postupně hodnoty Sequence Number a Acknowledgement Number pro jednotlivé odesílané segmenty.

Pořadí odeslaných datagramů

Seq num-komunikace.png


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


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje