130 likes | 225 Views
José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez. Sockets a IPv6. Compatibilitat. La nova implementació ha de ser compatible 100% amb IPv4 tant binàriament com a nivell de codi. - Els programes compilats amb IPv4 han de continuar funcionant en màquines amb IPv6.
E N D
José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez. Sockets a IPv6
Compatibilitat • La nova implementació ha de ser compatible 100% amb IPv4 tant binàriament com a nivell de codi. - Els programes compilats amb IPv4 han de continuar funcionant en màquines amb IPv6. - Els programes fets per a IPv4 que es recompilin amb la nova interfície d’IPv6 han de funcionar amb normalitat. • Les aplicacions han de poder interrelacionar-se independentment de la versió d’IP que utilitzin.
Modificacions • S’ha de canviar: La implementació interna de les funcions, (no afecta a la programació pel fet de que es passa un punter a una estructura genèrica -sockaddr-) el tipus de dades d’adreces de sockets, (sockaddr_in6 per a IPv6, sockaddr_in per a IPv4) les funcions de traducció de noms a adreces i les de conversions d’adreces. (s’afegeixen funcions anàlogues a gethostbyname(), gethostbyaddr() inet_ntoa() i inet_addr() compatibles totes amb ambdos protocols. Les existents es deixen com estan)
Interfície del socket • S’afegeixen una nova família d’adreces i una nova família de protocols a <sys/socket.h>, AF_INET6 com a adreces i PF_INET6 com a protocol (habitualment, s’utilitza la definició #define PF_INET6 AF_INET6) • una nova estructura d’adreces a <netinet/in.h>, struct in6_addr { union{ uint8_t _S6_u8[16]; uint32_t _S6_u32[4]; uint64_t _S6_u64[2]; } }; #define s6_addr _s6_un._s6_u8 (l’usuari pot escollir amb quina forma vol treballar)
Interfície del socket (II) • i una nova estructura d’adreçament de sockets: struct sockaddr_in6{ uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr;; uint32_t sin6_scope_id; }; • Diferències respecte IPv4: - sin6_len ens diu la longitud de l’estructura, - sin6_flowinfo expressa la qualitat de servei en la comunicació i - sin6_scope_id ens defineix el format d’entrada de la direcció.
Interfície per a l’obtenció d’adreces • La crida gethostbyname() es inadequada per a moltes aplicacions. • Causes: - No ens dóna cap eina per a distingir entre els diferents tipus d’adreça que ens pot retornar. - Algunes implementacions d’aquesta funció no són segures respecte als threads (thread safe). • Solució: - Es defineix la nova crida getipnodebyname().
Interfície d’obtenció d’adreces (II) #include <sys/socket.h> #include <netdb.h> struct hostent *getipnodebyname (const char *name, int af, int flags, int *error_num); • ‘name’ és el nom de la màquina o la direcció IP en octets, p.ex. “147.83.41.110” o “alabi.fib.upc.es” • ‘af’ és la família d’adreces, • ‘flags’ especifica el tipus d’adreces que busquem i que ens serà retornada i • ‘error_num’ ens dóna un codi dels possibles errors obtinguts.
Interfície d’obtenció d’adreces (III) • Possibles valors dels codis d’error: - HOST_NOT_FOUND - NO_ADDRESS - NO_RECOVERY - TRY_AGAIN • Valors possibles per als flags: - 0 - Amb AF_INET només retorna adreces amb format IPv4 - Amb AF_INET6 només retorna adreces amb format IPv6
Interfície d’obtenció d’adreces (IV) • Més flags: - AI_DEFAULT es considera la suma d’aquests dos flags: • AI_V4MAPPED: Amb AF_INET6 retorna adreces en format IPv6 o adreces d’IPv4 mapejades en format IPv6. • AI_ADDRCONFIG: S’ utilitza per buscar adreces amb els mateixos formats que disposa la màquina que fa la petició. - Amb la suma dels dos flags aconseguim obtenir qualsevol tipus d’adreça, ja sigui IPv4 o IPv6, mapejades en la familia especificada.
Interfície d’obtenció d’adreces (V) • Pels mateixos motius que abans també hem de definir una nova funció que substitueixi la crida gethostbyaddr(). #include <sys/socket.h> #include <netdb.h> struct hostent *getipnodebyaddr(const void *src, size_t len, int af, int *error_num); • Alliberant memòria: Les dues cridesanteriors demanen memòria dinàmica per tal de generar l’estructura hostent. S’ha d’alliberar utilitzant: #include <netdb.h> void freehostent (struct hostent *ptr);
Interfície de conversió d’adreces • Les funcions inet_addr() i inet_ntoa() nomès serveixen per a IPv4. Es defineixen dos funcions anàlogues compatibles amb els dos protocols. #include <sys/socket.h> #include <arpa/inet.h> int inet_pton (int af, const char *src, void *dst); const char *inet_ntop (int af, const void *src, char *dst, size_t size); • ‘inet_pton’ tradueix una adreça donada en format de text a la seva anàloga en format numèric binari. • ‘inet_ntop’ tradueix una adreça numèrica binària en una adreça llegible.
Interfície de conversió d’adreces (II) • En ambos casos, ‘src’ representa l’origen (allò que es vol traduïr) i ‘dst’ representa el resultat de la traducció. • En el cas d’ ‘inet_ntop’, el paràmetre ‘size’ especifica el tamany del buffer on guardarem el resultat. Per tal de facilitar la declaració d’aquest buffer, a<netinet/in.h>podem trobar: #define INET_ADDRSTRLEN 16 #define INET6_ADDRSTRLEN 46
Bibliografia • http://www.ietf.org/ The Internet Engineering Task Force (RFC Pages) • Basic Socket Interface Extensions for IPv6 RFC 2553 - March 1999 • Bibliografia adicional • Advanced Socket API for IPv6 RFC 2292 - February 1998