J'ai besoin de savoir quel est le plus gros paquet UDP que je puisse envoyer à un autre ordinateur sans fragmentation.
Cette taille est communément appelée MTU (Maximum Transmission Unit). Soi-disant, entre 2 ordinateurs, il y aura de nombreux routeurs et modems pouvant avoir des MTU différents.
J'ai lu que l'implémentation TCP dans Windows trouve automatiquement le maximum de MTU dans un chemin.
J'essayais également, et j'ai découvert que le MTU maximum de mon ordinateur vers un serveur était de 57 712 octets + en-tête. Tout ce qui dépassait était jeté. Mon ordinateur est sur un réseau local, le MTU n'est-il pas censé compter environ 1500 octets?
Ce qui suit ne répond pas directement à votre question, mais vous pourriez la trouver intéressante. il indique que les paquets IP peuvent être désassemblés/réassemblés, et donc plus grands que la limite sur le support sous-jacent (Ethernet 1500 octets, par exemple): Résoudre les problèmes de fragmentation IP, MTU, MSS et PMTUD avec GRE et IPSEC
Plus sur ce sujet:
Je ne sais pas comment générer ICMP via une API sous Windows: à une époque, une telle API était proposée et faisait l'objet de controverses car certains pensaient qu'il serait facile d'écrire un logiciel qui implémenterait la fonctionnalité de déni de service en générant un flot de Messages ICMP.
Non, il semble que est implémenté: voir par exemple FAQ de Winsock Programmer. Exemples: Ping: Raw Sockets, méthode .
Donc, pour découvrir MTU, générez des paquets ping avec l’indicateur 'ne pas fragmenter'.
Peut-être y a-t-il une API plus facile que cela, je ne sais pas; mais j'espère vous avoir donné à comprendre le protocole sous-jacent.
En plus de toutes les réponses précédentes, citant le classique :
taille minimale du tampon de réassemblage
Cela signifie que vous voulez limiter la taille de vos datagrammes à moins de 576 si vous travaillez sur Internet et que vous ne contrôlez qu'un seul côté de l'échange - c'est ce que la plupart des protocoles standard basés sur UDP font .
Notez également que PMTU est une propriété dynamique du chemin. C’est l’une des choses que TCP traite pour vous. À moins que vous ne soyez prêt à réimplémenter de nombreuses logiques de séquencement, de minutage et de retransmission, utilisez TCP pour tout réseau critique. Benchmark, test, profil, c.-à-d. prouver que TCP est votre goulot d’étranglement, n’envisagez alors qu’UDP.
C'est un sujet intéressant pour moi. Certains résultats pratiques pourraient peut-être présenter un intérêt lors de la transmission de données UDP volumineuses sur Internet dans le monde réel via UDP. Avec un débit de transmission d'un paquet à la seconde, les données continuent d'arriver avec une perte minimale de paquets pouvant aller jusqu'à environ 2K. Vous rencontrez des problèmes, mais nous livrons régulièrement plus de 1 600 paquets d'octets sans détresse - ceci concerne les réseaux mobiles GPRS ainsi que WAN dans le monde entier. À environ 1K, en supposant que le signal soit stable (ce n'est pas le cas!), La perte de paquets est faible.
Il est intéressant de noter que ce n’est pas un paquet étrange, mais souvent une rafale de paquets pendant quelques secondes - ce qui explique probablement pourquoi les appels VoIP s’effondrent de temps en temps.
Votre propre MTU est disponible dans le répertoire registry , mais, dans la pratique, le MTU est dirigé vers le plus petit MTU situé entre la machine et la destination. Ses deux variables et ne peuvent être déterminées que de manière empirique. Il existe un certain nombre de RFC montrant comment le déterminer.
Les réseaux locaux peuvent avoir de très grandes valeurs MTU en interne, car le matériel réseau est généralement homogène ou au moins administré de manière centralisée.
Pour les applications UDP, vous devez gérer vous-même les MTU de bout en bout si vous souhaitez éviter la fragmentation IP ou les paquets perdus. L’approche recommandée pour toute application consiste à faire de votre mieux pour utiliser PMTU afin de choisir votre datagramme maximum ou d’envoyer des datagrammes <PMTU minimum.
https://tools.ietf.org/html/rfc5405#section-3.2
Instructions d'utilisation d'Unicast UDP pour les concepteurs d'applications "NE DEVRAIT PAS envoyer de datagrammes dépassant le PMTU, DEVRAIT découvrir le PMTU ou envoyer des datagrammes <minimum PMTU
Windows apparaît pour les paramètres et l'accès aux informations PMTU via son interface d'options de socket de base:
Vous pouvez vous assurer que la découverte du PMTU est activée via IP_MTU_DISCOVER et que vous pouvez lire le MTU via IP_MTU.
https://docs.Microsoft.com/en-us/windows/desktop/winsock/ipproto-ip-socket-options