image/svg+xml $ $ ing$ ing$ ces$ ces$ Res Res ea ea Res->ea ou ou Res->ou r r ea->r ch ch ea->ch r->ces$ r->ch ch->$ ch->ing$ T T T->ea ou->r

Quelques généralités sur IPv4 et IPv6

Deux protocoles IP (Internet Protocol) co-existants sur le net

IPv4

IPv6

Les adresses IPv4 et IPv6 sont attribuées par l'Internet Assigned Numbers Authority (IANA)

Les blocs d'adresses IPv4

5 classes d'adresses historiques publiquement adressables (à partir des 4 bits de poids fort du premier octet) avec quelques plages exceptionnelles :

Remarque : en pratique, notions de classe obsolète (supplanté par CIDR)

Les adresses IPv6 RFC 2373

Quelques plages d'adresses unicast IPv6 spéciales

Les adresses IP avec l'API java.net

java.net.InetAddress : une adresse IP en Java

Quelle est donc cette adresse mystérieuse ?

public static void d(String s) { System.out.println(s); }
	
public static void displayAddressInfo(byte[] addr)
{
	// D'abord on récupère un objet InetAddress
	InetAddress ia = InetAddress.getByAddress(addr);
	// On affiche l'adresse sous forme textuelle
	d("Adresse texte: " + ia.getHostAddress());
	// On rappelle l'adresse octale	
	d("Adresse octale: " + Arrays.toString(ia.getAddress()));
	// Ensuite on affiche les informations associées
	d("Adresse joker ? " + ia.isAnyLocalAddress());
	d("Adresse de lien local ? " + ia.isLinkLocalAddress());
	d("Adresse de boucle locale ? " + ia.isLoopbackAddress());
	d("Adresse de réseau privé ? " + ia.isSiteLocalAddress());
	d("Adresse de multicast ? " + ia.isMulticastAddress());
	if (ia.isMulticastAddress())
	{
		// Testons la portée du multicast
		d("Portée globale ? " + ia.isMCGlobal());
		d("Portée organisationnelle ? " + ia.isMCOrgLocal());
		d("Portée site ? " + ia.isMCSiteLocal());
		d("Portée lien ? " + ia.isMCLinkLocal());
		d("Portée noeud ? " + ia.isMCNodeLocal());
	}
}

Conversion d'une adresse IPv4 octale en texte

Méthode paresseuse

public String convert(byte[] addr) throws UnknownHostException
{
	return InetAddress.getByAddress(addr).getHostAddress();
}

Méthode plus laborieuse

public int toUnsigned(byte b) { return (int)b & 0xff; }
public String convert(byte[] addr) throws UnknownHostException
{
	return String.format("%d.%d.%d.%d", 
		toUnsigned(addr[0]), toUnsigned(addr[1]), 
		toUnsigned(addr[2]), toUnsigned(addr[3]));
}

Conversion d'une adresse IPv4 texte en octale

Méthode paresseuse

public byte[] convert(String textAddr) throws UnknownHostException
{
	return InetAddress.getByName(textAddr).getAddress();
}

Méthode plus laborieuse

public byte[] convert(String textAddr)
{
	String[] split = textAddr.split("\\.");
	byte[] addr = new byte[split.length];
	for (int i = 0; i < addr.length; i++)
		addr[i] = (byte)Integer.parseInt(split[i]);
	return addr;
}

Test de connectivité d'une adresse IP

La méthode boolean isReachable(int timeout) throws IOException d'une instance d'InetAddress permet de tester la connectivité de l'adresse.

Comment ça marche ?

Cas de réponses négatives

La résolution de noms

Domain Name System (DNS)

Enregistrements DNS

Couples de clé/valeur pour une ressource sur un serveur DNS :

Résolution de nom

Utilisation d'InetAddress

Adresse IP depuis un nom

Une exception UnknownHostException est levée en cas de problème (nom d'hôte non résolvable).

Méthode utiles d'InetAddress :

Implantation d'un résolveur DNS en Java

public static void main(String[] args) throws UnknownHostException
{
	if (args.length < 1) 
		throw new IndexOutOfBoundsException("A domain must be provided");
	String name = args[0];
	InetAddress[] addrs = InetAddress.getAllByName(name);
	for (InetAddress addr: addrs)
		System.out.println(addr.getHostAddress());
}