La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez.

Presentaciones similares


Presentación del tema: "José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez."— Transcripción de la presentación:

1 José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez.
Sockets a IPv6 José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez.

2 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.

3 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)

4 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)

5 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ó.

6 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().

7 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. “ ” 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.

8 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

9 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.

10 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 crides anteriors demanen memòria dinàmica per tal de generar l’estructura hostent. S’ha d’alliberar utilitzant: void freehostent (struct hostent *ptr);

11 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.

12 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

13 Bibliografia http://www.ietf.org/
The Internet Engineering Task Force (RFC Pages) Basic Socket Interface Extensions for IPv6 RFC March 1999 Bibliografia adicional Advanced Socket API for IPv6 RFC February 1998


Descargar ppt "José Ortiz Padilla José Núñez Martínez Antonio Moya Fdez."

Presentaciones similares


Anuncios Google