Document observed REG3 frame structure
This commit is contained in:
@@ -0,0 +1,167 @@
|
|||||||
|
# Analyse observable du flux Arkteos REG3
|
||||||
|
|
||||||
|
## Périmètre et méthode
|
||||||
|
|
||||||
|
Cette analyse porte exclusivement sur :
|
||||||
|
|
||||||
|
- `captures/stream_normal.bin` ;
|
||||||
|
- `references/arkteos_nodered_flow.json` ;
|
||||||
|
- `AGENTS.md`.
|
||||||
|
|
||||||
|
Les offsets sont relatifs au début d'une trame présumée, indexés à zéro, et
|
||||||
|
exprimés en décimal puis en hexadécimal. Les conclusions portant sur le
|
||||||
|
découpage sont établies à partir des octets de la capture, pas à partir de
|
||||||
|
limites de lectures TCP.
|
||||||
|
|
||||||
|
## Résumé
|
||||||
|
|
||||||
|
| Élément | Observation |
|
||||||
|
|---|---:|
|
||||||
|
| Taille totale de la capture | 43 165 octets (`0xA89D`) |
|
||||||
|
| Occurrences de `55 00` | 267 |
|
||||||
|
| Occurrences de chaque taille | 95 : 89 ; 163 : 89 ; 227 : 89 |
|
||||||
|
| Cycles complets observés | 89 |
|
||||||
|
| Ordre | `227 → 163 → 95`, sans exception dans cette capture |
|
||||||
|
|
||||||
|
La capture commence par `55 00` à l'offset global 0 (`0x0000`). Toutes les
|
||||||
|
occurrences suivantes sont séparées de la précédente par 227, 163 ou 95
|
||||||
|
octets. La dernière occurrence commence à l'offset global 43 070 (`0xA83E`) ;
|
||||||
|
les 95 octets restants terminent exactement la capture. Ces positions
|
||||||
|
partitionnent donc entièrement cette capture en 267 segments.
|
||||||
|
|
||||||
|
## Types et tailles observés
|
||||||
|
|
||||||
|
| Taille totale | Taille hex. | Occurrences | Nom dans le flow | Valeur observée à 8 (`0x08`) |
|
||||||
|
|---:|---:|---:|---|---:|
|
||||||
|
| 95 | `0x005F` | 89 | aucune branche de parsing | `0x0C` |
|
||||||
|
| 163 | `0x00A3` | 89 | `frigo` | `0x0A` |
|
||||||
|
| 227 | `0x00E3` | 89 | `regulation` | `0x0B` |
|
||||||
|
|
||||||
|
Le flow identifie `frigo` et `regulation` uniquement à partir de la taille du
|
||||||
|
buffer reçu (163 ou 227). Il ne contient pas de parsing pour 95 octets. Le nom
|
||||||
|
fonctionnel du type de 95 octets n'est donc pas déterminé par les trois fichiers
|
||||||
|
analysés.
|
||||||
|
|
||||||
|
## Signatures et en-têtes
|
||||||
|
|
||||||
|
Les 16 premiers octets sont invariants pour les 89 occurrences de chaque taille
|
||||||
|
dans cette capture :
|
||||||
|
|
||||||
|
| Taille | Octets 0–15 (`0x00–0x0F`) |
|
||||||
|
|---:|---|
|
||||||
|
| 95 | `55 00 58 FF A7 40 02 02 0C 00 50 00 00 00 00 00` |
|
||||||
|
| 163 | `55 00 9C FF 63 40 02 04 0A 00 94 00 00 00 00 00` |
|
||||||
|
| 227 | `55 00 DC FF 23 40 02 04 0B 00 D4 00 01 00 00 00` |
|
||||||
|
|
||||||
|
### Différences observables dans l'en-tête
|
||||||
|
|
||||||
|
| Offset déc. | Offset hex. | 95 octets | 163 octets | 227 octets | Observation |
|
||||||
|
|---:|---:|---:|---:|---:|---|
|
||||||
|
| 0 | `0x00` | `55` | `55` | `55` | commun |
|
||||||
|
| 1 | `0x01` | `00` | `00` | `00` | commun |
|
||||||
|
| 2 | `0x02` | `58` | `9C` | `DC` | distingue les trois tailles dans cette capture |
|
||||||
|
| 3 | `0x03` | `FF` | `FF` | `FF` | commun |
|
||||||
|
| 4 | `0x04` | `A7` | `63` | `23` | distingue les trois tailles dans cette capture |
|
||||||
|
| 5 | `0x05` | `40` | `40` | `40` | commun |
|
||||||
|
| 6 | `0x06` | `02` | `02` | `02` | commun |
|
||||||
|
| 7 | `0x07` | `02` | `04` | `04` | 95 distinct de 163 et 227 |
|
||||||
|
| 8 | `0x08` | `0C` | `0A` | `0B` | valeur distincte par taille dans cette capture |
|
||||||
|
| 9 | `0x09` | `00` | `00` | `00` | commun |
|
||||||
|
| 10–11 | `0x0A–0x0B` | `50 00` | `94 00` | `D4 00` | entier little-endian corrélé à la taille |
|
||||||
|
| 12 | `0x0C` | `00` | `00` | `01` | 227 distinct dans cette capture |
|
||||||
|
| 13–15 | `0x0D–0x0F` | `00 00 00` | `00 00 00` | `00 00 00` | commun |
|
||||||
|
|
||||||
|
Les octets 2 (`0x02`) et 4 (`0x04`) ont aussi la relation observée
|
||||||
|
`octet[2] + octet[4] = 0xFF` pour les trois signatures. Cette relation ne
|
||||||
|
démontre ni checksum ni signification fonctionnelle.
|
||||||
|
|
||||||
|
## Hypothèse de détection de longueur
|
||||||
|
|
||||||
|
L'entier non signé little-endian aux offsets 10–11 (`0x0A–0x0B`) a les valeurs
|
||||||
|
suivantes pour toutes les occurrences de chaque type :
|
||||||
|
|
||||||
|
| Taille totale observée | Valeur de `octets[10:12]` LE | Écart |
|
||||||
|
|---:|---:|---:|
|
||||||
|
| 95 | 80 (`0x0050`) | 15 (`0x000F`) |
|
||||||
|
| 163 | 148 (`0x0094`) | 15 (`0x000F`) |
|
||||||
|
| 227 | 212 (`0x00D4`) | 15 (`0x000F`) |
|
||||||
|
|
||||||
|
**Hypothèse probable :** dans cette capture, après lecture de 12 octets à
|
||||||
|
partir de `55 00`, la taille totale peut être calculée comme
|
||||||
|
`little_endian_u16(offset 10) + 15`.
|
||||||
|
|
||||||
|
Cette corrélation est vérifiée sur les 267 segments observés. Elle n'établit
|
||||||
|
pas le nom ou la sémantique de ce champ, ni sa validité pour d'autres versions,
|
||||||
|
types ou états de la PAC. Elle ne constitue pas une preuve d'un champ longueur
|
||||||
|
défini par le protocole.
|
||||||
|
|
||||||
|
La valeur à l'offset 8 (`0x08`) est une seconde signature probable de type :
|
||||||
|
`0x0A → 163`, `0x0B → 227`, `0x0C → 95` dans cette capture. Elle n'est pas une
|
||||||
|
preuve qu'il s'agit d'un identifiant de trame documenté.
|
||||||
|
|
||||||
|
## Séquence observée
|
||||||
|
|
||||||
|
Les 267 segments suivent exactement le motif répété :
|
||||||
|
|
||||||
|
```text
|
||||||
|
227, 163, 95, 227, 163, 95, … (89 répétitions)
|
||||||
|
```
|
||||||
|
|
||||||
|
Il n'y a ni répétition, ni inversion, ni omission dans la capture. Cela rend la
|
||||||
|
séquence régulière **pour cet échantillon**. Il n'est pas déterminé si elle est
|
||||||
|
obligatoire dans le protocole, si elle peut varier avec l'état de la PAC, ou si
|
||||||
|
des trames supplémentaires peuvent être intercalées.
|
||||||
|
|
||||||
|
## Ce qui est observé, probable et non déterminé
|
||||||
|
|
||||||
|
### Observé
|
||||||
|
|
||||||
|
- `55 00` apparaît 267 fois et permet une partition complète de cette capture.
|
||||||
|
- Les trois distances entre signatures sont exclusivement 95, 163 et 227.
|
||||||
|
- Chaque taille apparaît 89 fois, dans l'ordre cyclique indiqué.
|
||||||
|
- Les 16 octets d'en-tête listés sont constants pour chaque taille dans cet
|
||||||
|
échantillon.
|
||||||
|
- Le flow décode des champs aux offsets connus pour les segments de 163 et 227
|
||||||
|
octets ; il écarte les autres tailles.
|
||||||
|
|
||||||
|
### Probable, mais non spécifié
|
||||||
|
|
||||||
|
- `55 00` est une signature de début de segment dans ce flux.
|
||||||
|
- L'entier little-endian aux offsets 10–11 permet de calculer la taille totale
|
||||||
|
observée par addition de 15.
|
||||||
|
- L'octet à l'offset 8 distingue les trois catégories observées.
|
||||||
|
|
||||||
|
### Non déterminé
|
||||||
|
|
||||||
|
- La signification des octets d'en-tête, y compris 2, 4, 7, 8, 10–12.
|
||||||
|
- L'existence, la position ou l'algorithme d'un checksum.
|
||||||
|
- L'existence d'un champ longueur officiellement défini.
|
||||||
|
- La sémantique du segment de 95 octets.
|
||||||
|
- La stabilité des signatures, tailles et de l'ordre avec d'autres PAC,
|
||||||
|
versions logicielles ou états de fonctionnement.
|
||||||
|
- La relation entre les limites de cette capture et les lectures effectuées par
|
||||||
|
une socket TCP.
|
||||||
|
|
||||||
|
## Conséquences pour un extracteur TCP incrémental
|
||||||
|
|
||||||
|
TCP fournit un flux d'octets : une lecture peut contenir une fraction de
|
||||||
|
segment, un segment complet ou plusieurs segments. Le nœud Node-RED est réglé
|
||||||
|
en mode `stream`, mais son parser teste directement la taille de chaque message
|
||||||
|
reçu ; cette capture ne prouve pas que ce comportement soit sûr pour toutes les
|
||||||
|
segmentations TCP.
|
||||||
|
|
||||||
|
Un extracteur doit donc :
|
||||||
|
|
||||||
|
1. conserver les octets reçus dans un tampon persistant ;
|
||||||
|
2. rechercher `55 00` sans présumer que le début du tampon est une frontière ;
|
||||||
|
3. attendre au moins 12 octets avant d'évaluer l'hypothèse de taille ;
|
||||||
|
4. n'extraire un segment que lorsque la taille attendue est entièrement présente
|
||||||
|
dans le tampon ;
|
||||||
|
5. traiter les signatures ou tailles non observées comme non déterminées, sans
|
||||||
|
les faire passer au parser connu ;
|
||||||
|
6. prévoir une resynchronisation prudente si l'en-tête observé ne correspond
|
||||||
|
pas aux signatures documentées ici.
|
||||||
|
|
||||||
|
L'extracteur ne doit pas dépendre du cycle `227 → 163 → 95` pour délimiter les
|
||||||
|
segments : cette régularité est observée, mais non démontrée comme une règle de
|
||||||
|
protocole.
|
||||||
Reference in New Issue
Block a user