CONCEPTES AVANÇATS DE SISTEMES OPERATIUS Departament d’Arquitectura de Computadors
(Seminaris de CASO)
Autors
Sockets a IPv6
José Ortiz Padilla
José Núñez Martínez
Antonio Moya Fdez.
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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.
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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 lesde 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)
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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)
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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ó.
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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().
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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. “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.
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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.
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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:#include <netdb.h>
void freehostent (struct hostent *ptr);
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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.
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
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
Seminaris de CONCEPTES AVANÇATS DE SISTEMES OPERATIUS
Departament. d’Arquitectura de Computadors - UPC
13
Bibliografia
http://www.ietf.org/The Internet Engineering Task Force (RFC Pages)
Basic Socket Interface Extensions for IPv6RFC 2553 - March 1999
Bibliografia adicional Advanced Socket API for IPv6
RFC 2292 - February 1998
Top Related