Bonjour tout le monde,
Pour un projet scolaire, je dois coder un client DNS léger en C, devant permettre une communication avec le serveur DNS autant en UDP qu'en TCP, et implémentant les requêtes inverses...voilà pour le cadre
Mais on nous demande aussi de gérer la fiabilitié de nous-même en ce qui concerne UDP, c'est-à-dire si je ne me trompe pas, d'utiliser un timeout à la réception et de retransmettre si celui-ci arrive à son terme. A priori, pas besoin de numéros de séquence ou autre de ce genre, puisque dans tous les cas, on envoie une seule requête, et on recevra une seule réponse du serveur.
Je met donc en place un timeout de 50 millisecondes, et si la première tentatie échoue (timeout), je réessaye 4 fois, c'est-à-dire que 4 fois je refais le cycle envoi_de_la_requête/attente_de_la_réponse, toujours avec le même timeout ; et toutes ces belles petites lignes de code fonctionnent très bien.
J'ai fait plusieurs tests, et parfois je dois retransmettre une fois ; par ailleurs, une fois qu'une info est en cache du serveur DNS, je n'ai jamais eu un temps d'attente supérieur à 35 ms (entre 15 et 25ms généralement) ; autrement, surtout si c'est une requête inverse, le temps d'attente monte assez rarement au-dessus de 150 ms (j'ai vu juste une fois une pointe à 200 ms et une à 226 ms).
Cela m'étonne d'ailleurs un peu que je n'aie pour l'instant pas eu à retransmettre plus d'une fois, étant donné les temps d'attente qu'il m'est déja arrivé d'avoir...si quelqu'un a une explication...
Cependant un problème m'embête, et plusieurs questions me viennent à l'esprit :
- j'ai utilisé un timeout de 50 ms un peu pour voir comment tout allait se passer, d'ailleurs comme dit plus haut je suis un peu étonné ; mais je pourrais utiliser un timeout plus ou moins variable, dans le genre 150 ms d'attente au premier essai, puis 50 ms pour les 4 retransmissions possibles, puisque l'info demandée est forcément en cache depuis le temps. Qu'en pensez-vous ? De cette manière j'attends suffisamment longtemps si le serveur met du temps à répondre, je ne spammerai pas le serveur inconsidérément ; on pourrait même monter ce timeout initial à 300 ms (jamais vu un temps d'attente supérieur à çà), mais à ce moment c'est l'utilisateur du programme qui le sentira passer si le message s'est perdu. Car le timeout fixe de 50 ms 5 fois est bien du point de vue du programme, mais je spamme le serveur en cas de perte/lenteur. A la limite c'est pas moi que ça concerne, mais bon hein quand même ^^ je suis pas sur que ça soit très....moral.
- je retransmets 4 fois la requête, surtout pour le cas où il y aurait perte de ma réponse ; faudrait-il plus de retransmissions ? Le but étant quand même que l'utilisateur de mon client DNS n'attende pas des heures, il faut quand même qu'a un moment je lui dise "tant pis pas de bol, le réseau veut pas te donner ta réponse", il réessayera plus tard. Tout le problème est dans l'ajustement du nombre de retransmissions, et le temps de timeout...
- enfin, je sais que le serveur met en cache les réponses, qu'il en ait trouvé une ou que sa réponse soit "domain name doesn't exist", d'après la RFC en tout cas. Par contre ce que je n'ai pas trouvé, c'est la façon dont le serveur réagit si une défaillance interne a lieu ; est-ce qu'il retourne immédiatement une réponse (avec donc un temps de réponse bien sous la barre des 50 ms), ou bien est-ce qu-il met 10 plombes à se rendre compte qu'il est en panne, et dans ce cas des timeout de 50 ms ne suffiront jamais à savoir que le serveur s'est planté ?
Voila, donc déja félicitations et merci pour être arrivé au bout du pavé ^^ je sais que c'est assez précis comme questions, mais je n'ai trouvé les réponses ni dans la RFC 1035, ni avec Google.
Je pourrais si vous le demandez poster du code, mais il me semble que la question est plus...philosophique qu'autre chose
Merci d'avance à ceux qui prendront la peine de m'aider !
Partager