TCP hole punchingTCP 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. Použité pojmyV 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ů. PopisNAT 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. Diagram Sítě
Typy NATuDostupnost 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:
TechnikyMetody Predikce Portů (s předvídatelnými NATem)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. Podrobnosti o typických instancích TCP spojení s použitím TCP Hole PunchingPř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:
Požadavky na NAT pro TCP Hole PunchingDalší požadavky na NAT, aby byl v souladu s TCP simultaneous openAby 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. TCP Hole Punching a Carrier-grade NAT (CGN)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. OdkazySouvisející článkyReferenceV tomto článku byl použit překlad textu z článku TCP hole punching na anglické Wikipedii. |