> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/reseau/les-bases.md).

# Les bases

## Adresse IP

Un protocole est une règle stricte de communication.

IP = Internet Protocol&#x20;

La machine doit avoir une adresse IP (4 nombres entre 0 et 255 séparés par des points)

*Exemples:*

* 0.0.0.0
* 1.2.3.4
* 255.255.255.255
* 15.21.84.121

**Toute machine au sein d'un réseau doit avoir une adresse IP pour communiquer avec ce protocole. L'adresse identifie la machine de façon unique sur ce réseau.**

{% hint style="success" %}
Connaitre son IP sur Linux:

```
ifconfig
```

Sur Windows:

```powershell
ipconfig
```

{% endhint %}

Ici on a 3 interfaces réseaux:

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2F288gtiHLR1mhtoPlQD1N%2Finterfaces-reseau.png?alt=media&amp;token=3d8a989e-fea7-4229-bbac-e54a6df30aa2" alt="" width="563"><figcaption><p>Interfaces réseau</p></figcaption></figure>

* **eth0**: ethernet (RJ45)
* **lo**: boucle locale de test (localhost)
* **wlan0**: wireless lan (connexion sans file)

Si plusieurs cartes réseaux filaires sont présentes on aura alors eth0, eth1, eth2...

On voit les adresses IP dans le champ **inet adr**. **Pour localhost (lo) l'IP est TOUJOURS 127.0.0.1**.&#x20;

Ici la carte wifi est connectée avec l'adresse **192.168.1.38**.

## Masque

Le masque de sous réseau sert à identifier dans une adresse IP la partie représentant le réseau et celle représentant le numéro de l'hôte.

{% hint style="info" %}
Les 255 et les 0 ne doivent pas être alternés et le masque doit commencer par 255

* 0.0.255.255 non valide
* 255.0.255.0 non valide
* 255.255.255.0 valide
* 255.0.0.0 valide
  {% endhint %}

Pour un réseau local, le masque le plus répandu est **255.255.255.0**

| 192 | 168 |  1  |  2  |
| :-: | :-: | :-: | :-: |
| 255 | 255 | 255 |  0  |

* **192.168.1**: nom du sous réseau&#x20;
* **0**: identifiant de l'hôte (1 pour le routeur, 2 pour la 2e machine à se connecter, etc.)

{% hint style="info" %}
**Pourquoi faire cette séparation?**

* 2 machines ne peuvent communiquer que si elles sont sur le même sous réseau
* le masque permet de savoir si c'est le cas

*Exemple:* Ces deux machines sont sur le même sous réseau

* 87.106.1.56
* 87.106.1.122
  {% endhint %}

## Ping

Un ping est un morceau d'information envoyé sur le réseau vers la destination donnée. Si la machine distante reçoit le message elle répond. (ping/pong) Permet de savoir si une adresse est joignable sur le réseau.

*Exemple:*

```
ping 192.168.1.1   # ping le routeur
ping 127.0.0.1     # se ping soi-même
```

{% hint style="info" %}
Certaines machines sont programmées pour ne pas répondre aux ping
{% endhint %}

## DNS (Domain name system)

Fait le lien entre les noms de domaines et les adresses IP.

*Exemple:*

```
ping google.fr    # ping google
ping localhost    # se ping soi-même
```

Ici ça fonctionne sans donner d'adresse IP car le DNS fait le lien entre les 2.

```
google.fr → DNS → 74.125.230.216
localhost → DNS → 127.0.0.1
```

{% hint style="info" %}
Un nom de domaine peut pointer vers plusieurs adresses IP. Par exemple google utilise plusieurs serveurs et a donc plusieurs adresses IP rattachées à leur nom de domaine.
{% endhint %}

## Routeur

Le routeur fait la transition entre le réseau local et le réseau internet. Toutes les informations à destinations d'internet passent par le routeur. Celui-ci doit avoir 2 adresses IP différentes (une pour chaque réseau).

**L'adresse IP qu'on utilise sur internet est en réalité celle du routeur, c'est la même pour toutes les machines connectées sur le sous réseau.**

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FNv78tsuRDsFQTRcMINXk%2Freseau.svg?alt=media&amp;token=1d930b07-d20c-4195-ace4-3c5eb83044e8" alt="" width="563"><figcaption><p>Fonctionnement du routeur</p></figcaption></figure>

## Port

Un port est une "porte d'accès" à un interlocuteur spécifique sur une machine. On le note à la suite d'une adresse IP avec **":"**.

```
192.168.1.38:500    # port 500
```

{% hint style="info" %}
*Exemple: Application web avec un chat*

CHAT ==> 192.168.1.38:25000 <------> IPPERSONNE:25000&#x20;

WEB ==> 192.168.1.38:25001 <------> IPSITEWEB:80
{% endhint %}

Pour voir les ports ouverts sur une machine:

```
netstat -4ant
```

## Adresse MAC (Media Access Control)

Une adresse IP est stockée sur 4 octets soit 32 bits.

L'adresse IP est en réalité un intermédiaire vers une autre adresse: **l'adresse MAC**. L'adresse IP est une **adresse logique** et l'adresse mac est une **adresse physique**.

**0a:1b:2c:3d:4e:5f** est une **adresse MAC**. Elle est composée de 6 octets et chacun est séparé par ":". L'adresse MAC maximale est **ff:ff:ff:ff:ff:ff**. Sans adresse MAC les communications sont impossibles.

Le lien entre IP et MAC se fait avec le protocole ARP.

## Protocole ARP (Address Resolution Protocol)

Pour voir l'adresse MAC d'une interface réseau:

```
ifconfig
```

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FrHCAwtGpgHcqKbW5PQDp%2FPasted%20image%2020231023074624.png?alt=media&amp;token=a096082e-6b7e-4c35-8ed7-d812e48f44b0" alt=""><figcaption></figcaption></figure>

L'ordinateur possède une **table ARP** qui fait le lien entre IP et MAC.

```bash
arp -n
```

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FEFT7wXLRxX4MY1KsoCdh%2FPasted%20image%2020231023074821.png?alt=media&amp;token=18e2fd6d-f8f5-423e-9e1c-827b826e0274" alt=""><figcaption></figcaption></figure>

**Mais si l'adresse MAC de la machine distante que je veux contacter n'est pas dans ma table ARP, comment puis-je lui demander son adresse MAC ?**

\==> Il existe une adresse MAC particulière: ff:ff:ff:ff:ff:ff (broadcast) qui transmet un message à toutes les machines sur le réseau.

{% hint style="info" %}
*Exemple: la machine 1 veut récupérer l'adresse MAC de la machine 2* 1 connait l'adresse IP de 2 "192.168.1.35" mais a besoin de son adresse MAC pour communiquer.

1 --> aa:aa:aa:aa:aa:aa&#x20;

2 --> bb:bb:bb:bb:bb:bb

ARP REQUEST: "aa:aa:aa:aa:aa:aa" --> "ff:ff:ff:ff:ff:ff" ("à qui est l'IP 192.168.1.35 ?"")&#x20;

ARP REPLY: "bb:bb:bb:bb:bb:bb" --> "aa:aa:aa:aa:aa:aa" ("2 répond c'est moi !")

L'adresse MAC de 2 est ajoutée à la table ARP de 1.

3 --> "cc:cc:cc:cc:cc:cc" reçoit le message mais comme ce n'est pas son IP elle ne répond pas
{% endhint %}

Dans la table ARP il y a des entrées dynamiques (qui disparaissent après quelques minutes) et statiques qui restent (pour les machines qui communiquent constamment).

## DHCP (Dynamic Host Configuration Protocol)

On a vu que pour une adresse IP 192.168.1.22 le nom du réseau est 192.168.1 et l'hôte (ou le client) est 22. Mais pourquoi 22 ?

C'est le rôle du protocole DHCP.

Client DHCP (mon téléphone, mon ordinateur...) Serveur DHCP (routeur)

Quand une adresse MAC demande une adresse IP, le serveur DHCP lui en attribut une. Si cette adresse MAC en redemande une plus tard il lui redonnera la même adresse IP.

#### Passerelle/Gateway

Une passerelle (ou route/gateway) permet de faire le lien entre 2 réseaux.

{% hint style="success" %}
*Exemple: le routeur est la passerelle par défaut*
{% endhint %}

**DHCP:**

* donne une adresse IP (+ masque 255.255.255.0)
* défini une passerelle par défaut
* défini un serveur DNS

{% hint style="success" %}
Demander une IP par DHCP sur Linux:

```
sudo dhclient
```

{% endhint %}

## TCP (Transmission Control Protocol)

Une session TCP fonctionne en trois phases :

* l'établissement de la connexion (SYN, SYN/ACK, ACK)
* les transferts de données
* la fin de la connexion (FIN, FIN/ACK, ACK)

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FmvRHJ8NinnLYuj0HMsYa%2FPasted%20image%2020240107225025.png?alt=media&amp;token=cfdfbed4-9ff0-411a-aeed-b720a30f3079" alt="" width="563"><figcaption><p>TCP handshake</p></figcaption></figure>

L'établissement de la connexion se fait par un [handshaking en trois temps](https://fr.wikipedia.org/wiki/Three-way_handshake). La rupture de connexion, elle, utilise un [handshaking](https://fr.wikipedia.org/wiki/Handshaking) en quatre temps. Pendant la phase d'établissement de la connexion, des paramètres comme le numéro de séquence sont initialisés afin d'assurer la transmission fiable (sans perte et dans l'ordre) des données.

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FbZVPQ3Nweq87oBdSIxVu%2FPasted%20image%2020240107225112.png?alt=media&amp;token=d95e96a5-f564-4ada-83eb-c4546806fbf8" alt="" width="563"><figcaption></figcaption></figure>

## UDP (User Datagram Protocol)

Protocole **très simple** qui envoie des paquets sur le réseau sans se soucier des pertes.
