J'ai lu un certain nombre d'articles sur les tailles de paquets UDP, mais je n'ai pas pu parvenir à une conclusion sur ce qui est correct.
Un certain nombre de services restreignent le plus grand paquet UDP à 512 octets (comme le DNS)
Étant donné le MTU minimum sur Internet est de 576, et la taille de l'en-tête IPv4 est de 20 octets, et l'en-tête UDP de 8 octets. Cela laisse 548 octets disponibles pour les données utilisateur
Serais-je capable d'utiliser des paquets jusqu'à la taille de 548 sans fragmentation des paquets? Ou y a-t-il quelque chose que les créateurs de DNS connaissaient et pourquoi ils l'ont limité à 512 octets.
Puis-je même aller plus haut que 548 octets en toute sécurité?
Réponses:
Il est vrai qu'un en- tête IPv4 typique fait 20 octets et que l'en-tête UDP fait 8 octets. Cependant, il est possible d'inclure des options IP qui peuvent augmenter la taille de l'en-tête IP jusqu'à 60 octets. De plus, il est parfois nécessaire que les nœuds intermédiaires encapsulent des datagrammes à l'intérieur d'un autre protocole tel qu'IPsec (utilisé pour les VPN et similaires) afin d'acheminer le paquet vers sa destination. Donc, si vous ne connaissez pas le MTU sur votre chemin de réseau particulier, il est préférable de laisser une marge raisonnable pour les autres informations d'en-tête que vous n'avez peut-être pas prévues. Une charge utile UDP de 512 octets est généralement considérée comme faisant cela, bien que même cela ne laisse pas assez d'espace pour un en-tête IP de taille maximale.
la source
La limite théorique (sous Windows) pour la taille maximale d'un paquet UDP est de 65507 octets. Ceci est documenté ici :
Cela étant dit, la plupart des protocoles se limitent à une taille beaucoup plus petite - généralement 512 ou parfois 8192. Vous pouvez souvent aller au-delà de 548 en toute sécurité si vous êtes sur un réseau fiable - mais si vous diffusez sur Internet en général, le plus grand vous allez, plus vous risquez de rencontrer des problèmes de transmission de paquets et des pertes.
la source
La charge utile UDP sécurisée maximale est de 508 octets. Il s'agit d'une taille de paquet de 576, moins l'en-tête IP maximal de 60 octets et l'en-tête UDP de 8 octets. Toute charge utile UDP de cette taille ou plus petite est garantie d'être livrable sur IP (mais non garantie d'être livrée). Tout ce qui est plus grand peut être purement et simplement abandonné par n'importe quel routeur pour une raison quelconque. Sauf sur une route IPv6 uniquement, où la charge utile maximale est de 1 212 octets. Comme d'autres l'ont mentionné, des en-têtes de protocole supplémentaires pourraient être ajoutés dans certaines circonstances. Une valeur plus conservatrice d'environ 300 à 400 octets peut être préférée à la place.
Tout paquet UDP peut être fragmenté. Mais ce n'est pas trop important, car perdre un fragment a le même effet que perdre un paquet non fragmenté: le paquet entier est abandonné. Avec UDP, cela va se produire de toute façon.
Fait intéressant, la taille de paquet théorique maximale est d'environ 30 Mo (1 500 MTU Ethernet - 60 en-têtes IP x 65 536 nombre maximal de fragments), bien que la probabilité de le faire passer soit infinitésimale.
Sources: RFC 791, RFC 2460
la source
576 est la taille minimale maximale du tampon de réassemblage , c'est-à-dire que chaque implémentation doit être capable de réassembler des paquets d' au moins cette taille. Voir IETF RFC 1122 pour plus de détails.
la source
Cet article décrit l'unité de transmission maximale (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . Il indique que les hôtes IP doivent pouvoir traiter 576 octets pour un paquet IP. Cependant, il note que le minimum est de 68. RFC 791: "Chaque module Internet doit être en mesure de transmettre un datagramme de 68 octets sans autre fragmentation. En effet, un en-tête Internet peut contenir jusqu'à 60 octets et le fragment minimum est de 8 octets. . "
Ainsi, une taille de paquet sûre de 508 = 576 - 60 (en-tête IP) - 8 (en-tête udp) est raisonnable.
Comme mentionné par user607811, la fragmentation par d'autres couches réseau doit être réassemblée. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Réassemblage La couche IP DOIT implémenter le réassemblage des datagrammes IP. Nous désignons la plus grande taille de datagramme qui peut être remontée par EMTU_R ("MTU efficace à recevoir"); ceci est parfois appelé la "taille du tampon de réassemblage". EMTU_R DOIT être supérieur ou égal à 576
la source
La taille minimale du tampon de réassemblage IPv4 est de 576, IPv6 l'a à 1500. Soustrayez les tailles d'en-tête d'ici. Voir Programmation réseau UNIX par W. Richard Stevens :)
la source
512 est votre meilleur pari. Il est utilisé ailleurs et est un joli nombre pair (la moitié de 1024).
la source
Étant donné que IPV6 a une taille de 1500, j'affirmerais que les opérateurs ne fourniraient pas de chemins séparés pour IPV4 et IPV6 (ils sont tous deux IP avec des types différents), les forçant à utiliser un équipement pour ipv4 qui serait ancien, redondant, plus coûteux à entretenir et moins fiable. Cela n'aurait aucun sens. En outre, cela pourrait facilement être considéré comme offrant un traitement préférentiel pour certains trafics - un non non selon des règles dont ils ne se soucient probablement pas beaucoup (sauf s'ils se font prendre).
Donc, 1472 devrait être sûr pour une utilisation externe (bien que cela ne signifie pas qu'une application comme DNS qui ne connaît pas EDNS l'acceptera), et si vous parlez de réseaux internes, vous pouvez plus probablement connaître la configuration de votre réseau, auquel cas des tailles de paquet jumbo s'appliquent pour les paquets non fragmentés, donc pour 4096 - 4068 octets, et pour les cartes Intel avec des tampons de 9014 octets, une taille de paquet de ... attendez ... 8086 octets, serait la coïncidence max ...? ricanement
****METTRE À JOUR****
Différentes réponses donnent les valeurs maximales autorisées par 1 fournisseur de logiciels ou diverses réponses en supposant l'encapsulation. L'utilisateur n'a pas demandé la valeur la plus basse possible (comme "0" pour une taille UDP sûre), mais la plus grande taille de paquet sûre.
Les valeurs d'encapsulation pour différentes couches peuvent être incluses plusieurs fois. Depuis qu'une fois que vous avez encapsulé un flux - rien n'interdit, disons, une couche VPN en dessous et une duplication complète des couches d'encapsulation au-dessus.
Étant donné que la question portait sur les valeurs de sécurité maximales, je suppose qu'ils parlent de la valeur de sécurité maximale pour un paquet UDP qui peut être reçu. Puisqu'aucun paquet UDP n'est garanti, si vous recevez un paquet UDP, la plus grande taille sûre serait de 1 paquet sur IPv4 ou 1472 octets.
Remarque - si vous utilisez IPv6, la taille maximale serait de 1452 octets, car la taille de l'en-tête d'IPv6 est de 40 octets par rapport à la taille de 20 octets d'IPv4 (et de toute façon, il faut toujours autoriser 8 octets pour l'en-tête UDP).
la source
J'ai lu quelques bonnes réponses ici; cependant, il y a quelques erreurs mineures. Certains ont répondu que le champ Longueur du message dans l'en-tête UDP est au maximum de 65 535 (0xFFFF); c'est techniquement vrai. Certains ont répondu que le maximum réel est (65535 - IPHL - UDPHL = 65507). L'erreur est que le champ Longueur du message dans l'en-tête UDP inclut toute la charge utile (couches 5-7), plus la longueur de l'en-tête UDP (8 octets). Cela signifie que si le champ de longueur du message est de 200 octets (0x00C8), la charge utile est en fait de 192 octets (0x00C0).
Ce qui est dur et rapide, c'est que la taille maximale d'un datagramme IP est de 65 535 octets. Ce nombre est obtenu à la somme totale des en-têtes L3 et L4, plus la charge utile des couches 5-7. En-tête IP + En-tête UDP + Couches 5-7 = 65535 (Max).
La réponse la plus correcte pour ce qui est la taille maximale d'un datagam UDP est 65515 octets (0xFFEB), car un datagramme UDP comprend l'en-tête UDP. La réponse la plus correcte pour la taille maximale d'une charge utile UDP est 65507 octets, car une charge utile UDP n'inclut pas l'en-tête UDP.
la source
Je crains de subir des réactions bouleversées mais néanmoins, pour clarifier pour moi si je me trompe ou ceux qui voient cette question et qui souhaitent une réponse:
ma compréhension de https://tools.ietf.org/html/rfc1122 dont le statut est "une spécification officielle" et en tant que telle est la référence pour la terminologie utilisée dans cette question et qui n'est ni remplacée par un autre RFC ni errata contredisant le Suivant:
théoriquement, à savoir. basé sur les spécifications écrites, UDP comme indiqué par https://tools.ietf.org/html/rfc1122#section-4 n'a pas de "taille de paquet". Ainsi, la réponse pourrait être "indéfinie"
Dans la pratique, c'est ce que ces questions recherchaient probablement (et qui pourrait être mis à jour pour la technologie actuelle en action), cela pourrait être différent et je ne sais pas.
Je m'excuse si j'ai causé des ennuis. https://tools.ietf.org/html/rfc1122#page-8 La "Suite de protocoles Internet" et les "Hypothèses architecturales" ne me font pas clairement comprendre "l'hypothèse" sur laquelle je me basais, d'après ce que j'ai entendu, que les couches sont séparées . C'est à dire. la couche UDP ne doit pas se préoccuper de la couche IP est (et la couche IP a des choses comme le réassemblage, EMTU_R, la fragmentation et MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 ))
la source
UDP n'est pas "sûr", donc la question n'est pas grande - cependant -
Si vous envoyez 9217 ou plus (mac) ou 65508+ (linux / windows), la fonction d'envoi de socket retourne avec une erreur.
Les réponses ci-dessus discutant de la fragmentation et du MTU et ainsi de suite sont hors sujet - que tout se déroule à un niveau inférieur, est "invisible" pour vous et n'affecte pas la "sécurité" sur les connexions typiques à un degré significatif.
Pour répondre à la question réelle signification bien - ne pas utiliser UDP - utiliser des raw sockets afin que vous obtenez un meilleur contrôle de tout; puisque vous écrivez un jeu, vous devez plonger dans les drapeaux pour obtenir la priorité dans votre trafic de toute façon, vous pouvez donc aussi vous débarrasser des problèmes UDP en même temps.
la source