From Wikipedia, the free encyclopedia
A Transmission Control Protocol (TCP) az internet gerincét alkotó TCP/IP protokollcsalád egyik fő protokollja. A TCP a család két eredeti komponense közé tartozik, az Internet Protocolt (IP) egészíti ki, így együtt TCP/IP néven szokás hivatkozni rájuk. A TCP/IP protokollhierarchia szállítási rétegét valósítja meg. A TCP egy számítógépen futó program és egy másik számítógépen futó másik program között egy adatfolyam megbízható, sorrendhelyes átvitelét hivatott biztosítani. Az internet legfontosabb szolgáltatásainak nagy része TCP-n keresztül érhető el: ilyen pl. a World Wide Web és az e-mail. Más alkalmazások, melyeknél a kisebb késleltetés fontosabb a csomagvesztés elkerülésénél, a User Datagram Protocolt (UDP) használhatják.
A TCP egy kapcsolat-orientált protokoll, amely az OSI modell szállítási rétegében helyezkedik el. Fő feladata egy megbízható, és biztonságos kapcsolat kiépítése (és fenntartása) két folyamat között. Menetét alapvetően három részre bonthatjuk:
A protokoll a hibamentes átvitelhez az úgynevezett pozitív nyugtázás újraküldéssel (positive acknowledgement with retransmission) néven ismert eljárást használja. A TCP kapcsolatok egyes lépéseit állapotoknak nevezzük. A kapcsolat élettartama alatt különböző állapotváltozásokon megy keresztül:[1]
A TCP protokoll ellentétben az UDP-vel kapcsolatorientált, megbízható összeköttetést biztosít két eszköz között. Egy kapcsolat általános menete a következő:
Az adatátvitel megkezdése előtt kapcsolatot kell létesíteni a két végpont között. Mivel egy TCP szegmensben a maximálisan szállítható adat mérete korlátos (MTU), a protokollnak fel kell darabolnia az ennél nagyobb méretű adatfolyamot, majd a másik oldalon ugyanazon sorrendben vissza kell állítani azt (a megfelelő sorszámok alapján). A kapcsolat létrehozásakor szükséges így mindkét fél kezdő sorszámának egyeztetése, melyet a SYN vezérlőbittel megjelölt szegmensek elküldésével tesznek meg. Ezt a kapcsolódási folyamatot nevezzük háromfázisú kézfogásnak, melynek lépései a következők:
Ezután megkezdődik az adatok átvitele, és a kapcsolat mindaddig nyitva marad, amíg bármelyik fél nem kéri annak lezárását.
Az adatátvitel gyorsítása érdekében a TCP protokoll nem várja meg a nyugtát minden egyes szegmens elküldése előtt, mivel az nagyon lassú kapcsolatot eredményezne, helyette több szegmens elküldését is engedélyezi a nyugta beérkezése előtt. Mivel a hálózaton található eszközök és állomások tulajdonságai eltérőek, fontos egy adatfolyam-vezérlési mechanizmus meghatározása az ilyen protokollok esetén. Ennek hiányában a küldő fél könnyen túlterhelheti a fogadó felet, megfelelően nagy számú szegmens küldésével, és így az adatok egy része elveszik (a csomagokat nem lehet újra összeilleszteni a célállomáson). A TCP esetén ezt az adatfolyam-vezérlési mechanizmust „ablakozásnak”, a nyugta előtt elküldhető szegmensek számát pedig ablakméretnek (vagy röviden ablaknak) nevezzük. A kifejezés arra utal, hogy a kapcsolatban kommunikáló felek dinamikusan határozzák meg az elküldhető szegmensek számát (vagyis az ablakméretet).
Folyamat menetére példa:
A megbízható kézbesítés garantálja, hogy a kommunikáció során elküldött adatok veszteség, vagy kettőződés nélkül elérik a céljukat. Ennek érdekében a hibamentes átvitelhez, a TCP protokoll, az úgynevezett pozitív nyugtázás újraküldéssel (positive acknowledgement with retransmission) néven ismert eljárást használja. Formailag az elküldött összes oktett sorszámmal rendelkezik, és minden egyes elküldött szegmens, SEQ mezője határozza meg az abban szereplő legelső oktett sorszámát (mérete pedig a legutolsóét). A másik oldalon a fogadó fél a beérkezett szegmensek ACK mezőjében visszaküldött számmal jelzi a következőként várt szegmens sorszámát, ezzel nyugtázva az ennél kisebb sorszámú szegmensek sikeres fogadását is. A fogadó fél által küldött nyugta még nem azt jelenti, hogy a szegmenst kézbesítette a végfelhasználónak, csak átadta ennek felelősségét a másik oldali TCP folyamatnak.
Amikor a TCP elküld egy adatokat tartalmazó szegmenst a hálózaton, elhelyez egy másolatot az újraküldési sorban is, és elindít egy időzítőt; majd amint megérkezik a másik féltől a nyugta, törli a szegmenst a sorból. Ha az időzítő lejárta előtt mégse kap nyugtát a küldő fél (vagyis a célállomás feltehetően nem kapta meg a csomagot), akkor a szegmenst újraküldi. Az időzítő értékének meghatározásához a TCP méri az átlagos RTT-t (Round trip delay time - az az idő, ami alatt a csomagot elküldjük, és visszaérkezik rá a nyugta), és ennél egy kicsivel nagyobb értékre állítja be azt.[3]
Ha az adatátvitel során néhány csomag után nem érkezik meg a nyugta, a TCP által eredetileg meghatározott kumulatív nyugtázás[4] alkalmazásával az újraküldés feleslegesen nagy sávszélességet vehet igénybe. Például van 1 KB-nyi adatunk, amit 100 bájtos szegmensekben szeretnénk továbbítani a hálózaton. Ha az összesen elküldendő 11 szegmensből az első és a második csomag elveszik az átvitel során, akkor (kumulatív nyugtázással) az újraküldendő két csomag helyett mind a 11 csomagot ismét el kellene küldenünk.
Ennek kivédése érdekében bevezették az úgynevezett szelektív nyugtázást, mellyel a fogadó fél jelezni tudja mely csomagokat kapta meg hibamentesen, és így elég csak az elveszett csomagokat újraküldeni. A TCP header „OPTIONS” mezőjében lévő SACK (selective acknowledgement) beállítással tudjuk ezt befolyásolni, amiben megadhatjuk a helyesen megkapott szegmens határait.[5] A fenti példában a fogadó fél a SACK üzenetben a 200 és 1023-as sorszámokat küldené el. Így a forrás tudná, hogy elég csak az első két csomagot, 0-199 bájtig elküldeni.
A SACK használata nem kötelező és csak akkor használják, ha mindkét fél támogatja (ezt kapcsolódáskor egyeztetik).
Később kiadtak egy kiegészítést a SACK opcióhoz, mellyel már a feladó képes észrevenni a duplán újraküldött csomagokat is (D-SACK, duplicate-SACK). Így amikor a nyugták sorrendjének helytelensége miatt a feladó azt feltételezi, hogy néhány csomag elveszett és azokat újraküldi, a vevő oldal jelezheti a kettőződést, ezzel is gyorsítva az adatátvitelt. Ez teljesen kompatibilis az előző verzióval, ha mindkét fél támogatja a SACK használatát, a D-SACK-et is lehet használni. Bár ez a kiegészítés csak akkor működik, ha mindkét fél támogatja, de ellenkező esetben sem okoz problémát.[6]
Offsets | Octet | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octet | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Source port | Destination port | ||||||||||||||||||||||||||||||
4 | 32 | Sequence number | |||||||||||||||||||||||||||||||
8 | 64 | Acknowledgment number | |||||||||||||||||||||||||||||||
12 | 96 | Data offset | Fenntartva | N S | C W R | E C E | U R G | A C K | P S H | R S T | S Y N | F I N | Window Size | ||||||||||||||||||||
16 | 128 | Checksum | Urgent pointer | ||||||||||||||||||||||||||||||
20 ... |
160 ... |
Opciók és Padding |
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.