Comment apprendre les protocoles sans lire les RFC : comment gagner du temps de développement





Si vous dĂ©veloppez une application qui s'exĂ©cute sur un rĂ©seau ou que vous dĂ©boguez le fonctionnement d'une telle application, une connaissance approfondie du fonctionnement des protocoles rĂ©seau vous facilitera grandement la tĂąche. La principale source de ces connaissances sont les RFC et, heureusement, elles sont dans le domaine public depuis longtemps. De plus, vous pouvez les lire mĂȘme avec les liens du navigateur de la console, car ils ne contiennent rien d'autre que le texte.



NĂ©anmoins, trĂšs probablement la plupart des lecteurs de Habr n'ont jamais lu le texte entier d'au moins une RFC, mĂȘme RFC-2616... En plus du style furieux des documents bureaucratiques, la barriĂšre de la langue peut ĂȘtre un frein. De plus, le plus souvent, vous devez comprendre certains aspects spĂ©cifiques de l'architecture du protocole : la longueur et le type de champs, le code de retour, l'emplacement dans l'en-tĂȘte. Vous n'avez pas besoin de tout lire d'un bout Ă  l'autre pour le faire.



Juste pour ce cas, Protocol a été écrit , une application console assez simple écrite en Python. Il a un double objectif.



  • Offrez aux dĂ©veloppeurs et aux ingĂ©nieurs la possibilitĂ© de voir facilement et facilement le diagramme d'en-tĂȘte des protocoles rĂ©seau les plus courants directement Ă  partir de la ligne de commande.
  • Offrez aux chercheurs et aux ingĂ©nieurs la possibilitĂ© de crĂ©er rapidement des diagrammes d'en-tĂȘte ASCII pour leurs propres protocoles personnalisĂ©s.


Installation et configuration



Le code source est sur GitHub , vous pouvez le télécharger de maniÚre standard.



git clone https://github.com/luismartingarcia/protocol.git

      
      





La configuration est effectuée par une commande avec les droits d'utilisateur root.



setup.py install
      
      





Étant donnĂ© que le programme n'a actuellement pas de mĂ©canisme d'installation standard pour les distributions Linux ou Python, il est prĂ©fĂ©rable de se rappeler oĂč les fichiers sont copiĂ©s.



running install

running build

running build_scripts

creating build

creating build/scripts-3.9

copying and adjusting protocol -> build/scripts-3.9

copying constants.py -> build/scripts-3.9

copying specs.py -> build/scripts-3.9

changing mode of build/scripts-3.9/protocol from 644 to 755

changing mode of build/scripts-3.9/constants.py from 644 to 755

changing mode of build/scripts-3.9/specs.py from 644 to 755

running install_scripts

copying build/scripts-3.9/protocol -> /usr/bin

copying build/scripts-3.9/constants.py -> /usr/bin

copying build/scripts-3.9/specs.py -> /usr/bin

changing mode of /usr/bin/protocol to 755

changing mode of /usr/bin/constants.py to 755

changing mode of /usr/bin/specs.py to 755

running install_egg_info

Writing /usr/lib/python3.9/site-packages/protocol-0.1-py3.9.egg-info
      
      





Exécuter le protocole



Le programme a deux principaux modes de fonctionnement :



  1. protocole <nom du protocole existant> ;
  2. protocole <spécifications du protocole natif>.


Les protocoles standard suivants sont disponibles



ethernet            : Ethernet

8021q               : IEEE 802.1q

dot1q               : IEEE 802.1q

tcp                 : Transmission Control Protocol (TCP)

udp                 : User Datagram Protocol (TCP)

ip                  : Internet Protocol (IP), version 4.

ipv6                : Internet Protocol (IP), version 6.

icmp                : Internet Control Message Protocol (ICMP)

icmp-destination:   : ICMP Destination Unreachable

icmp-time           : ICMP Time Exceeded

icmp-parameter      : ICMP Parameter Problem

icmp-source         : ICMP Source Quench

icmp-redirect       : ICMP Redirect

icmp-echo           : ICMP Echo Request/Reply

icmp-timestamp      : ICMP Timestamp Request/Reply

icmp-information    : ICMP Information Request/Reply

icmpv6              : ICMP for IPv6 (ICMPv6)

icmpv6-destination  : ICMPv6 Destination Unreachable

icmpv6-big          : ICMPv6 Packet Too Big

icmpv6-time         : ICMPv6 Time Exceeded

icmpv6-parameter    : ICMPv6 Parameter Problem

icmpv6-echo         : ICMPv6 Echo Request/Reply

icmpv6-rsol         : ICMPv6 Router Solicitation

icmpv6-radv         : ICMPv6 Router Advertisement

icmpv6-nsol         : ICMPv6 Neighbor Solicitation

icmpv6-nadv         : ICMPv6 Neighbor Advertisement

icmpv6-redirect     : ICMPv6 Redirect
      
      





Voici des exemples d'utilisation de l'utilitaire.



|12:09:41|admin@redeye:[~]> protocol ip

 0                   1                   2                   3

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|Version|  IHL  |Type of Service|          Total Length         |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|         Identification        |Flags|     Fragment Offset     |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|  Time to Live |    Protocol   |        Header Checksum        |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                         Source Address                        |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                      Destination Address                      |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                    Options                    |    Padding    |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|12:09:45|admin@redeye:[~]> protocol ipv6

 0                   1                   2                   3

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|Version| Traffic Class |               Flow Label              |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|         Payload Length        |  Next Header  |   Hop Limit   |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                                                               |

+                                                               +

|                                                               |

+                         Source Address                        +

|                                                               |

+                                                               +

|                                                               |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                                                               |

+                                                               +

|                                                               |

+                       Destination Address                     +

|                                                               |

+                                                               +

|                                                               |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
      







Dans une commande, vous pouvez spécifier plusieurs protocoles à la fois, en les séparant par un espace.



|12:34:16|admin@redeye:[~]> protocol icmp-time icmp-timestamp

 0                   1                   2                   3

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|      Type     |      Code     |            Checksum           |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                             Unused                            |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                                                               |

+      Internet Header + 64 bits of Original Data Datagram      +

|                                                               |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 0                   1                   2                   3

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|      Type     |      Code     |            Checksum           |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|           Identifier          |        Sequence Number        |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                      Originate Timestamp                      |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                       Receive Timestamp                       |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                       Transmit Timestamp                      |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
      





Le protocole est vif d'esprit, il n'est pas nĂ©cessaire de taper le nom du protocole en entier, si vous ĂȘtes vraiment paresseux vous pouvez, par exemple, taper dot au lieu de dot1q. Cependant, comme dans le cas de l'autocomplĂ©tion, en cas de choix ambigu, il est proposĂ© de choisir l'une des alternatives.



|12:43:25|admin@redeye:[~]> protocol icmpv6-r

Ambiguous protocol specifier 'icmpv6-r'. Did you mean any of these?

  icmpv6-radv

  icmpv6-redirect

  icmpv6-rsol

      
      





Développements propres



La caractéristique la plus importante de la spécification du protocole est la liste des champs. Vous pouvez les spécifier pour votre propre protocole comme suit.



|12:55:16|mikayel@redeye:[~]> protocol «Source:16,Reserved:40,RTT:8»

 0                   1                   2                   3

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|             Source            |                               |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               +-+-+-+-+-+-+-+-+

|                    Reserved                   |      RTT      |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
      





Des options supplémentaires étendent les capacités de formatage des graphiques ASCII. Vous pouvez spécifier le nombre de bits par ligne, définir les caractÚres du séparateur et des pseudo-graphiques. La commande précédente avec des options pseudo-graphiques donnera ce qui suit.



|16:02:05|mikayel@redeye:[~]> protocol «Source:16,Reserved:40,RTT:8?\

  numbers=y,startchar=*,endchar=*,evenchar=-,oddchar=-,sepchar=|»

 0                   1                   2                   3  

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

*---------------------------------------------------------------*

|             Source            |                               |

*-------------------------------*               *---------------*

|                    Reserved                   |      RTT      |

*---------------------------------------------------------------*

      
      





Protocole + tshark



Des informations plus complĂštes sur la structure des protocoles rĂ©seau peuvent ĂȘtre obtenues en ouvrant le fichier pcap/pcapng enregistrĂ© du trafic rĂ©seau dans tshark . Si vous ne regardez que dans tshark, vous ne pouvez pas voir la forĂȘt pour les arbres, et avec le protocole - ce dont vous avez besoin.



|16:08:05|admin@redeye:[~]> sudo tshark -r /tmp/exmp.pcap -V

Transmission Control Protocol, Src Port: 48378, Dst Port: 443, Seq: 1, Ack: 1, Len: 0

    Source Port: 48378

    Destination Port: 443

    [Stream index: 0]

    [TCP Segment Len: 0]

    Sequence Number: 1    (relative sequence number)

    Sequence Number (raw): 1120003294

    [Next Sequence Number: 1    (relative sequence number)]

    Acknowledgment Number: 1    (relative ack number)

    Acknowledgment number (raw): 4090007166

    1000 .... = Header Length: 32 bytes (8)

    Flags: 0x010 (ACK)

        000. .... .... = Reserved: Not set

        ...0 .... .... = Nonce: Not set

        .... 0... .... = Congestion Window Reduced (CWR): Not set

        .... .0.. .... = ECN-Echo: Not set

        .... ..0. .... = Urgent: Not set

        .... ...1 .... = Acknowledgment: Set

        .... .... 0... = Push: Not set

        .... .... .0.. = Reset: Not set

        .... .... ..0. = Syn: Not set

        .... .... ...0 = Fin: Not set

        [TCP Flags: ·······A····]

    Window: 501

    [Calculated window size: 501]

    [Window size scaling factor: -1 (unknown)]

    Checksum: 0xfbe8 [unverified]

    [Checksum Status: Unverified]

    Urgent Pointer: 0

    Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps

        TCP Option — No-Operation (NOP)

            Kind: No-Operation (1)

        TCP Option — No-Operation (NOP)

            Kind: No-Operation (1)

        TCP Option — Timestamps: TSval 2014817649, TSecr 2606727549

            Kind: Time Stamp Option (8)

            Length: 10

            Timestamp value: 2014817649

            Timestamp echo reply: 2606727549

|16:28:51|admin@redeye:[~]> protocol tcp

 0                   1                   2                   3

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|          Source Port          |        Destination Port       |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                        Sequence Number                        |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                     Acknowledgment Number                     |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Offset|  Res. |     Flags     |             Window            |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|            Checksum           |         Urgent Pointer        |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                    Options                    |    Padding    |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      
      





Bien sĂ»r, des programmes comme Protocol et tshark ne peuvent et ne doivent pas remplacer la lecture des sources primaires, car   e Les RFC, cependant, peuvent faire gagner beaucoup de temps aux programmeurs et aux administrateurs systĂšme.






Les serveurs cloud de Macleod sont rapides et sécurisés.



Inscrivez-vous en utilisant le lien ci-dessus ou en cliquant sur la banniÚre et bénéficiez d'une remise de 10 % pour le premier mois de location d'un serveur de n'importe quelle configuration !






All Articles