Ceci est une ancienne révision du document !


Version : 2022.02.

Dernière mise-à-jour : 2022/11/04 05:21

RES401 - Comprendre TCP Version 4

Contenu du Module

  • RES402 - Comprendre TCP Version 4
    • En-tête TCP
    • En-tête UDP
    • Fragmentation et Ré-encapsulation
    • Adressage
    • Masques de sous-réseaux
    • VLSM
    • Ports et sockets
    • /etc/services
    • Résolution d'adresses Ethernet

En-tête TCP

L'en-tête TCP est codée sur 4 octets soit 32 bits :

1er octet 2ème octet 3ème octet 4 ème octet
Port source Port destination
Numéro de séquence
Numéro d'acquittement
Offset Flags Fenêtre
Checksum Pointeur Urgent
Options Padding
Données

Vous noterez que les numéros de ports sont codés sur 16 bits. Cette information nous permet de calculer le nombres de ports maximum en IPv4, soit 216 ports ou 65 535.

L'Offset contient la taille de l'en-tête.

Les Flags sont :

  • URG - Si la valeur est 1 le pointeur urgent est utilisé. Le numéro de séquence et le pointeur urgent indique un octet spécifique.
  • ACK - Si la valeur est 1, le paquet est un accusé de réception
  • PSH - Si la valeur est 1, les données sont immédiatement présentées à l'application
  • RST - Si la valeur est 1, la communication comporte un problème et la connexion est réinitialisée
  • SYN - Si la valeur est 1, le paquet est un paquet de synchronisation
  • FIN - Si la valeur est 1, le paquet indique la fin de la connexion

La Fenêtre est codée sur 16 bits. La Fenêtre est une donnée liée au fonctionnement d'expédition de données appelé le sliding window ou la fenêtre glissante. Puisque il serait impossible, pour des raisons de performance, d'attendre l'accusé de réception de chaque paquet envoyé, l'expéditeur envoie des paquets par groupe. La taille de cette groupe s'appelle la Fenêtre. Dans le cas d'un problème de réception d'une partie de la Fenêtre, toute la Fenêtre est ré-expédiée.

Le Checksum est une façon de calculer si le paquet est complet.

Le Padding est un champ pouvant être rempli de valeurs nulles de façon à ce que la taille de l'en-tête soit un multiple de 32

En-tête UDP

L'en-tête UDP est codée sur 4 octets soit 32 bits :

1er octet 2ème octet 3ème octet 4 ème octet
Port source Port destination
longueur Checksum
Données

L'en-tête UDP a une longueur de 8 octets.

Fragmentation et Ré-encapsulation

La taille limite d'un paquet TCP, l'en-tête comprise, ne peut pas dépasser 65 535 octets. Cependant chaque réseau est qualifié par son MTU ( Maximum Tranfer Unit ). Cette valeur est la taille maximum d'un paquet autorisée. L'unité est en octets. Pour un réseau Ethernet sa valeur est de 1 500. Quand un paquet doit être expédié sur un réseau ayant un MTU inférieur à sa propre taille, le paquet doit être fractionné. A la sortie du réseau, le paquet est reconstitué. Cette reconstitution s'appelle ré-encapsulation.

Adressage

L'adressage IP requière que chaque périphérique sur le réseau possède une adresse IP unique de 4 octets, soit 32 bits au format XXX.XXX.XXX.XXX De cette façon le nombre total d'adresses est de 232 = 4.3 Milliards.

Les adresses IP sont divisées en 5 classes, de A à E. Les 4 octets des classes A à C sont divisés en deux, une partie qui s'appelle le Net ID qui identifie le réseau et une partie qui s'appelle le Host ID qui identifie le hôte :

1er octet 2ème octet 3ème octet 4 ème octet
A Net ID Host ID
B Net ID Host ID
C Net ID Host ID
D Multicast
E Réservé

L'attribution d'une classe dépend du nombre de hôtes à connecter. Chaque classe est identifié par un Class ID composé de 1 à 3 bits :

Classe Bits ID Classe Valeur ID Classe Bits ID Réseau Nb. de Réseaux Bits ID hôtes Nb. d'adresses Octet de Départ
A 1 0 7 27=128 24 224=16 777 216 1 - 126
B 2 10 14 214=16 834 16 216=65 535 128 - 191
C 3 110 21 221=2 097 152 8 28=256 192 - 223

Dans chaque classe, certaines adresses sont réservées pour un usage privé :

Classe IP de Départ IP de Fin
A 10.0.0.0 10.255.255.255
B 172.16.0.0 172.31.255.255
C 192.168.0.0 192.168.255.255

Il existe des adresses particulières ne pouvant pas être utilisées pour identifier un hôte :

Adresse Particulière Description
169.254.0.0 à 169.254.255.255 Automatic Private IP Addressing de Microsoft
Hôte du réseau courant Tous les bits du Net ID sont à 0
Adresse de réseau Tous les bits du Host ID sont à 0
Adresse de diffusion Tous les bits du Host ID sont à 1

L'adresse de réseau identifie le segment du réseau entier tandis que l'adresse de diffusion identifie tous les hôtes sur le segment de réseau.

Afin de mieux comprendre l'adresse de réseau et l'adresse de diffusion, prenons le cas de l'adresse 192.168.10.1 en classe C :

1er octet 2ème octet 3ème octet 4 ème octet
Net ID Host ID
Adresse IP 192 168 10 1
Binaire 11000000 10101000 000001010 00000001
Calcul de l'adresse de réseau
Binaire 11000000 10101000 000001010 00000000
Adresse réseau 192 168 10 0
Calcul de l'adresse de diffusion
Binaire 11000000 10101000 000001010 11111111
Adresse de diffusion 192 168 10 255

Masques de sous-réseaux

Tout comme l'adresse IP, le masque de sous-réseau compte 4 octets ou 32 bits. Les masques de sous-réseaux permettent d'identifer le Net ID et le Host ID :

Classe Masque Notation CIDR
A 255.0.0.0 /8
B 255.255.0.0 /16
C 255.255.255.0 /24

Le terme CIDR veut dire Classless InterDomain Routing. Le terme Notation CIDR correspond au nombre de bits d'une valeur de 1 dans le masque de sous-réseau.

Quand un hôte souhaite émettre il procède d'abord à l'identification de sa propre adresse réseau par un calcul AND (ET) appliqué à sa propre adresse et son masque de sous-réseau qui stipule :

  • 1 x 1 = 1
  • 0 x 1 = 0
  • 1 x 0 = 0
  • 0 x 0 = 0

Prenons le cas de l'adresse IP 192.168.10.1 ayant un masque de 255.255.255.0 :

1er octet 2ème octet 3ème octet 4 ème octet
Adresse IP 192 168 10 1
Binaire 11000000 10101000 00001010 00000001
Masque de sous-réseau
Binaire 11111111 11111111 11111111 00000000
Calcul AND 11000000 10101000 00001010 00000000
Adresse réseau 192 168 10 0

Cet hôte essaie de communiquer avec un hôte ayant une adresse IP de 192.168.10.10. Il procède donc au même calcul en appliquant son propre masque de sous-réseau à l'adresse IP de l'hôte destinataire :

1er octet 2ème octet 3ème octet 4 ème octet
Adresse IP 192 168 10 10
Binaire 11000000 10101000 00001010 00001010
Masque de sous-réseau
Binaire 11111111 11111111 11111111 00000000
Calcul AND 11000000 10101000 00001010 00000000
Adresse réseau 192 168 10 0

Puisque l'adresse réseau est identique dans les deux cas, l'hôte émetteur présume que l'hôte de destination se trouve sur son réseau et envoie les paquets directement sur le réseau sans s'adresser à sa passerelle par défaut.

L'hôte émetteur essaie maintenant de communiquer avec avec un hôte ayant une adresse IP de 192.168.2.1. Il procède donc au même calcul en appliquant son propre masque de sous-réseau à l'adresse IP de l'hôte destinataire :

1er octet 2ème octet 3ème octet 4 ème octet
Adresse IP 192 168 2 1
Binaire 11000000 10101000 00000010 00000001
Masque de sous-réseau
Binaire 11111111 11111111 11111111 00000000
Calcul AND 11000000 10101000 00000010 00000000
Adresse réseau 192 168 2 0

Dans ce cas, l'hôte émetteur constate que le réseau de destination 192.168.2.0 n'est pas identique à son propre réseau 192.168.10.0. Il adresse donc les paquets à la passerelle par défaut.

VLSM

Puisque le stock de réseaux disponibles sous IPv4 est presque épuisé, une solution a du être trouvée pour créer des sous-réseaux en attendant l'introduction de l'IPv6. Cette solution s'appelle le VLSM ou Variable Length Subnet Masks. Le VLSM exprime les masques de sous-réseaux au format CIDR.

Son principe est simple. Afin de créer des réseaux différents à partir d'une adresse réseau d'une classe donnée, il convient de réduire le nombre d'hôtes. De cette façon les bits 'libérés' du Host ID peuvent être utilisés pour identifier les sous-réseaux.

Pour illustrer ceci, prenons l'exemple d'un réseau 192.168.1.0. Sur ce réseau, nous pouvons mettre 28-2 soit 254 hôtes entre 192.168.1.1 au 192.168.1.254.

Supposons que nous souhaiterions diviser notre réseau en 2 sous-réseaux. Pour coder 2 sous-réseaux, il faut que l'on libère 2 bits du Host ID. Les deux bits libérés auront les valeurs binaires suivantes :

  • 00
  • 01
  • 10
  • 11

Les valeurs binaires du quatrième octet de nos adresses de sous-réseaux seront donc :

  • 192.168.1.00XXXXXX
  • 192.168.1.01XXXXXX
  • 192.168.1.10XXXXXX
  • 192.168.1.11XXXXXX

où les XXXXXX représentent les bits que nous réservons pour décrire les hôtes dans chacun des sous-réseaux.

Nous ne pouvons pas utiliser les deux sous-réseaux suivants :

  • 192.168.1.00XXXXXX
  • 192.168.1.11XXXXXX

car ceux-ci correspondent aux débuts de l'adresse réseau 192.168.1.0 et de l'adresse de diffusion 192.168.1.255.

Nous pouvons utiliser les deux sous-réseaux suivants :

  • 192.168.1.01XXXXXX
  • 192.168.1.10XXXXXX

Pour le premier sous-réseau l'adresse réseau et l'adresse de diffusion sont :

Sous-réseau #1 192 168 1 01XXXXXX
Calcul de l'adresse de réseau
Binaire 11000000 10101000 00000001 01000000
Adresse réseau 192 168 1 64
Calcul de l'adresse de diffusion
Binaire 11000000 10101000 00000001 01111111
Adresse de diffusion 192 168 1 127
  • L'adresse CIDR du réseau est donc 192.168.1.64/26 car le Net ID est codé sur 24+2 bits.
  • Le masque de sous-réseau est donc le 11111111.11111111.11111111.11000000 ou le 255.255.255.192
  • Nous pouvons avoir 26-2 soit 62 hôtes.
  • La plage valide d'adresses IP est de 192.168.1.65 à 192.168.1.126

Pour le deuxième sous-réseau l'adresse réseau et l'adresse de diffusion sont :

Sous-réseau #2 192 168 1 10XXXXXX
Calcul de l'adresse de réseau
Binaire 11000000 10101000 00000001 10000000
Adresse réseau 192 168 1 128
Calcul de l'adresse de diffusion
Binaire 11000000 10101000 00000001 10111111
Adresse de diffusion 192 168 1 191
  • L'adresse CIDR du réseau est donc 192.168.1.128/26 car le Net ID est codé sur 24+2 bits.
  • Le masque de sous-réseau est donc le 11111111.11111111.11111111.11000000 ou le 255.255.255.192
  • Nous pouvons avoir 26-2 soit 62 hôtes.
  • La plage valide d'adresses IP est de 192.168.1.129 à 192.168.1.190

La valeur qui sépare les sous-réseaux est 64. Cette valeur comporte le nom incrément.

Ports et sockets

Afin que les données arrivent aux applications que les attendent, TCP utilise des numéros de ports sur la couche transport. Le numéros de ports sont divisés en trois groupes :

  • Well Known Ports
    • De 1 à 1023
  • Registered Ports
    • De 1024 à 49151
  • Dynamic et/ou Private Ports
    • De 49152 à 65535

Le couple numéro IP:numéro de port s'appelle un socket.

/etc/services

Les ports les plus utilisés sont détaillés dans le fichier /etc/services :

trainee@debian8:~$ su -
Password: 
root@debian8:~# more /etc/services
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, officially ports have two entries
# even if the protocol doesn't support UDP operations.
#
# Updated from http://www.iana.org/assignments/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.

tcpmux		1/tcp				# TCP port service multiplexer
echo		7/tcp
echo		7/udp
discard		9/tcp		sink null
discard		9/udp		sink null
systat		11/tcp		users
daytime		13/tcp
daytime		13/udp
netstat		15/tcp
qotd		17/tcp		quote
msp		18/tcp				# message send protocol
msp		18/udp
chargen		19/tcp		ttytst source
chargen		19/udp		ttytst source
ftp-data	20/tcp
ftp		21/tcp
fsp		21/udp		fspd
ssh		22/tcp				# SSH Remote Login Protocol
ssh		22/udp
telnet		23/tcp
smtp		25/tcp		mail
time		37/tcp		timserver
time		37/udp		timserver
rlp		39/udp		resource	# resource location
nameserver	42/tcp		name		# IEN 116
--More--(6%)

Notez que les ports sont listés par deux :

  • le port TCP
  • le port UDP

La liste la plus complète peut être consultée à l'adresse suivante https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml.

Pour connaitre la liste des sockets ouverts sur l'ordinateur, saisissez la commande suivante :

root@debian8:~# netstat -an | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:42370         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:15023         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:41012           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:7127          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:33220         127.0.0.1:50656         ESTABLISHED
tcp        0      0 10.0.2.15:22            10.0.2.2:46432          ESTABLISHED
tcp        0      0 127.0.0.1:50656         127.0.0.1:33220         ESTABLISHED
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 :::33476                :::*                    LISTEN     
tcp6       0      0 ::1:15023               :::*                    LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:22                  ::1:39236               ESTABLISHED
tcp6       0      0 ::1:39236               ::1:22                  ESTABLISHED
udp        0      0 0.0.0.0:32899           0.0.0.0:*                          
udp        0      0 0.0.0.0:995             0.0.0.0:*                          
udp        0      0 0.0.0.0:52452           0.0.0.0:*                          
udp        0      0 0.0.0.0:5353            0.0.0.0:*                          
udp        0      0 0.0.0.0:68              0.0.0.0:*                          
udp        0      0 127.0.0.1:613           0.0.0.0:*                          
udp        0      0 0.0.0.0:111             0.0.0.0:*                          
udp        0      0 0.0.0.0:53110           0.0.0.0:*                          
udp6       0      0 :::17599                :::*                               
udp6       0      0 :::995                  :::*                               
udp6       0      0 :::5353                 :::*                               
udp6       0      0 :::33524                :::*                               
udp6       0      0 :::40492                :::*                               
udp6       0      0 :::111                  :::*                               
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     17625    /tmp//.java_pid1791
--More--

Pour connaitre la liste des applications ayant ouvert un port sur l'ordinateur, saisissez la commande suivante :

root@debian8:~# netstat -anp | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      868/exim4       
tcp        0      0 127.0.0.1:42370         0.0.0.0:*               LISTEN      1791/Remote Access
tcp        0      0 127.0.0.1:15023         0.0.0.0:*               LISTEN      2449/ssh        
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      396/rpcbind     
tcp        0      0 0.0.0.0:41012           0.0.0.0:*               LISTEN      434/rpc.statd   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      471/sshd        
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN      4041/inetd      
tcp        0      0 127.0.0.1:7127          0.0.0.0:*               LISTEN      1791/Remote Access
tcp        0      0 127.0.0.1:33220         127.0.0.1:50656         ESTABLISHED 1879/Remote Access 
tcp        0      0 10.0.2.15:22            10.0.2.2:46432          ESTABLISHED 10584/sshd: trainee
tcp        0      0 127.0.0.1:50656         127.0.0.1:33220         ESTABLISHED 1791/Remote Access
tcp6       0      0 ::1:25                  :::*                    LISTEN      868/exim4       
tcp6       0      0 :::33476                :::*                    LISTEN      434/rpc.statd   
tcp6       0      0 ::1:15023               :::*                    LISTEN      2449/ssh        
tcp6       0      0 :::111                  :::*                    LISTEN      396/rpcbind     
tcp6       0      0 :::22                   :::*                    LISTEN      471/sshd        
tcp6       0      0 ::1:22                  ::1:39236               ESTABLISHED 2415/sshd: trainee 
tcp6       0      0 ::1:39236               ::1:22                  ESTABLISHED 2449/ssh        
udp        0      0 0.0.0.0:32899           0.0.0.0:*                           419/dhclient    
udp        0      0 0.0.0.0:995             0.0.0.0:*                           396/rpcbind     
udp        0      0 0.0.0.0:52452           0.0.0.0:*                           482/avahi-daemon: r
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           482/avahi-daemon: r
udp        0      0 0.0.0.0:68              0.0.0.0:*                           419/dhclient    
udp        0      0 127.0.0.1:613           0.0.0.0:*                           434/rpc.statd   
udp        0      0 0.0.0.0:111             0.0.0.0:*                           396/rpcbind     
udp        0      0 0.0.0.0:53110           0.0.0.0:*                           434/rpc.statd   
udp6       0      0 :::17599                :::*                                419/dhclient    
udp6       0      0 :::995                  :::*                                396/rpcbind     
udp6       0      0 :::5353                 :::*                                482/avahi-daemon: r
udp6       0      0 :::33524                :::*                                482/avahi-daemon: r
udp6       0      0 :::40492                :::*                                434/rpc.statd   
udp6       0      0 :::111                  :::*                                396/rpcbind     
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     17625    1791/Remote Access  /tmp//.java_pid1791
--More--

Résolution d'adresses Ethernet

Chaque protocole peut être encapsulé dans une trame Ethernet. Lorsque la trame doit être transportée de l'expéditeur au destinataire, ce premier doit connaitre l'adresse Ethernet du dernier. L'adresse Ethernet est aussi appelée l'adresse Physique ou l'adresse MAC.

Pour connaître l'adresse Ethernet du destinataire, l'expéditeur fait appel au protocol ARP. Les informations reçues sont stockées dans une table. Pour visualiser ces informations, il convient d'utiliser la commande suivante :

root@debian8:~# arp -a
? (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0
? (10.0.2.3) at 52:54:00:12:35:03 [ether] on eth0

Les options de cette commande sont :

root@debian8:~# arp --help
Usage:
  arp [-vn]  [<HW>] [-i <if>] [-a] [<hostname>]             <-Display ARP cache
  arp [-v]          [-i <if>] -d  <host> [pub]               <-Delete ARP entry
  arp [-vnD] [<HW>] [-i <if>] -f  [<filename>]            <-Add entry from file
  arp [-v]   [<HW>] [-i <if>] -s  <host> <hwaddr> [temp]            <-Add entry
  arp [-v]   [<HW>] [-i <if>] -Ds <host> <if> [netmask <nm>] pub          <-''-

        -a                       display (all) hosts in alternative (BSD) style
        -s, --set                set a new ARP entry
        -d, --delete             delete a specified entry
        -v, --verbose            be verbose
        -n, --numeric            don't resolve names
        -i, --device             specify network interface (e.g. eth0)
        -D, --use-device         read <hwaddr> from given device
        -A, -p, --protocol       specify protocol family
        -f, --file               read new entries from file or from /etc/ethers

  <HW>=Use '-H <hw>' to specify hardware address type. Default: ether
  List of possible hardware types (which support ARP):
    ash (Ash) ether (Ethernet) ax25 (AMPR AX.25) 
    netrom (AMPR NET/ROM) rose (AMPR ROSE) arcnet (ARCnet) 
    dlci (Frame Relay DLCI) fddi (Fiber Distributed Data Interface) hippi (HIPPI) 
    irda (IrLAP) x25 (generic X.25) eui64 (Generic EUI-64) 

Copyright © 2022 Hugh Norris

Menu