Comment définir le drapeau ne pas fragment (DF) sur une socket?
Je suis en train de mettre la DF (don't fragment drapeau) pour l'envoi de paquets à l'aide du protocole UDP.
À la recherche à la Richard Steven du tome 1 Unix Réseau de La Programmation; les Sockets Réseau API, je suis incapable de trouver comment régler ce.
Je soupçonne que je le ferais avec setsockopt (), mais ne le trouve pas dans le tableau de la page 193.
Veuillez indiquer comment c'est fait.
source d'informationauteur WilliamKF
Vous devez vous connecter pour publier un commentaire.
Vous le faites avec la
setsockopt()
appel, à l'aide de laIP_DONTFRAG
option::Voici une page pour expliquer cela plus en détail.
Pour Linux, il semble que vous avez à utiliser le
IP_MTU_DISCOVER
option avec la valeurIP_PMTUDISC_DO
(ouIP_PMTUDISC_DONT
pour le désactiver):Je n'ai pas testé, juste regardé dans les fichiers d'en-tête et un peu de recherche sur le web de sorte que vous aurez besoin de le tester.
Si il y a une autre façon, l'indicateur DF pourrait être définie:
De cette excellente page ici:
Ce me ressemble vous pouvez définir à l'échelle du système par défaut à l'aide de
sysctl
:retourne
"error: "ip_no_pmtu_disc" is an unknown key"
sur mon système, mais elle peut l'être sur le vôtre. Autre que cela, je ne suis pas au courant de quoi que ce soit (autre quesetsockopt()
comme mentionné précédemment) qui peuvent affecter le réglage.Si vous travaillez dans l'espace Utilisateur avec l'intention de contourner la pile réseau du Noyau, et donc la construction de vos propres paquets et les en-têtes et de les céder à un Noyau personnalisé module, il est une meilleure option que
setsockopt()
.Vous pouvez réellement définir l'indicateur DF juste comme n'importe quel autre domaine de la
struct iphdr
défini danslinux/ip.h
. Les 3 bits IP drapeaux sont en fait une partie de lafrag_off
(Fragment Offset) membre de la structure.
Quand vous pensez à ce sujet, il est logique de regrouper ces deux choses que les indicateurs sont liés à la fragmentation. Selon le RFC-791la section décrivant l'en-tête IP structure états Fragment Offset est de 13 bits de long et il y a trois 1-indicateurs de bits. Le
membre est de typefrag_off
__be16
, qui peut contenir 13 + 3 bits.Longue histoire courte, voici une solution:
Nous sommes ici exactement le réglage de la DF bits à l'aide de la conçu-pour-que-notamment à usage
IP_DF
masque.IP_DF
est défini dansnet/ip.h
(en-têtes du noyau, bien sûr), alors questruct iphdr
est défini danslinux/ip.h
.Je suis d'accord avec le paxdiablo de réponse.
où
val
est l'un des:ip_no_pmtu_disc
dans les sources du noyau: