WaWeb canonical pipeline

Do socket à mensagem

Como o WhatsApp Web sai do nada e chega a mandar e receber uma mensagem: abre um canal seguro, pede autorização ao celular principal, autentica a sessão, baixa o estado da conta e troca mensagens.

Fluxo visual do pipeline

Mapa navegável do processo completo. Clique em qualquer caixa para abrir a página interna correspondente ao bloco analítico.

Como ler este relatório

O fluxo tem três níveis ao mesmo tempo. O WebSocket carrega frames binários; alguns frames viram stanzas, que são as mensagens estruturadas do protocolo; o relatório usa a sequência do pipeline para preservar a ordem exata em que tudo aconteceu.

Pipeline seq

Número do evento na linha do tempo completa. Inclui transporte, frames, Noise e stanzas.

Direções

C → S é cliente para servidor. S → C é servidor para cliente.

Frame

Pacote binário bruto que passa pelo WebSocket. Antes da primeira stanza, ele é usado pelo Noise.

Stanza

Mensagem estruturada do WhatsApp. Tem direção, tag, atributos e filhos.

Noise vs. Signal

Noise protege o canal WebSocket. Signal protege o conteúdo das mensagens ponta a ponta.

Observado vs. inferido

Observado vem direto da captura. Inferido é interpretação do papel daquele evento no fluxo.

Cliente WaWebO aparelho Web que queremos reproduzir em C#.
ServidorO WhatsApp, que aceita sockets, autentica e entrega stanzas.
Celular principalA linha que autoriza o pareamento pelo PairCode.
Celular auxiliarO aparelho de teste que dispara a mensagem recebida no fim.
Captura canônicaO cliente oficial observado, usado como referência para o C#.
Ver linha narrativa e exemplo seguro
O navegador abre sockets quase em paralelo e usa os que carregam frames úteis. Noise negocia um canal cifrado antes de qualquer stanza aparecer. PairCode vincula o cliente como aparelho companion autorizado. A sessão reconecta, recebe success e inicia o bootstrap operacional. O cliente sincroniza chaves, dispositivos, perfil, privacidade e mensagens pendentes. A mensagem é enviada, replicada por fanout e uma mensagem externa é recebida.
Exemplo seguro de stanza fictícia
tag: message
direção: recv
attrs: [from, id, type]
children: [enc, reporting]
valores reais: ocultos

Mapa visual do fluxo

Socket Noise PairCode Auth Bootstrap Envio Recebimento
1 · Socket + Noise O navegador abre o canal e cria um túnel seguro com o servidor.
WebSocket criado ws-1 · HTTP upgrade · 101

O navegador chama o servidor do WhatsApp e mantém uma linha aberta para trocar dados.

Ver detalhes desta etapa
Primeiro cumprimento seguro (client_hello) frame sent · 43B

O navegador manda um primeiro cumprimento cifrado com uma chave descartável.

Ver detalhes desta etapa
Resposta segura (server_hello) frame recv · 350B

O servidor devolve sua parte para os dois lados fecharem o canal seguro.

Ver detalhes desta etapa
Canal seguro pronto (client_finish) frame sent · 372B

O navegador conclui a negociação. A partir daqui as stanzas trafegam cifradas.

Ver detalhes desta etapa
Primeiro WAP decodificado recv iq · pair-device

Primeiro nó WAP decodificado depois do canal seguro abrir.

Ver detalhes desta etapa
2 · PairCode O navegador prova ao celular principal que pode entrar como aparelho companion.
pair-device S → C · refs de pareamento

O servidor manda referências temporárias para combinar com o celular principal.

Ver detalhes desta etapa
companion reg C → S · stage + JID/chaves

O navegador se apresenta em etapas e envia suas chaves de identidade.

Ver detalhes desta etapa
country + ref S → C · country_code + ref

O servidor informa o país do número e devolve uma nova referência.

Ver detalhes desta etapa
primary hello S → C · notification; depois C → S · ack

O celular principal entra na conversa; o navegador confirma que recebeu.

Ver detalhes desta etapa
pair-success S → C · pair-success; depois C → S · pair-device-sign

O servidor autoriza o novo aparelho; o navegador assina como prova.

Ver detalhes desta etapa
3 · Auth A sessão recém-criada é apresentada e aceita pelo servidor.
Troca de canal stream:error · xmlstreamend

O servidor encerra o canal antigo. A sessão real entra no canal seguinte.

Ver detalhes desta etapa
Novo socket ws-4 · reconexão autenticada

O navegador abre nova conexão com os dados combinados no pareamento.

Ver detalhes desta etapa
Registro da sessão (add) C → S · sessão registrada

O navegador entrega ao servidor as credenciais da sessão recém-criada.

Ver detalhes desta etapa
Login aceito (success) S → C · lid, props, companion key

O servidor aceita a entrada e devolve identidade e regras de uso.

Ver detalhes desta etapa
4 · Bootstrap A conta baixa configurações, dispositivos e mensagens antigas, como um app abrindo pela primeira vez.
Capacidades e rotas media_conn · props · edge_routing

O navegador pergunta por onde mandar mídia, quais regras valem e onde estão os servidores.

Ver detalhes desta etapa
Registro e chaves registration · identity · skey

O navegador envia chaves descartáveis usadas para cifrar conversas futuras.

Ver detalhes desta etapa
Privacidade privacy · tos · notices

O servidor entrega termos, privacidade e avisos que fazem parte do estado da conta.

Ver detalhes desta etapa
Mensagens e dispositivos active · usync · offline · devices

O navegador descobre aparelhos vinculados e baixa mensagens que chegaram antes dele.

Ver detalhes desta etapa
Perfil e chaves picture · business_profile · tokens · key

O navegador puxa foto, perfil, tokens e chaves vigentes antes do envio.

Ver detalhes desta etapa
5 · Envio O cliente manda a mensagem; o attr device_fanout indica a provável cópia para outros aparelhos.
Mensagem principal stanza 165 · sent message · participants + device-identity

O navegador envia a primeira cópia cifrada da mensagem.

Ver detalhes desta etapa
Ack + receipt stanzas 169-176 · phash, recipient, receipt

Servidor e cliente trocam confirmações de processamento e recibos de estado.

Ver detalhes desta etapa
Preparação do fanout usync · key · query · sync

Antes de replicar, o navegador confere chaves e dispositivos atuais.

Ver detalhes desta etapa
Fanout stanza 188 · sent message · device_fanout · inferido

Observamos o attr device_fanout; a leitura é cópia para outros aparelhos.

Ver detalhes desta etapa
6 · Recebimento Outro celular manda mensagem para esta conta e o navegador recebe.
Auxiliar envia contexto externo · não é stanza

O celular auxiliar dispara a mensagem que aparecerá no WebSocket.

Ver detalhes desta etapa
Mensagem recebida stanza 200 · enc + url_text + url_number + reporting

Chega uma mensagem cifrada; o texto real só existiria depois de decifrar.

Ver detalhes desta etapa
Receipt stanza 201 · C → S

O navegador avisa ao servidor: recebeu.

Ver detalhes desta etapa
Sync pós-recebimento usync · identity · final list

Antes de encerrar a captura, o navegador confere identidades e contatos.

Ver detalhes desta etapa