[Repost] - PRUDP: Escrevendo um protocolo de rede do Nintendo 3DS
Sobre o protocolo PRUDP
PRUDP é um protocolo da camada de transporte baseado no UDP cujo objetivo é enviar pacotes UDP de maneira confiável e segura. Existem duas versões deste protocolo (V0 e V1), mas são bastante semelhantes. A principal diferença está na codificação dos pacotes. Todos os valores são codificados em ordem de bytes little endian.
No Nintendo Switch, o NEX usa uma conexão WebSocket em vez de UDP e a codificação 'Lite' é usada.
Sessão PRUDP
Aperto de mão 1 → af a1 40 00 00 00 00 00 00 00 00 00 00 00 00 97
Aperto de mão 1 ← a1 af 10 00 00 00 00 00 00 00 00 5f 22 68 ea 3a
Aperto de mão 2 → af a1 61 00 18 5f 22 68 ea 01 00 d4 d6 91 e8 c9
Aperto de mão 2 ← a1 af 11 00 50 d4 d6 91 e8 01 00 00 00 00 00 de
Enviar dados → af a1 62 00 18 26 b4 01 a1 02 00 00 (25 bytes de carga criptografada) ef
Reconhecer ← a1 de 12 00 50 78 56 34 12 02 00 00 d1
Enviar dados ← a1 af 62 00 50 67 dd f9 c3 01 00 00 (255 bytes de carga criptografada) 03
Reconhecer → af a1 12 00 18 78 56 34 12 01 00 00 97
Enviar dados → af a1 62 00 18 8d 58 91 c0 03 00 00 (21 bytes de carga criptografada) fa
Reconhecer ← a1 de 12 00 50 78 56 34 12 03 00 00 d2
Enviar dados ← a1 af 62 00 50 a9 c5 fa 2e 02 00 00 (130 bytes de carga criptografada) 54
Reconhecer → af a1 12 00 18 78 56 34 12 02 00 00 98
Desligar → af a1 63 00 18 5f 22 68 ea 04 00 aa
Desligar ← a1 af 13 00 50 d4 d6 91 e8 04 00 e2
Estrutura do pacote PRUDP
Deslocamento | Descrição |
---|---|
0x0 | Fonte |
0x1 | Destino |
0x2 | Tipo e sinalizadores |
0x4 | ID da sessão |
0x5 | Assinatura do pacote |
0x9 | ID de sequência |
Sobre udp.h
O arquivo de cabeçalho "udp.h" em sistemas BSD fornece definições e estruturas para trabalhar com o User Datagram Protocol (UDP) na camada de transporte do modelo de rede do Internet Protocol (IP). Ele define a estrutura do cabeçalho UDP e constantes relacionadas, como números de porta e protocolo UDP, bem como protótipos de função para várias operações UDP, como envio e recebimento de datagramas UDP. O arquivo de cabeçalho também inclui macros para lidar com a ordenação de bytes, o que é importante para garantir a interoperabilidade entre diferentes arquiteturas de computador que usam diferentes ordens de bytes.
Esta estrutura pode ser usada para acessar os diferentes campos de um cabeçalho UDP em um programa C
estrutura udphdr {
u_short uh_sport; /* porta de origem */
u_short uh_dport; /* Porto de destino */
u_short uh_ulen; /* comprimento do udp */
u_short uh_sum; /* soma de verificação udp */
};
A estrutura contém quatro campos:
- "uh_sport" é um número inteiro não assinado de 16 bits que representa o número da porta de origem do pacote UDP.
2 ."uh_dport" é um número inteiro não assinado de 16 bits que representa o número da porta de destino do pacote UDP.
-
"uh_ulen" é um número inteiro não assinado de 16 bits que representa o comprimento do pacote UDP (incluindo o cabeçalho e os dados).
-
"uh_sum" é um número inteiro não assinado de 16 bits que representa a soma de verificação do pacote UDP.
Cabeçalho PRUPD em C
Este código está definindo uma estrutura de linguagem C chamada prudphdr, que representa o cabeçalho do pacote PRUDP (Reliable Datagram Protocol da Nintendo). A estrutura contém o
estrutura prudphdr {
uint16_t uh_sport; /* reescrita da porta de origem (C 99 ) */
uint16_t uh_dport; /* Porto de destino */
uint16_t uh_ulen; /* comprimento do pruudp */
uint8_t uh_sum; /* soma de verificação prudp reescrita para 8 bits */
uint8_t uh_type; /* prudp digita mensagem */
uint16_t uh_seq_num; /* pacote de número seq prudp */
uint16_t uh_session_id; /* identificação de sessão */
uint32_t uh_timestamp;
uint16_t uh_payload_size; /* tamanho da carga útil para prdup */
};
C99
C99 é um padrão para a linguagem de programação C, publicado pela Organização Internacional de Padronização (ISO) em 1999. Ele introduziu vários novos recursos e melhorias na linguagem.
C99 também fez diversas alterações e esclarecimentos na sintaxe e semântica da linguagem. A padronização do C99 ajudou a aumentar a portabilidade e a confiabilidade do código C, pois forneceu uma especificação de linguagem mais consistente e previsível para os desenvolvedores seguirem.
Referências e links úteis
https://www.3dbrew.org/wiki/PRUDP#:~:text=PRUDP%20is%20a%20third%2Dparty,numbers%20and%20acknowledgement%20within%20UDP.
https://github.com/kinnay/NintendoClients/wiki/PRUDP-Protocol
https://svnweb.freebsd.org/base/stable/10/sys/netinet/udp.h?view=log