Následující článek prozkoumá dopad TCP hole punching na současnou společnost. TCP hole punching je v průběhu let tématem zájmu a diskusí, které mezi odborníky a širokou veřejností vytváří protichůdné názory. Tato postava/osoba/téma zanechala nesmazatelnou stopu v populární kultuře, politice, ekonomice a mnoha dalších aspektech moderní společnosti. Prostřednictvím podrobné analýzy se pokusíme osvětlit vliv TCP hole punching v různých oblastech a také prozkoumat jeho relevanci v současném kontextu. Budou se zabývat různými pohledy a předloženy argumenty, které vybízejí k zamyšlení a debatě na toto téma.
TCP hole punching odkazuje v počítačových sítích na situaci, kdy se dva počítače umístěné v LAN síti za NATem pokouší navzájem spojit pomocí odchozího TCP spojení. Taková situace je důležitá v případě peer-to-peer komunikace, jako je například VoIP (Voice over Internet Protocol), sdílení souborů, telekonference, chatovacích systémů a podobných aplikací.
TCP hole punching je běžně používaná NAT traversal technika pro vytvoření TCP spojení mezi dvěma peery za NATem v počítačové síti Internet. Termín NAT traversal je obecný pojem pro techniky, které vytvářejí a udržují TCP/IP spojení a nebo TCP spojení procházející NAT bránou.
V následujícím textu budou použity pojmy host, klient a peer téměř zaměnitelně.
Pojmy místní koncový bod a vnitřní koncový bod označují lokální IP:port, jak je viděn hostem na místní úrovni a jako vnitřní částí NATu.
Pojmy veřejný koncový bod a externí koncový bod označují externí IP:port mapován NATem, jak je vidět v síti a ve vnější části NATu.
Pojem vzdálený koncový bod označuje IP:port na jiného peera, jak je vidět ze sítě nebo vnějšími částmi obou NATů.
NAT traversal prostřednictvím TCP hole punching, je metoda pro vytvoření obousměrného TCP spojení mezi hosty v privátních sítích pomocí NATu. Tato metoda nebude fungovat se všemi typy NATů, protože jejich chování není standardizováné. Když se dva hosti připojí k sobě navzájem s pomocí TCP a přes odchozí spojení, jsou v "simultaneous TCP open" případu TCP stavu strojového diagramu.
| Peer A ←→ Brána A (NAT-a) ← .. Síť .. → Brána B (NAT-b) ←→ Peer B |
Dostupnost TCP hole punching techniky závisí na typu přidělování portů počítače používaného NATem. Dva peery za NATem pro připojení se navzájem prostřednictvím TCP simultaneous open[zdroj?] o sobě potřebují vědět trochu víc. Jedna věc, kterou nezbytně potřebují vědět, je „umístění“ druhého peeru, nebo vzdáleného koncového bodu.
Vzdálený koncový bod je údaj o IP adrese a portu, kam se peer chce připojí. Když dvojice peerů A a B, zahájí TCP spojení vazbou na místní porty Pa a Pb, tak potřebují vědět port vzdáleného koncového bodu tak, jak je mapován NATem, aby došlo k připojení.
Tady nastává jádro problému: pokud jsou oba peerové za NATem, jak se uhodne jaký je veřejný koncový bod druhého peeru? Tento problém se nazývá predikce NAT portu. Všechny TCP NAT traversal a hole punching metody musí vyřešit problém predikce portů.
Mohou být dva typy přidělování NAT portů:
V závislosti na tom, zda NAT bude používat předvídatelné nebo nepředvídatelné chování, bude možné nebo nemožné provést TCP připojení přes TCP simultaneous open, jak je uvedeno níže v tabůlce připojení reprezentující různé případy a jejich dopad na koncovou komunikaci:
| A Předvídatelné | A Nepředvídatelné | |
|---|---|---|
| B předvídatelné | ANO | ANO |
| B nepředvídatelné | ANO | NE |
Zde jsou některé z metod, které používá NAT, aby umožnil peerům provést předpověď portu:
Pokud vzdálený peer má informace o mapování, pak může uhodnout hodnoty následujícího mapování. TCP připojení se odehraje ve dvou krocích. V prvním kroku se peery připojí k třetí straně a získají informace o jejich mapování. Ve druhém kroku oba peery mohou uhodnout mapování portů NATu pro všechny následující připojení, což řeší problém s predikcí.
Tato metoda vyžaduje vykonání alespoň dvou po sobě jdoucích připojení pro každého z peerů a navíc je potřeba použít třetí stranu. Tato metoda nefunguje korektně v případě CGN (Carrier Grade NAT), který má více uživatelů za každou IP adresou, protože je dostupné omezené množství portů a alokování po sobě jdoucích portů pro stejného vnitřního hosta může být nepraktické nebo nemožné.
V tomto případě je predikce portů triviální. Peerové si prostě musí předat port, ke kterému jsou vázány, pomocí jiného komunikačního kanálu (jako např. UDP nebo DHT) než vykonají odchozí spojení TCP simultaneous open. Tato metoda vyžaduje pouze jedno připojení pro každého z peerů a navíc není potřeba použití třetí strany pro vykonání predikce.
Tento postup bohužel vyžaduje použití SO_REUSEADDR na TCP socket, což narušuje TCP standard a může vést k poškození dat. Je doporučeno používat pouze tehdy, pokud je aplikace schopná se ochránit vůči poškození dat.
Předpokládáme, že predikce portů již byla vykonána s pomocí jedne z výše uvedených metod a že každý z peerů zná vzdálený koncový bod. Oba peerové vykonají POSIXový příkaz connect na koncový bod toho druhého. TCP simultaneous open proběhne následujícím způsobem:
Aby TCP simultaneous open fungoval, tak by NAT měl:
Toto je dostatečnou zárukou toho, že se NAT bude chovat správně v závislosti k TCP simultaneous open.
Technika popsaná výše funguje dobře s Carrier-grade NAT (CGN). CGN může taktéž využívat port overloading, což znamená, že odlišné vnitřní koncové body se stejnou hodnotou portů mohou být mapovány na stejný veřejný koncový bod. Tento postup nenarušuje sjednocenost následující pětice:
{protocol, public address, public port, remote address, remote port}
Tento výsledek je díky tomu přijatelný. TCP port preservation může vést k případům, kdy CGN porty jsou přetíženy, kdy tento stav neohrožuje spolehlivost protokolu. Port overloading pro TCP umožňuje CGN vtěsnat vnitřně více hostů a zároveň zachovávat záruku koncové TCP komunikace.
V tomto článku byl použit překlad textu z článku TCP hole punching na anglické Wikipedii.