Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédente | |||
999-archives:140-pppoe:070_mtu_mss_etc [le 20/06/2025 à 14:47] – supprimée - modification externe (Date inconnue) 127.0.0.1 | 999-archives:140-pppoe:070_mtu_mss_etc [le 20/06/2025 à 14:47] (Version actuelle) – ↷ Page déplacée de 140pppoe:070_mtu_mss_etc à 999-archives:140-pppoe:070_mtu_mss_etc prof | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== MTU, MSS etc. ====== | ||
+ | |||
+ | |||
+ | ===== Coupons les cheveux en quatre ===== | ||
+ | |||
+ | PPPoE présente un inconvénient considérable, | ||
+ | |||
+ | Sans précautions particulières, | ||
+ | |||
+ | ==== Circulation des données ==== | ||
+ | |||
+ | Une fois encore, nous devrons nous reporter au modèle OSI ou DOD. Rappelez-vous qu' | ||
+ | |||
+ | Le problème va venir ici de la couche supplémentaire introduite par PPPoE. Celle-ci ajoute 8 octets supplémentaires, | ||
+ | |||
+ | ==== L'IP facile sur Ethernet ==== | ||
+ | |||
+ | Nous le savons, IP est fait pour être transporté par Ethernet. L' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Comme nous le voyons sur l' | ||
+ | |||
+ | ==== PPPoE, l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Que se passe-t-il lorsque PPPoE s' | ||
+ | |||
+ | * PPPoE | ||
+ | * 1 octet pour la version + le type | ||
+ | * 1 octet de code ([[http:// | ||
+ | * 2 octets pour l' | ||
+ | * 2 octets pour la longueur des données transportées (payload) | ||
+ | * PPP ajoute à ça 2 octets pour indiquer le protocole qu'il transporte | ||
+ | |||
+ | Si l'on part du principe que la trame Ethernet ne peut dépasser 1518 octets (si vous préférez, que la taille maximum du payload Ethernet ne doit pas dépasser 1500 octets), ça veut dire que la trame IP « utile » doit être réduite à 1492 octets. | ||
+ | |||
+ | === Compliqué ? === | ||
+ | |||
+ | Lorsque les données arrivent sur la couche IP, il se passe le phénomène suivant. IP ne sait pas qu'en dessous de lui il y a PPP et non Ethernet. IP va donc considérer que sa longueur de trame peut atteindre 1500 octets (Maximum Transfert Unit), puisque normalement Ethernet sait transporter un volume de données de cette taille. | ||
+ | |||
+ | Le MTU est fixé, en principe, selon la nature du réseau situé en dessous de IP. | ||
+ | |||
+ | * Lorsque c'est de l' | ||
+ | * Lorsque c'est PPPoE, le MTU doit donc tomber à 1492. | ||
+ | * (Sur du token ring à 16 Mbps, IBM utilise un MTU pourrait aller jusqu' | ||
+ | |||
+ | Normalement, | ||
+ | |||
+ | === Mais où est le problème ? === | ||
+ | |||
+ | Dans une configuration comme celle qui suit. Forcément, quelque part, il va y avoir des configurations comme celle-ci, un routeur avec de l'IP sur Ethernet d'un côté et de l'IP sur PPP sur Ethernet de l' | ||
+ | |||
+ | Ce paquet, cerclé de rouge, ne doit pas dépasser 1500 octets, à cause des limites d' | ||
+ | |||
+ | Si, sur l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Dans ce cas, plusieurs éventualités apparaissent. | ||
+ | |||
+ | * Le paquet est fragmenté. En gros, il rentre une seule trame, il en ressort deux.\\ | ||
+ | * Le réseau va véhiculer deux fois plus de trames | ||
+ | * Il faudra réassembler les fragments à la réception. | ||
+ | * Le paquet est éliminé. Il peut alors se passer deux choses. | ||
+ | * Un signal ICMP est renvoyé à l' | ||
+ | * Aucun signal ICMP n'est renvoyé à l' | ||
+ | |||
+ | Finalement, dans un cas concret : | ||
+ | |||
+ | * Vous envoyez une requête à un serveur HTTP (ou FTP). Votre requête arrive jusqu' | ||
+ | * Le serveur vous renvoie les données. Ces données sont volumineuses et les datagrammes vont probablement atteindre 1500 octets.\\ | ||
+ | |||
+ | Et voilà le (sale) travail... | ||
+ | |||
+ | Ce problème peut également apparaître chez vous, si vous partagez votre connexion sur un réseau privé. Votre routeur, quel qu'il soit, sera confronté au même inconvénient. Vous risquez de devoir modifier le MTU de tous les hôtes de votre réseau privé. Nous verrons que si la passerelle est sous Linux et utilise rp-pppoe, le problème pourra être contourné. | ||
+ | |||
+ | ==== Comment résoudre le problème en amont ==== | ||
+ | |||
+ | Grâce à MSS (Maximum Segment Size). | ||
+ | |||
+ | Nous sommes ici au niveau TCP. TCP prépare les paquets de données à envoyer à IP. En agissant sur la taille de ces paquets, on peut éviter les problèmes au niveau du MTU. | ||
+ | |||
+ | Comme l'on sait que les couches inférieures vont ajouter jusqu' | ||
+ | |||
+ | < | ||
+ | Frame 1 (62 bytes on wire, 62 bytes captured) | ||
+ | Arrival Time: Jul 15, 2004 14: | ||
+ | Time delta from previous packet: 0.000000000 seconds | ||
+ | Time since reference or first frame: 0.000000000 seconds | ||
+ | Frame Number: 1 | ||
+ | Packet Length: 62 bytes | ||
+ | Capture Length: 62 bytes | ||
+ | Ethernet II, Src: 00: | ||
+ | Destination: | ||
+ | Source: 00: | ||
+ | Type: IP (0x0800) | ||
+ | Internet Protocol, Src Addr: 192.168.0.10 (192.168.0.10), | ||
+ | Version: 4 | ||
+ | Header length: 20 bytes | ||
+ | Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) | ||
+ | 0000 00.. = Differentiated Services Codepoint: Default (0x00) | ||
+ | .... ..0. = ECN-Capable Transport (ECT): 0 | ||
+ | .... ...0 = ECN-CE: 0 | ||
+ | Total Length: 48 | ||
+ | Identification: | ||
+ | Flags: 0x04 (Don't Fragment) | ||
+ | 0... = Reserved bit: Not set | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | ### le MTU, si tout se passe bien au niveau d' | ||
+ | ..0. = More fragments: Not set | ||
+ | Fragment offset: 0 | ||
+ | Time to live: 128 | ||
+ | Protocol: TCP (0x06) | ||
+ | Header checksum: 0x8de6 (correct) | ||
+ | Source: 192.168.0.10 (192.168.0.10) | ||
+ | Destination: | ||
+ | Transmission Control Protocol, Src Port: kpop (1109), Dst Port: ftp (21), Seq: 1814706075, Ack: 0, Len: 0 | ||
+ | Source port: kpop (1109) | ||
+ | Destination port: ftp (21) | ||
+ | Sequence number: 1814706075 | ||
+ | Header length: 28 bytes | ||
+ | Flags: 0x0002 (SYN) | ||
+ | 0... .... = Congestion Window Reduced (CWR): Not set | ||
+ | .0.. .... = ECN-Echo: Not set | ||
+ | ..0. .... = Urgent: Not set | ||
+ | ...0 .... = Acknowledgment: | ||
+ | .... 0... = Push: Not set | ||
+ | .... .0.. = Reset: Not set | ||
+ | <span class=" | ||
+ | .... ...0 = Fin: Not set | ||
+ | Window size: 16384 | ||
+ | Checksum: 0xa0e8 (correct) | ||
+ | Options: (8 bytes) | ||
+ | <span class=" | ||
+ | NOP | ||
+ | NOP | ||
+ | SACK permitted | ||
+ | </ | ||
+ | |||
+ | Et le serveur répond : | ||
+ | < | ||
+ | Frame 2 (62 bytes on wire, 62 bytes captured) | ||
+ | Arrival Time: Jul 15, 2004 14: | ||
+ | Time delta from previous packet: 0.040057000 seconds | ||
+ | Time since reference or first frame: 0.040057000 seconds | ||
+ | Frame Number: 2 | ||
+ | Packet Length: 62 bytes | ||
+ | Capture Length: 62 bytes | ||
+ | Ethernet II, Src: 00: | ||
+ | Destination: | ||
+ | Source: 00: | ||
+ | Type: IP (0x0800) | ||
+ | Internet Protocol, Src Addr: 195.83.118.1 (195.83.118.1), | ||
+ | Version: 4 | ||
+ | Header length: 20 bytes | ||
+ | Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) | ||
+ | 0000 00.. = Differentiated Services Codepoint: Default (0x00) | ||
+ | .... ..0. = ECN-Capable Transport (ECT): 0 | ||
+ | .... ...0 = ECN-CE: 0 | ||
+ | Total Length: 48 | ||
+ | Identification: | ||
+ | Flags: 0x04 (Don't Fragment) | ||
+ | 0... = Reserved bit: Not set | ||
+ | <span class=" | ||
+ | ..0. = More fragments: Not set | ||
+ | Fragment offset: 0 | ||
+ | Time to live: 49 | ||
+ | Protocol: TCP (0x06) | ||
+ | Header checksum: 0x4fc1 (correct) | ||
+ | Source: 195.83.118.1 (195.83.118.1) | ||
+ | Destination: | ||
+ | Transmission Control Protocol, Src Port: ftp (21), Dst Port: kpop (1109), Seq: 5846264, Ack: 1814706076, Len: 0 | ||
+ | Source port: ftp (21) | ||
+ | Destination port: kpop (1109) | ||
+ | Sequence number: 5846264 | ||
+ | Acknowledgement number: 1814706076 | ||
+ | Header length: 28 bytes | ||
+ | Flags: 0x0012 (SYN, ACK) | ||
+ | 0... .... = Congestion Window Reduced (CWR): Not set | ||
+ | .0.. .... = ECN-Echo: Not set | ||
+ | ..0. .... = Urgent: Not set | ||
+ | <span class=" | ||
+ | .... 0... = Push: Not set | ||
+ | .... .0.. = Reset: Not set | ||
+ | <span class=" | ||
+ | .... ...0 = Fin: Not set | ||
+ | Window size: 5840 | ||
+ | Checksum: 0x94be (correct) | ||
+ | Options: (8 bytes) | ||
+ | <span class=" | ||
+ | NOP | ||
+ | NOP | ||
+ | SACK permitted | ||
+ | </ | ||
+ | Donc nous serons d' | ||
+ | |||
+ | Il est intelligent ce serveur, il a compris tout seul que je me connectais via PPPoE ? | ||
+ | |||
+ | Non, ce n'est pas de l' | ||
+ | |||
+ | Le client PPPoE de Debian est une émanation de RP-PPPOE. La même manipulation est donc faite sur d' | ||
+ | |||
+ | C'est pas très propre, ça ne plaira pas du tout à IPsec, qui trouvera un paquet falsifié et ne le laissera pas passer, mais dans le cas classique d'IP « normal » ça résout le problème sans qu'il soit nécessaire d' | ||
+ | |||
+ | Pour les utilisateurs de GNU/Linux, il existe dans les dernières versions d' | ||
+ | |||
+ | >// Ce patch par Marc Boucher, ajoute une nouvelle « target » qui vous permet d' | ||
MTU, MSS etc.: Dernière modification le: 01/01/1970 à 00:00 par