Sdílet prostřednictvím


Dual-Stack sokety pro IPv6 Winsock aplikace

Aby bylo možné podporovat protokol IPv4 i IPv6 v systému Windows XP s aktualizací Service Pack 1 (SP1) i v systému Windows Server 2003, musí aplikace vytvořit dva sokety, jeden soket pro použití s protokolem IPv4 a jeden soket pro použití s protokolem IPv6. Tyto dva sokety musí aplikace zpracovávat samostatně.

Windows Vista a novější nabízejí možnost vytvořit jeden soket IPv6, který dokáže zpracovat provoz IPv6 i IPv4. Například se vytvoří soket tcp pro naslouchání IPv6, umístí do režimu duálního zásobníku a vázaný na port 5001. Tento soket se dvěma zásobníky může přijímat připojení od klientů TCP IPv6, kteří se připojují k portu 5001 a z klientů TCP IPv4, kteří se připojují k portu 5001. Tato funkce umožňuje výrazně zjednodušený návrh aplikace a snižuje režijní náklady na prostředky vyžadované při účtování operací na dvou samostatných soketech.

Vytvoření soketu Dual-Stack

Ve výchozím nastavení soket IPv6 vytvořený v systému Windows Vista a novějším funguje pouze přes protokol IPv6. Aby bylo možné z IPv6 soketu udělat dual-stack socket, musí být volána funkce setsockopt s volbou IPV6_V6ONLY socket, aby se tato hodnota nastavila na nulu před tím, než je socket svázán s IP adresou. Pokud je možnost soketu IPV6_V6ONLY nastavena na nulu, lze soket vytvořený pro rodinu adres AF_INET6 použít k odesílání a přijímání paketů na adresu IPv6 nebo mapovanou adresu IPv4 a z ní.

IP adresy s Dual-Stack soketem

Dvouřadé sokety vždy vyžadují adresy IPv6. Schopnost pracovat s adresou IPv4 vyžaduje použití formátu adresy IPv6 mapovaného na IPv4. Všechny adresy IPv4 musí být reprezentované ve formátu IPv4 mapované adresy IPv6, který umožňuje komunikaci s uzlem IPv4 pouze aplikací. Formát IPv4 mapované adresy IPv6 umožňuje reprezentovat adresu IPv4 uzlu IPv4 jako adresu IPv6. Adresa IPv4 se zakóduje do 32 bitů adresy IPv6 s nízkým pořadím a 96 bitů s vysokým pořadím obsahuje pevnou předponu 0:0:0:0:0:0:FFFF. Formát IPv4 mapované adresy IPv6 je zadaný v dokumentu RFC 4291. Další informace naleznete v tématu www.ietf.org/rfc/rfc4291.txt. Makro IN6ADDR_SETV4MAPPED v Mstcpip.h lze použít k převodu adresy IPv4 na požadovaný formát IPv4 adresy IPv6.

Pokud je základní protokol ve skutečnosti IPv4, pak je adresa IPv4 namapována do formátu adresy IPv6 mapovaného na IPv4. To znamená, že pole rodina ve struktuře SOCKADDR označuje AF_INET6, ale adresa IPv6 mapovaná na IPv4 je zakódována ve struktuře adres IPv6. U soketu se dvěma zásobníky v režimu naslouchání to znamená, že všechna přijatá připojení IPv4 vrátí adresu IPv6 mapovanou na IPv4. U soketu se dvěma sadami, který se připojuje k cíli IPv4, musí být struktura SOCKADDR předaná pro připojení adresou IPv6 mapovanou na IPv4. Aplikace musí dbát na to, aby s těmito adresami IPv6 mapovanými na IPv4 správně zacházely a používaly je pouze s duálními sokety. Pokud má být IP adresa předána běžnému soketu IPv4, musí se jednat o běžnou adresu IPv4, nikoli o adresu IPv6 mapovanou pomocí protokolu IPv4.

Potenciální problémy s použitím soketu Dual-Stack

Potenciálním úskalím pro aplikace je získání IPv6 adresy mapované IPv4 na soketu se dvěma zásobníky a následný pokus o použití vrácené IP adresy na jiném soketu pouze IPv6. Například funkce getsockname nebo getpeername mohou při použití na soketu se dvěma zásobníky vracet adresu IPv6 mapovanou na IPv4. Pokud je vrácená adresa IPv6 mapovaná na IPv4 následně použita na jiném soketu, který nebyl nastaven na dual-stack (soket pouze IPv6, což je výchozí chování při vytvoření soketu), jakékoli použití tohoto soketu pouze IPv6 s adresou IPv6 mapovanou IPv4 selže. Formát adresy IPv6 mapovaný na IPv4 lze použít pouze na soketu se dvěma zásobníky.

Pokud aplikace na soketu datagramu se dvěma zásobníky vyžaduje, aby funkce LPFN_WSARECVMSG (WSARecvMsg) vracela informace o paketech ve struktuře WSAMSG pro datagramy přijaté přes protokol IPv4, musí být IP_PKTINFO možnost soketu na soketu nastavena na hodnotu true. Pokud je na soketu nastavena pouze možnost IPV6_PKTINFO na hodnotu true, informace o paketech budou poskytnuty pro datagramy přijaté přes IPv6, ale nemusí být poskytnuty pro datagramy přijaté přes IPv4.

Pokud se aplikace pokusí nastavit možnost soketu IP_PKTINFO na soketu datagramu se dvěma zásobníky a protokol IPv4 je v systému zakázán, funkce setsockopt selže a WSAGetLastError se vrátí s chybou WSAEINVAL. Stejná chyba je také vrácena funkcí setsockopt v důsledku jiných chyb. Pokud se aplikace pokusí nastavit možnost soketu úrovně IPPROTO_IP na soketu se dvěma zásobníky a selže s WSAEINVAL, měla by aplikace určit, zda je protokol IPv4 v místním počítači zakázán. Jednou z metod, kterou lze použít ke zjištění, zda je protokol IPv4 povolen nebo zakázán, je zavolat funkci soketu s parametrem af nastaveným na hodnotu AF_INET a pokusit se vytvořit soket IPv4. Pokud funkce soketu selže a WSAGetLastError vrátí chybu WSAEAFNOSUPPORT, znamená to, že protokol IPv4 není povolený. V tomto případě může být selhání funkce setsockopt při pokusu o nastavení možnosti soketu IP_PKTINFO aplikací ignorováno. V opačném případě by měla být chyba při pokusu o nastavení možnosti soketu IP_PKTINFO považována za neočekávanou chybu.

U soketu s duálním zásobníkem při odesílání datagramů pomocí funkce WSASendMsg a aplikace chce specifikovat konkrétní místní zdrojovou adresu IP, která má být použita, metoda zpracování závisí na cílové IP adrese. Při odesílání na cílovou adresu IPv4 nebo cílovou adresu IPv6 mapovanou na IPv4 by měl jeden z řídicích datových objektů předaných ve struktuře WSAMSG , na kterou odkazuje parametr lpMsg , obsahovat strukturu in_pktinfo obsahující místní zdrojovou adresu IPv4, která se má použít k odeslání. Při odesílání na cílovou adresu IPv6, která není adresou IPv6 mapovanou na IPv4, by měl jeden z řídicích datových objektů předaných ve struktuře WSAMSG , na kterou odkazuje parametr lpMsg , obsahovat strukturu in6_pktinfo obsahující místní zdrojovou adresu IPv6, která se má použít k odeslání.

Průvodce IPv6 pro aplikace Windows Sockets

změna datových struktur pro aplikace winsock IPv6

Volání funkcí pro aplikace Winsock IPv6

použití pevně zakódovaných adres IPv4

Problémy s uživatelským rozhraním pro IPv6 Winsock aplikace

Podkladové protokoly pro aplikace Winsock IPv6

Příkaz getPeername

Jméno getsock

in_pktinfo

in6_pktinfo

IP_PKTINFO

IPV6_PKTINFO

setsockopt

LPFN_WSARECVMSG (WSARecvMsg)

WSASendMsg