# IP

## Généralités

IP (Internet Protocol) est le protocole principal de communication sur l'internet, actuellement deux versions sont en cours d'utilisation : IPv4 et IPv6.

IP permet de transmettre des datagrammes d'un point à un autre.

### Adressage

Les adresses IP sont alloués avec la méthode du CIDR (Classless Inter-Domain Routing). Cette méthode consiste à noter une adresse au format `adresse/longueur_préfixe`, elle induit une attribution des IP par blocs.

Les `n` bits (où `n` est la longueur du préfixe) les plus significatifs servent à identifier le réseau auquel l'adresse appartient.

## IPv4

Une adresse IPv4 s'écrit sur 32 bits et utilise une notation décimale pointée (4 entiers séparés par des `.`), par exemple `192.168.0.1` est une adresse IPv4.

De même `192.168.0.0/24` est un exemple de notation CIDR pour un sous-réseau IPv4.

Dans un réseau local les adresses IPv4 peuvent être attribuées par le protocole DHCP ou configurées statiquement.

À noter que dans un sous-réseau IPv4 la première et la dernière sont réservées respectivement pour identifier le réseau et effectuer du broadcast : par exemple pour le bloc `192.168.0.0/24`, l'adresse `192.168.0.0` est réservée et l'adresse `192.168.0.255` est l'adresse de broadcast.

Cette restriction peut être contournée sous Linux, par exemple sous [Debian](/tools/debian.md) on peut modifier l'interface comme ceci :
```
iface eth0 inet static
    broadcast -
```

Ceci permet d'utiliser des blocs d'adresses IPv4 d'une taille de préfixe égale à 31 afin d'interconnecter deux machines.

### IPv4 privées

Certains blocs d'adresses IPv4 sont réservés à des utilisations privées, celà signifie qu'ils ne sont pas annoncés sur l'internet. Ils sont spécifiés par la [RFC 1918](https://tools.ietf.org/html/rfc1918) et sont les suivants :
 * `10.0.0.0/8`
 * `172.16.0.0/12`
 * `192.168.0.0/16`

### IPv4 de lien local

Un bloc d'IPv4 est réservé pour utilisation sur le réseau local, c'est à dire que ce bloc n'est normalement jamais routé, il s'agit du bloc `169.254.0.0/16`.

### IPv4 multicast

un bloc d'IPv4 est réservé pour du multicast, il s'agit du bloc `224.0.0.0/4`.

## IPv6

Une adresse IPv6 s'écrit sur 128 bits et utilise une notation hexadécimale séparée par des `:` (deux-points), par exemple `2001:0db8:0000:0000:0000:0000:0000:0000` (on regroupe les octets par groupe de 2).

Il existe également une notation compacte pour les adresses IPv6 : on peut omettre les 0 en début de bloc et remplacer la plus longue suite de blocs nuls par `::`, par exemple l'adresse précédente peut s'écrire `2001:db8::`.

Ainsi `2001:db8::/32` est un exemple de notation CIDR pour un sous-réseau IPv6.

Dans un réseau local les adresses IPv6 peuvent être attribuées par le protocole NDP, par le protocole DHCPv6 ou configurées statiquement.

La liste des IPv6 attribuées est disponible [ici](https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml) et [là](https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml).

Il n'y a pas de broadcast en IPv6 et la première adresse du bloc peut être utilisée sans risque. Le broadcast est remplacé par du multicast : tous les nœuds sur le réseau local répondent sur l'adresse `ff02::1`.

### IPv6 uniques locales

Un bloc d'adresses IPv6 est réservé pour des utilisations privées, c'est l'équivalent des blocs d'IPv4 privées. Il s'agit du bloc `fc00::/7`

### IPv6 de lien local

Un bloc d'IPv6 est réservé pour utilisation sur le réseau local, il s'agit du bloc `fe80::/10`.

### IPv6 multicast

Un bloc d'IPv6 est réservé pour du multicast, il s'agit du bloc `ff00::/8`.

## ip

Sous Linux la commande privilégiée pour consulter l'état de la configuration réseau est `ip` (fournie par la suite `iproute2`) voici quelques exemples de commandes :

Afficher l'état des interfaces de la machine (adresses IP attribuées et leur sous-réseau) :
```bash
ip address
```

Afficher l'état des routes IPv4 de la machine :
```bash
ip route
```

Afficher l'état des routes IPv6 de la machine :
```bash
ip -6 route
```