APDU no IEC 104: comprimento, controle e leitura byte a byte
Aprenda a delimitar uma APDU IEC 104, interpretar 0x68, comprimento, octetos de controle, diferenciar I/S/U frames e detectar truncamento ou concatenação.
IEC 104: APDU, I/S/U e parâmetros que controlam a sessão
Como ler esta figura
APCI / Control Field
Controla formato I/S/U, estado lógico e numeração N(S)/N(R).
Na implementação: Sequência travada, ACK atrasado ou TESTFR repetitivo deve ser correlacionado com timers e janelas, não só com TCP.
I-format
Transporta ASDU e usa números de envio e recebimento para acompanhar a sequência.
Na implementação: Compare N(S) e N(R) nos dois sentidos para encontrar a primeira divergência ou ACK ausente.
S-format
Confirma recepção sem transportar uma ASDU.
Na implementação: É diretamente relacionado ao controle de fluxo e ao limiar w/t2.
U-format
Executa STARTDT, STOPDT e TESTFR para controlar/testar a transferência.
Na implementação: STARTDT não é comando de processo; é habilitação da transferência de dados IEC 104.
ASDU
Type ID, VSQ, COT, CA e IOA dão significado às medidas, estados, eventos e comandos.
Na implementação: TCP saudável com CA/IOA/COT errados continua sendo uma integração quebrada.
t0, t1, t2, t3, k e w
Definem estabelecimento, confirmações, ociosidade e janelas de mensagens.
Na implementação: Dimensione usando RTT real, carga e requisitos da aplicação; não copie defaults entre fabricantes sem validar.
Estrutura mínima para leitura de APDU
| Offset | Conteúdo | Como validar |
|---|---|---|
| 0 | start 0x68 | marca início da APDU |
| 1 | comprimento L | total da APDU deve ser L + 2 |
| 2–5 | quatro octetos de controle | classificar I, S ou U antes de decodificar |
| 6… | ASDU somente em I-frame | comparar Type ID, COT, CA e IOA |
| Stream TCP | uma ou várias APDUs remontadas | não usar fronteira do segmento como mensagem |
A leitura específica da APDU substitui qualquer repetição genérica da pilha completa.
APDU é a unidade visível da aplicação IEC 104
A Application Protocol Data Unit começa com o APCI e, somente nos I-frames, continua com uma ASDU. O primeiro octeto tem valor 0x68. O segundo informa quantos octetos seguem, contando os quatro octetos de controle e a eventual ASDU. Assim, o tamanho total observado no fluxo é o comprimento declarado mais dois. Essa conta simples identifica captura truncada, dissector desalinhado e implementação que anuncia tamanho incompatível.
TCP entrega um fluxo de bytes, não mensagens preservadas. Uma APDU pode atravessar mais de um segmento TCP, e várias APDUs podem estar no mesmo segmento. Portanto, “um pacote igual a uma mensagem” é uma suposição errada. O analisador deve remontar o stream e usar 0x68 mais o comprimento para delimitar cada unidade.
Os quatro octetos de controle classificam o frame
No I-frame, o bit menos significativo do primeiro octeto de controle é zero. Os dois primeiros octetos codificam N(S), e os dois seguintes codificam N(R), ambos deslocados um bit. No S-frame, os dois bits inferiores indicam o padrão supervisório e somente N(R) tem significado. No U-frame, os bits de função representam STARTDT, STOPDT ou TESTFR com indicação de ativação ou confirmação.
A leitura deve começar pelo padrão de bits e só depois converter números. Interpretar os pares de octetos como inteiros sem retirar o bit de tipo dobra artificialmente a sequência. Em campo, compare o valor decodificado pelo Wireshark com o cálculo manual de uma amostra para assegurar que filtro, endianidade e coluna customizada estão corretos.
Comprimento protege a análise, não a integridade do transporte
O campo de comprimento impede que o receptor confunda o final da APDU, mas não substitui os mecanismos do TCP. Segmento perdido é retransmitido pelo transporte; bytes corrompidos são tratados pelos controles inferiores. Se o stream chega completo e a aplicação encerra a conexão após uma APDU, investigue comprimento inválido, tipo não suportado ou estado protocolar, além de logs do par.
Uma APDU máxima demanda atenção a buffers de front-end, firewalls com inspeção e capturas com snaplen limitado. Quando o PCAP registra somente parte do payload, o erro “malformed” pode pertencer à captura, não ao equipamento. Verifique tamanho original versus capturado e repita com snaplen adequado antes de concluir defeito de implementação.
I-frame leva ASDU e participa da janela
Depois dos seis octetos iniciais, o I-frame apresenta Type ID, VSQ, Cause of Transmission, Common Address e os objetos de informação. N(S) identifica o envio desta ponta; N(R) confirma I-frames recebidos da outra. Uma APDU de dados pode simultaneamente transportar informação e reconhecer o sentido oposto, reduzindo S-frames quando há tráfego bidirecional.
Acompanhe o stream por direção. Sequência não deve ser misturada entre cliente e servidor. Registre N(S) inicial, progressão, reconhecimentos e quantidade pendente. Se k é alcançado, a origem deve aguardar confirmação; se w é alcançado no receptor, um reconhecimento precisa ser emitido conforme a temporização aplicável.
S-frame confirma sem carregar ASDU
S-frame existe para reconhecer I-frames quando não há I-frame de retorno capaz de carregar N(R). Ele é curto e não possui ASDU. Uma sequência de S-frames pode ser normal em tráfego predominantemente unidirecional. Ausência prolongada de confirmação, porém, faz o transmissor atingir janela ou t1 e pode levar ao encerramento.
No diagnóstico, meça desde o I-frame mais antigo ainda não confirmado até o S-frame ou I-frame que avança N(R). Diferencie atraso do aplicativo, fila na rede e retransmissão TCP. O momento em que o ACK TCP ocorre não equivale à confirmação IEC 104: são controles de camadas diferentes.
U-frame governa o estado da transferência
STARTDT act/con habilita dados de usuário após a conexão; STOPDT act/con interrompe a transferência; TESTFR act/con verifica a associação durante ociosidade. Esses comandos não carregam pontos. Se o TCP está estabelecido e o cliente nunca envia STARTDT, o servidor pode permanecer corretamente silencioso mesmo com GI configurada no SCADA.
Marque o instante de cada U-frame e valide o par correspondente. Confirmação ausente pode revelar estado incompatível, perda no sentido de retorno ou implementação bloqueada. TESTFR repetido sem resposta deve ser relacionado a t3 e t1, não interpretado apenas como “ping da aplicação”.
Filtros e exportação devem preservar contexto
Filtre primeiro pela conversa TCP e depois pelos campos IEC 104. Salve N(S), N(R), tipo do frame, Type ID, COT, CA e IOA como colunas. Exportar apenas um pacote remove a progressão necessária para interpretar confirmação e temporizador. Preserve alguns segundos antes da primeira anomalia e todo o período até a recuperação.
Em redes com NAT, relacione endereços vistos em cada ponto de captura. O mesmo stream pode aparecer com tuplas diferentes. Use número de sequência TCP, tempo e conteúdo da APDU para correlacionar, sem publicar endereços ou dados operacionais em evidências externas.
Teste controlado valida o parser e o equipamento
Crie uma sessão limpa, execute STARTDT, GI e uma mudança de ponto. Para cada APDU, confira 0x68, tamanho, controle, presença de ASDU e sequência. Em seguida provoque fragmentação TCP e agregação de APDUs sem alterar o conteúdo lógico. O receptor deve remontar corretamente, demonstrando que não depende da fronteira do segmento.
Inclua comprimento inválido e frame inesperado apenas em laboratório isolado. Registre se a implementação descarta, responde ou encerra a sessão. O aceite não exige tolerar mensagem fora da norma; exige comportamento determinístico, log útil e recuperação sem afetar outras associações.
Referências técnicas e normas
As explicações do Portal são autorais. Normas e fontes oficiais são priorizadas; materiais acadêmicos e documentação pública de fabricantes complementam a implementação e não substituem a edição normativa aplicável ao projeto.
- IEC 60870-5-104:2006+AMD1:2016 CSV — Network access for IEC 60870-5-101 — IEC. Companion standard consolidado do IEC 104; inclui o corrigendum publicado em 2023.
- IEC 60870-5-101:2003+AMD1:2015 CSV — Basic telecontrol tasks — IEC. Companion standard consolidado do IEC 101 para telecontrole serial.
- IEC 60870-5-1:1990 — Transmission frame formats — IEC. Formatos de quadro e requisitos de integridade usados pela família IEC 60870-5.
- IEC 60870-5-2:1992 — Link transmission procedures — IEC. Procedimentos de transmissão da camada de enlace, especialmente pertinentes ao IEC 101.
- IEC 60870-5-3:1992 — General structure of application data — IEC. Regras para estruturar unidades de dados de aplicação.
- IEC 60870-5-5:1995 — Basic application functions — IEC. Funções básicas de aplicação, incluindo aquisição, comandos e sincronização.
- IEC 60870-5-6:2006 — Guidelines for conformance testing — IEC. Método para ensaios de conformidade dos companion standards IEC 60870-5.
- IEC TS 60870-5-601:2015 — Conformance test cases for IEC 101 — IEC. Casos de ensaio de conformidade para implementações IEC 101.
- IEC TS 60870-5-604:2016 — Conformance test cases for IEC 104 — IEC. Casos de ensaio positivos e negativos para implementações IEC 104.
- IEC TS 60870-5-7:2025 — Security extensions for IEC 101/104 — IEC. Extensões de segurança alinhadas à série IEC 62351 para autenticação, integridade e RBAC.
- Wireshark User’s Guide — Wireshark Foundation. Documentação oficial de captura, filtros, estatísticas e interpretação da interface do analisador.
Continue estudando
Os próximos conteúdos foram escolhidos para formar uma sequência técnica, relacionando fundamento, configuração, diagnóstico e aplicação.