Como aprender protocolos sem ler RFCs: como economizar tempo de desenvolvimento





Se você estiver desenvolvendo um aplicativo executado em uma rede ou depurando a operação de tal aplicativo, um conhecimento profundo de como os protocolos de rede funcionam facilitará muito sua tarefa. A principal fonte de tal conhecimento são os RFCs e, felizmente, eles estão no domínio público há muito tempo. Além disso, você pode lê-los até mesmo com os links do navegador do console, já que eles não contêm nada além do texto.



No entanto, muito provavelmente a maioria dos leitores de Habr nunca leu o texto completo de pelo menos um RFC, mesmo RFC-2616... Além do estilo furioso dos documentos burocráticos, a barreira do idioma pode ser um obstáculo. Além disso, na maioria das vezes você precisa entender algum aspecto específico da arquitetura do protocolo: o comprimento e o tipo dos campos, código de retorno, localização dentro do cabeçalho. Você não precisa ler tudo de capa a capa para fazer isso.



Apenas para este caso, o protocolo foi escrito , um aplicativo de console bastante simples escrito em Python. Tem um propósito duplo.



  • Fornece aos desenvolvedores e engenheiros a capacidade de ver de forma fácil e fácil o diagrama de cabeçalho dos protocolos de rede mais comuns diretamente da linha de comando.
  • Fornece aos pesquisadores e engenheiros a capacidade de criar rapidamente diagramas de cabeçalho ASCII para seus próprios protocolos personalizados.


Instalação e configuração



O código-fonte está no GitHub , você pode baixá-lo de forma padrão.



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

      
      





A configuração é realizada por um comando com direitos de usuário root.



setup.py install
      
      





Como o programa atualmente não possui um mecanismo de instalação padrão para distribuições Linux ou Python, é melhor lembrar onde os arquivos são copiados.



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
      
      





Executar protocolo



O programa tem dois modos principais de operação:



  1. protocolo <nome do protocolo existente>;
  2. protocolo <especificações de protocolo nativo>.


Os seguintes protocolos padrão estão disponíveis



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
      
      





Aqui estão alguns exemplos de como usar o utilitário.



|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                     +

|                                                               |

+                                                               +

|                                                               |

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







Em um comando, você pode especificar vários protocolos de uma vez, separando-os com um espaço.



|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                      |

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





O protocolo é de raciocínio rápido, não é necessário digitar o nome do protocolo por extenso, se você for muito preguiçoso pode, por exemplo, digitar ponto em vez de dot1q. Porém, como no caso do autocompletar, em caso de escolha ambígua, propõe-se escolher uma das alternativas.



|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

      
      





Desenvolvimentos próprios



O recurso mais importante da especificação do protocolo são as listas de campos. Você pode especificá-los para seu próprio protocolo da seguinte maneira.



|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      |

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





Opções adicionais expandem os recursos de formatação de gráficos ASCII. Você pode especificar o número de bits por linha, definir os caracteres para o separador e pseudo gráficos. O comando anterior com opções de pseudo-gráficos fornecerá o seguinte.



|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      |

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

      
      





Protocolo + tshark



Informações mais completas sobre a estrutura dos protocolos de rede podem ser obtidas abrindo o arquivo pcap / pcapng salvo do tráfego de rede em tshark . Se você olhar apenas em tshark, você não pode ver a floresta pelas árvores, e junto com o Protocolo - o que você precisa.



|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    |

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

      
      





Claro, programas como Protocol e tshark não podem e não devem substituir a leitura de fontes primárias, porque ․ e ․ RFCs, entretanto, podem economizar muito tempo para programadores e administradores de sistema.






Os servidores em nuvem da Macleod são rápidos e seguros.



Cadastre-se pelo link acima ou clicando no banner e ganhe 10% de desconto no primeiro mês de aluguel de um servidor de qualquer configuração!






All Articles