Ce matin, il y a eu de gros problèmes au travail car un piège SNMP n'a pas "traversé" car SNMP est exécuté sur UDP. Je me souviens de la classe de réseautage à l'université que la livraison UDP n'est pas garantie comme TCP/IP. Et Wikipedia dit que SNMP peut être exécuté sur TCP/IP, mais UDP est plus courant.
J'obtiens que certains des avantages d'UDP sur TCP/IP sont la vitesse, la diffusion et la multidiffusion. Mais il me semble que la livraison garantie est plus importante pour la surveillance du réseau que la capacité de diffusion. Surtout lorsqu'il y a de sérieux besoins de haute sécurité. Un de mes collègues m'a dit que les paquets UDP sont les premiers à être abandonnés lorsque le trafic est lourd. C'est encore une autre raison de préférer TCP/IP à UDP pour la surveillance du réseau (IMO).
Alors pourquoi SNMP utilise-t-il UDP? Je ne peux pas le comprendre et je ne trouve pas non plus de bonne raison sur Google.
UDP devrait en fait fonctionner mieux que TCP dans les réseaux avec perte (ou réseaux congestionnés). TCP est bien meilleur pour transférer de grandes quantités de données, mais lorsque le réseau échoue, il est plus probable que UDP passe. (en fait, j'ai récemment fait une étude en testant cela et il a constaté que SNMP sur UDP a bien mieux réussi que SNMP sur TCP dans les réseaux avec perte lorsque le Le délai d'expiration UDP a été défini correctement.) Généralement, TCP commence à se comporter mal à environ 5% de perte de paquets et devient complètement inutile à 33% (ish) et UDP réussira toujours (éventuellement).
Donc, la bonne chose à faire, comme toujours, est de choisir le bon outil pour le bon travail. Si vous effectuez une surveillance de routine de nombreuses données, vous pouvez envisager TCP. Mais préparez-vous à recourir à UDP pour résoudre les problèmes. De nos jours, la plupart des piles peuvent utiliser à la fois TCP et UDP.
Quant à l'envoi de TRAP, oui les TRAP ne sont pas fiables car ils ne sont pas reconnus. Cependant, SNMP INFORMs est une version reconnue d'un SNMP TRAP. Ainsi, si vous voulez savoir que le destinataire de la notification a reçu le message, veuillez utiliser INFORMs. Notez que TCP ne ne pas résoudre ce problème car il fournit uniquement une notification de niveau 3 que le message a été reçu. Rien ne garantit que le destinataire de la notification l'a effectivement reçu. Les INFORMATIONS SNMP font un accusé de réception au niveau de l'application et sont beaucoup plus fiables que de supposer un TCP ack indique qu'ils l'ont obtenu.
Si les systèmes envoyaient des interruptions SNMP via TCP, ils pouvaient bloquer l'attente de l'acquittement des paquets en cas de problème pour acheminer le trafic vers le récepteur. Si de nombreux interruptions étaient générés, il pourrait utiliser jusqu'à les sockets disponibles sur le système et le système se bloqueraient. Avec UDP, ce n'est pas un problème car il est sans état. Un problème similaire a supprimé BitBucket en janvier, bien qu'il s'agissait du protocole syslog plutôt que de SNMP - en gros, ils utilisaient par inadvertance syslog over TCP en raison d'une erreur de configuration, le serveur syslog est tombé en panne et tous les serveurs se sont verrouillés en attendant que le serveur syslog ACK leurs paquets. Si des interruptions SNMP ont été envoyées via TCP, un similaire un problème pourrait survenir.
http://blog.bitbucket.org/2012/01/12/follow-up-on-our-downtime-last-week/
L'utilisation de pièges avec SNMP est considérée comme peu fiable. Vous ne devriez vraiment pas compter sur des pièges.
SNMP a été conçu pour être utilisé comme protocole de demande/réponse. Les détails du protocole sont simples (d'où le nom, "protocole de gestion de réseau simple"). Et UDP est un transport très simple. Essayez d'implémenter TCP sur votre agent de base - c'est considérablement plus complexe qu'un simple agent codé en utilisant UDP.
Les opérations SNMP get/getnext ont un mécanisme de nouvelle tentative - si une réponse n'est pas reçue dans le délai d'attente, la même demande est envoyée jusqu'à un nombre maximum d'essais.
Consultez les écrits d'O'Reilly sur SNMP: https://library.oreilly.com/book/9780596008406/essential-snmp/18.xhtml
Un avantage de l'utilisation d'UDP pour les interruptions SNMP est que vous pouvez diriger UDP vers une adresse de diffusion, puis les mettre en service avec plusieurs stations de gestion sur ce sous-réseau.
Habituellement, lorsque vous utilisez SNMP, vous êtes sur un réseau d'entreprise, vous ne le faites pas sur le long terme. UDP peut être plus efficace. Regardons (une simplification grossière) de la conversation via TCP, puis via UDP ...
Version TCP:
client sends SYN to server
server sends SYN/ACK to client
client sends ACK to server - socket is now established
client sends DATA to server
server sends ACK to client
server sends RESPONSE to client
client sends ACK to server
client sends FIN to server
server sends FIN/ACK to client
client sends ACK to server - socket is torn down
Version UDP:
client sends request to server
server sends response to client
généralement, la version UDP réussit car elle se trouve sur le même sous-réseau, ou pas loin (c'est-à-dire sur le réseau de l'entreprise). Cependant, s'il y a un problème avec la demande initiale ou la réponse, c'est à l'application de décider. A. pouvons-nous nous en sortir avec un paquet manqué? si oui, peu importe, continuez. B. devons-nous nous assurer que le message est envoyé? simple, refaites le tout ... le client envoie la requête au serveur, le serveur envoie la réponse au client. L'application peut fournir un numéro au cas où le destinataire du message reçoit les deux messages, il sait que c'est vraiment le même message qui est envoyé à nouveau.
Cette même technique est la raison pour laquelle le DNS se fait sur UDP. Il est beaucoup plus léger et fonctionne généralement la première fois car vous êtes censé être proche de votre résolveur DNS.