장비 통신 패킷 구조 이해하기: STX·ETX·Header·Address·Checksum 분석
STX부터 ETX까지 하나의 장비 Packet을 해부하기#
1장 HEX 한 줄도 규칙을 알면 문장처럼 읽을 수 있다#
장비 통신 Log에서 다음과 같은 데이터를 처음 보면 낯설게 느껴질 수 있습니다.
02 10 01 A0 05 01 31 32 33 34 35 7B 03그냥 숫자가 늘어서 있는 것처럼 보입니다.
하지만 Protocol의 규칙을 알고 있다면 다음처럼 나눌 수 있습니다.
02
→ STX
10
→ Header
01
→ Device Address
A0
→ Command
05
→ Length
01
→ Sequence
31 32 33 34 35
→ Payload
7B
→ Checksum
03
→ ETX갑자기 의미 없는 HEX가 하나의 문장처럼 보이기 시작합니다.
장비 Packet 분석에서 가장 중요한 것은 숫자를 외우는 것이 아니라 각 Byte가 어떤 역할을 맡고 있는지 경계를 찾는 것입니다.
2장 Packet과 Frame은 어디서 시작하고 어디서 끝날까#
Serial 통신은 기본적으로 Byte Stream으로 들어옵니다.
예를 들어 수신 Program에서는 다음처럼 보일 수 있습니다.
... 41 42 43 02 10 01 A0 05 01 31 32 33 34 35 7B 03 55 56 ...여기서 어느 부분이 하나의 Message인지 알아야 합니다.
Protocol이:
STX = 0x02
ETX = 0x03을 사용한다면:
02
↓
10 01 A0 05 01 31 32 33 34 35 7B
↓
03을 하나의 Frame으로 판단할 수 있습니다.
즉 STX와 ETX는 Packet의 경계를 찾는 방법 중 하나입니다.
3장 STX는 무엇인가#
STX는 Start of Text의 약자입니다.
ASCII Control Character에서 0x02가 STX로 정의되어 있기 때문에 많은 Legacy Device Protocol이 이를 Frame 시작 표시로 사용합니다.
예:
02 10 01 A0 ...
^^
STXReceiver는 Stream을 읽다가:
0x02를 발견하면:
새 Frame이 시작될 가능성이 있다.고 판단할 수 있습니다.
3.1 모든 Protocol이 0x02를 STX로 쓰는 것은 아니다#
중요합니다.
어떤 Protocol은:
0x02하나를 사용할 수 있지만 다른 Protocol은:
AA 55또는:
7E같은 별도의 Start Pattern을 사용할 수 있습니다.
또 어떤 Protocol은 아예 STX를 사용하지 않을 수도 있습니다.
따라서:
장비 Packet은 무조건 0x02로 시작한다.고 생각하면 안 됩니다.
4장 ETX는 무엇인가#
ETX는 End of Text의 약자입니다.
ASCII Control Character 0x03을 Frame 종료 표시로 사용하는 Protocol이 많습니다.
예:
02 10 01 A0 05 01 31 32 33 34 35 7B 03
^^
ETXReceiver는 ETX를 만나면:
하나의 Frame이 끝났다.고 판단할 수 있습니다.
4.1 ETX가 없는 Protocol도 많다#
예를 들어 다음처럼 Length만 사용하는 Protocol도 있습니다.
[HEADER][LENGTH][DATA][CRC]Receiver는 Length를 읽고:
앞으로 20 Byte를 더 읽으면
하나의 Frame이다.라고 판단합니다.
또 고정 길이 Frame을 사용할 수도 있습니다.
항상 16 Byte즉 Frame 경계는 크게:
Delimiter 기반
Length 기반
Fixed Length 기반
조합 방식으로 생각할 수 있습니다.
5장 Header는 Packet을 해석하기 위한 안내판이다#
Header에는 Packet을 해석하는 데 필요한 Metadata가 들어갈 수 있습니다.
예:
Protocol Version
Message Type
Device Address
Command
Length
Flags하지만 Header라는 이름의 고정된 구조가 존재하는 것은 아닙니다.
Protocol마다 완전히 다릅니다.
예를 들어:
02 10 01 A0 05 ...에서 0x10이 Protocol Version일 수도 있고 Message Type일 수도 있습니다.
정답은 Protocol Specification에서 확인해야 합니다.
6장 Device Address는 누구에게 보내는 Packet인지 알려준다#
RS-485처럼 여러 장비가 하나의 Bus를 공유하면 Address가 중요합니다.
예:
Master
│
├─ Device 01
├─ Device 02
├─ Device 03
└─ Device 04Packet:
02 10 03 A0 ...에서 Protocol이 세 번째 Byte를 Address로 정의했다면:
03번 Device를 대상으로 하는 Message일 수 있습니다.
6.1 Source와 Destination이 둘 다 있을 수도 있다#
일부 Protocol은:
Source Address
Destination Address를 모두 가질 수 있습니다.
예:
02 01 05 A0 ...
^^ ^^
│ │
│ Destination
Source이런 구조에서는 누가 누구에게 보냈는지 명확하게 구분할 수 있습니다.
7장 Command는 장비에게 무엇을 할지 알려준다#
Command Field는 Packet의 목적을 나타냅니다.
예를 들어 제조사가 다음처럼 정의했다고 가정해보겠습니다.
| Command | 의미 |
|---|---|
0x10 |
상태 조회 |
0x20 |
설정 조회 |
0x30 |
설정 변경 |
0x40 |
Event 보고 |
이때 Packet:
02 01 10 ...에서:
10은 상태 조회를 의미할 수 있습니다.
하지만 Command 값은 제조사 Protocol마다 완전히 다릅니다.
8장 Command가 같아도 Request와 Response가 다를 수 있다#
어떤 Protocol은 Request와 Response에 같은 Command Code를 사용합니다.
예:
Request
02 01 10 ...Response:
02 01 10 ...대신 Header의 Flag로 방향을 구분할 수 있습니다.
다른 Protocol은:
Request Command
0x10
Response Command
0x90처럼 별도 Code를 사용할 수도 있습니다.
따라서 Command 값 하나만 보고 Packet 방향을 단정해서는 안 됩니다.
9장 Length는 Parser에게 매우 중요한 정보다#
Length Field가 있다고 하겠습니다.
02 10 01 A0 05 01 31 32 33 34 35 ...
^^
Length0x05가 Payload Length라면 뒤에 정확히 5 Byte를 읽습니다.
31
32
33
34
35이렇게 Length를 이용하면 Parser는 Stream에서 Packet의 끝을 찾는 데 도움을 받을 수 있습니다.
9.1 Length가 무엇을 세는지 확인해야 한다#
매우 중요한 부분입니다.
어떤 Protocol은:
Payload Length만 셉니다.
다른 Protocol은:
Command + Payload길이를 나타낼 수도 있습니다.
또 다른 Protocol은:
STX부터 ETX까지 전체 Frame Length를 의미할 수도 있습니다.
그래서:
Length = 0x05만 보고 반드시 Payload 5 Byte라고 해석하면 안 됩니다.
Length의 기준 범위는 Protocol 문서에서 반드시 확인해야 합니다.
10장 Length가 잘못되면 전체 Stream 해석이 무너질 수 있다#
정상:
STX
LEN = 5
DATA = 5 Bytes
CHECK
ETX인데 손상으로 Length가:
LEN = 9가 되었다고 하겠습니다.
Parser는 원래 Packet 뒤에 있던 다음 Frame의 일부까지 Data로 읽을 수 있습니다.
Packet 1
──────────────┐
Packet 2 │
───────┐ │
└──────┘결과적으로 하나의 Byte 오류가 이후 여러 Frame의 Parsing 오류로 이어질 수 있습니다.
11장 Sequence Number는 Packet의 순서를 추적한다#
Sequence Number는 Packet에 번호를 붙이는 방식입니다.
예:
SEQ 01
SEQ 02
SEQ 03
SEQ 04수신 Log가:
01
02
04라면:
03이 빠졌다.고 판단할 수 있습니다.
11.1 Sequence Number는 TCP Sequence Number와 같은 것은 아니다#
개념적으로 순서를 관리한다는 점은 비슷하지만 구현 목적과 동작 방식은 다를 수 있습니다.
장비 Protocol에서는 단순히:
0 ~ 255범위의 1 Byte Counter를 사용할 수도 있습니다.
예:
FE
FF
00
01처럼 Overflow 후 다시 0으로 돌아갈 수도 있습니다.
11.2 Sequence가 반복되면 재전송일 수도 있다#
예:
SEQ 10
SEQ 11
SEQ 11
SEQ 1211이 두 번 보입니다.
가능한 원인:
재전송
응답 Timeout
장비 Restart
Sequence 관리 Bug등입니다.
Sequence Number 하나만으로 원인을 확정하지 말고 Timestamp와 Response Log를 함께 봅니다.
12장 Payload가 실제 업무 데이터다#
Payload는 장비가 실제로 전달하려는 Data입니다.
예:
31 32 33 34 35ASCII로 해석하면:
1 2 3 4 5즉:
"12345"가 됩니다.
예를 들어 카드 Reader라면 카드 ID일 수 있습니다.
12.1 Payload는 Command에 따라 구조가 달라질 수 있다#
CMD = 0x10일 때:
Temperature
Status를 담고,
CMD = 0x20일 때:
Device ID
Firmware Version을 담을 수 있습니다.
즉 Payload를 해석하려면 먼저 Command를 알아야 합니다.
Command
↓
Payload Format 결정입니다.
13장 Payload 안에도 여러 Field가 존재할 수 있다#
예를 들어 Payload 8 Byte가 다음과 같다고 하겠습니다.
01 02 07 E9 09 18 0A 1EProtocol이 다음처럼 정의할 수도 있습니다.
| Offset | 길이 | 의미 |
|---|---|---|
| 0 | 1 | 상태 |
| 1 | 1 | Sensor 번호 |
| 2 | 2 | 연도 |
| 4 | 1 | 월 |
| 5 | 1 | 일 |
| 6 | 1 | 시 |
| 7 | 1 | 분 |
이렇게 Packet 분석은 결국 Byte Offset과 Field Length를 읽는 작업입니다.
14장 Multi-byte 값에서는 Endianness도 중요하다#
2 Byte 값:
01 02가 있다고 하겠습니다.
Big Endian이면:
0x0102이고 Little Endian이면:
0x0201입니다.
Length, Timestamp, Register Value 같은 Multi-byte Field를 분석할 때 Byte Order를 확인해야 합니다.
15장 Checksum은 왜 필요한가#
전송 과정에서 Data가 손상될 수 있습니다.
송신:
10 20 30 40수신:
10 20 31 40한 Byte가 바뀌었습니다.
그런데 Packet에 Checksum이 있다면 Receiver는 Data가 정상인지 검사할 수 있습니다.
15.1 단순 합산 Checksum 예#
예를 들어 Protocol이 다음과 같이 정의되었다고 가정합니다.
Checksum
=
Data Byte 합계의 하위 8 BitData:
01 02 03이면:
01 + 02 + 03
=
06따라서 Checksum은:
06이 될 수 있습니다.
이것은 교육용 예이며 실제 Protocol마다 계산법이 다릅니다.
16장 Checksum이라고 항상 Byte 합계를 쓰는 것은 아니다#
Checksum이라는 이름 아래에서도 여러 방식이 있습니다.
예:
Sum
XOR
1's Complement
2's Complement
LRC따라서 Protocol 문서에서:
Checksum이라고만 써 있다면 정확한 Algorithm을 확인해야 합니다.
17장 CRC는 Checksum보다 복잡한 오류 검출 방식이다#
CRC는 Polynomial 연산을 이용해 Frame 손상을 검출합니다.
대표적으로 다음 요소가 Algorithm을 결정합니다.
Polynomial
Initial Value
Input Reflection
Output Reflection
Final XOR
Byte Order그래서:
CRC-16 사용이라는 정보만으로는 구현하기 부족할 수 있습니다.
17.1 CRC가 더 강력하다고 무조건 직접 선택하는 것은 아니다#
이미 제조사 Protocol이:
Checksum을 사용하도록 정의했다면 개발자가 임의로 CRC로 바꿀 수 없습니다.
장비 통신에서는:
더 좋은 Algorithm보다 서로 같은 Algorithm을 사용하는 것이 먼저입니다.
18장 ETX까지 확인해야 하나#
STX/ETX 기반 Protocol이라면 ETX도 중요한 Frame 검증 요소가 될 수 있습니다.
예:
02 ... CHECKSUM 03Length만큼 읽었는데 마지막에:
03이 없다면:
Frame 손상
Parsing 위치 오류
Byte 누락
잘못된 Length등을 의심할 수 있습니다.
19장 하나의 Packet을 실제로 해부해보자#
예시 Packet:
02 10 01 A0 05 01 31 32 33 34 35 7B 03이를 Field별로 나눠보겠습니다.
| Offset | 값 | 의미 예시 |
|---|---|---|
| 0 | 02 |
STX |
| 1 | 10 |
Header / Version |
| 2 | 01 |
Device Address |
| 3 | A0 |
Command |
| 4 | 05 |
Payload Length |
| 5 | 01 |
Sequence |
| 6~10 | 31 32 33 34 35 |
Payload |
| 11 | 7B |
Checksum 예시 |
| 12 | 03 |
ETX |
이제 단순한 13 Byte가 아니라 하나의 구조로 보입니다.
20장 Payload를 ASCII로 바꾸면 무엇이 보일까#
Payload:
31 32 33 34 35는 ASCII Code 기준으로:
31 → 1
32 → 2
33 → 3
34 → 4
35 → 5입니다.
따라서:
"12345"가 됩니다.
이런 변환은 장비 Protocol 분석에서 매우 자주 사용합니다.
21장 모든 HEX를 ASCII로 바꾸면 안 된다#
다음 Packet:
02 10 01 A0 05 01 31 32 33 34 35 7B 03에서:
31 32 33 34 35는 Text Data일 수 있지만:
A0는 Command Code일 수 있습니다.
즉:
모든 Byte
→ ASCII로 바꾸면 오히려 의미가 이상해질 수 있습니다.
Field별 Encoding을 확인해야 합니다.
22장 Binary와 ASCII가 하나의 Packet 안에 섞일 수도 있다#
실제 장비 Protocol에서는 다음처럼 사용할 수 있습니다.
STX
Binary
Address
Binary
Command
Binary
Payload
ASCII
Checksum
Binary
ETX
Binary즉 하나의 Packet 안에서도 Encoding이 섞일 수 있습니다.
따라서 Packet 전체를 한 가지 방식으로 해석해서는 안 됩니다.
23장 Stream에서는 Packet이 한 번에 들어온다는 보장이 없다#
Application이 Serial Port에서 데이터를 읽는다고 하겠습니다.
송신 장비는:
02 10 01 A0 05 01 31 32 33 34 35 7B 03을 한 번 전송했습니다.
그런데 Application의 read()에서는 다음처럼 나뉘어 들어올 수도 있습니다.
첫 번째 read
02 10 01 A0두 번째:
05 01 31 32 33세 번째:
34 35 7B 03따라서 read() 한 번을 하나의 Packet이라고 가정하면 안 됩니다.
24장 반대로 여러 Packet이 한 번에 들어올 수도 있다#
예:
02 ... 03 02 ... 03 02 ... 03처럼 여러 Frame이 Receive Buffer에 한꺼번에 들어올 수 있습니다.
따라서 Parser는:
Receive
↓
Buffer에 누적
↓
Frame Boundary 탐색
↓
한 Frame 추출
↓
남은 Byte 유지방식으로 동작하는 것이 일반적입니다.
25장 Parser는 STX만 찾으면 끝나는 것이 아니다#
다음 Stream:
55 77 02 10 01 A0 05 ...에서 STX를 찾았습니다.
하지만 이후에도 다음을 검사해야 합니다.
Header 유효?
Length 정상?
최대 Packet Size 이내?
Checksum 정상?
ETX 정상?하나라도 맞지 않으면 잘못된 Frame일 수 있습니다.
26장 Payload 안에 STX나 ETX 값이 나오면 어떻게 할까#
매우 중요한 Protocol 설계 문제입니다.
Payload 안에 실제 Data로:
0x02또는:
0x03이 들어갈 수 있다고 하겠습니다.
Parser가 무조건:
0x03
=
Frame 종료라고 판단하면 Packet이 중간에서 잘립니다.
이 문제를 해결하는 방법에는 Protocol에 따라:
Length Field
Byte Stuffing
Escaping
COBS
SLIP 방식
특수 Encoding등이 있습니다.
27장 Escape 방식은 어떻게 동작할까#
예를 들어 Protocol에서:
0x02
0x03
0x10을 특수 문자로 예약했다고 가정합니다.
Payload에 0x03이 들어가야 한다면:
10 03처럼 Escape Sequence로 바꿔 전송할 수 있습니다.
Receiver는 다시 원래 Byte로 복원합니다.
정확한 방식은 Protocol마다 다릅니다.
28장 Length가 있으면 ETX가 필요 없을까#
반드시 그렇지는 않습니다.
어떤 Protocol은:
STX
Length
Data
Checksum
ETX처럼 둘 다 사용합니다.
왜 중복처럼 보이는 기능을 같이 사용할까요?
Parser가 여러 조건을 교차 확인할 수 있기 때문입니다.
STX 확인
Length 확인
Checksum 확인
ETX 확인을 모두 통과해야 정상 Frame으로 인정할 수 있습니다.
29장 Sequence가 빠졌다고 반드시 Packet 손실은 아니다#
Log:
SEQ 01
SEQ 02
SEQ 04가 있다고 하겠습니다.
03이 보이지 않습니다.
가능한 원인:
Packet Loss
Log 누락
Filtering
다른 통신 Channel
장비 Restart
Sequence 정책등이 있습니다.
따라서 Sequence Gap 하나만으로 통신선 문제라고 단정하지 않습니다.
30장 주차관제 현장에서 Packet은 어떻게 흐를까#
카드 Reader에서 카드가 인식됐다고 하겠습니다.
Packet:
STX
↓
Reader Address
↓
CARD_DETECTED
↓
Length
↓
Card ID
↓
Timestamp
↓
Checksum
↓
ETXController는 이를 수신하고:
Checksum 검사
↓
Address 확인
↓
Command 확인
↓
Card ID 추출
↓
권한 조회를 수행합니다.
그 다음 Response를 생성할 수 있습니다.
ALLOW또는:
DENY입니다.
31장 통신 성공과 실제 차단기 동작은 구분한다#
Controller가 Gate에 Open Command를 전송했다고 하겠습니다.
OPEN_GATEGate Controller가 ACK를 보냅니다.
ACK하지만 이것이 반드시:
차단기가 실제로 열렸다.는 뜻은 아닙니다.
실제 System은:
Command 수신
↓
ACK
↓
Relay 동작
↓
Motor 동작
↓
Open Sensor 감지
↓
OPEN_COMPLETE처럼 구성될 수 있습니다.
Packet 분석에서는 이 차이를 항상 고려해야 합니다.
32장 Timestamp도 Packet 분석에서 중요하다#
다음 Log를 생각해보겠습니다.
12:00:00.100 TX OPEN
12:00:00.120 RX ACK
12:00:03.500 EVENT OPENED이 기록을 보면:
통신 응답
20ms
실제 물리 동작
3.4초처럼 서로 다른 시간을 구분할 수 있습니다.
따라서 장비 Log에는 가능하면 정확한 Timestamp를 남기는 것이 좋습니다.
33장 Packet Log에는 Direction도 남겨야 한다#
다음 Log:
02 01 10 ...
02 01 90 ...만 보면 어느 것이 송신이고 어느 것이 수신인지 알기 어렵습니다.
따라서:
TX 02 01 10 ...
RX 02 01 90 ...처럼 Direction을 기록합니다.
더 좋게는:
Timestamp
Port
Direction
Raw HEX
Parsed Result를 같이 기록합니다.
34장 좋은 Packet Log의 예#
예:
2026-09-24 14:10:31.125
PORT: COM3
DIR : RX
RAW : 02 10 01 A0 05 01 31 32 33 34 35 7B 03
STX : 02
VERSION : 10
ADDRESS : 01
COMMAND : A0
LENGTH : 05
SEQUENCE : 01
PAYLOAD : "12345"
CHECKSUM : 7B
ETX : 03이런 Log는 장애 분석 속도를 크게 높입니다.
35장 개인정보가 Payload에 들어갈 수 있다#
Packet 안에는:
Card ID
차량번호
회원번호
전화번호
출입 기록등이 포함될 수 있습니다.
따라서 Debug Log라고 해서 무조건 원본 Packet을 장기간 저장하는 것은 적절하지 않을 수 있습니다.
필요에 따라:
Masking
Hashing
Access Control
Retention Policy
Encryption등을 적용합니다.
36장 Checksum Error가 발생하면 어디부터 볼까#
다음 순서로 확인합니다.
Checksum Algorithm
↓
Checksum 계산 범위
↓
Byte Order
↓
Length
↓
Payload
↓
Cable / Noise
↓
Baud / Parity
↓
Collision즉 Checksum Code만 의심하지 않습니다.
37장 Length Error가 발생하면 어디부터 볼까#
확인:
Length가 무엇을 세는가?
Header 포함?
Payload만?
Checksum 포함?
ETX 포함?
Endian은?
Escape 전 길이인가?
Escape 후 길이인가?Length 정의 하나가 잘못되면 Parser 전체가 무너질 수 있습니다.
38장 STX는 보이는데 ETX가 계속 안 나온다면#
가능한 원인:
Byte Loss
잘못된 Length
ETX가 Payload 내부에서 Escape 처리됨
Serial 설정 오류
Noise
Parser Bug입니다.
무조건 송신 장비가 ETX를 안 보냈다고 결론 내리지 않습니다.
39장 ETX는 보이는데 STX가 없다면#
가능한 원인:
Capture 중간에서 시작
Receive Buffer 일부 누락
잘못된 Stream 위치
STX 손상
Parser가 앞 Frame을 놓침등입니다.
Streaming Protocol에서는 동기화를 다시 잡는 전략이 중요합니다.
40장 Parser는 오류 후 어떻게 복구해야 할까#
잘못된 Frame 하나 때문에 이후 모든 Data가 깨져서는 안 됩니다.
예를 들어:
STX 발견
↓
Length 비정상
↓
Frame 폐기
↓
다음 STX 검색같이 다시 Synchronization을 잡을 수 있습니다.
이를 Resynchronization이라고 생각하면 됩니다.
41장 무한정 Length를 믿으면 안 된다#
손상된 Length 값이:
65535로 들어왔다고 하겠습니다.
Parser가 실제로 65535 Byte를 기다리면 Buffer 문제가 생길 수 있습니다.
따라서 Protocol Parser에는:
Maximum Frame Size같은 제한이 필요합니다.
예:
if length > 1024:
frame_error처럼 방어적으로 처리할 수 있습니다.
42장 Packet Parser는 상태 기계로 만들기 좋다#
개념적으로:
WAIT_STX
↓
READ_HEADER
↓
READ_LENGTH
↓
READ_PAYLOAD
↓
READ_CHECKSUM
↓
WAIT_ETX
↓
VALIDATE같은 State Machine을 사용할 수 있습니다.
오류 발생 시:
RESET
↓
WAIT_STX로 돌아갑니다.
이 방식은 Serial Stream Parser를 안정적으로 구현하는 데 유용합니다.
43장 하나의 Packet을 분석하는 기본 순서#
Raw Data를 받으면 다음 순서로 봅니다.
1. Frame 시작 위치 찾기
↓
2. Header 구조 확인
↓
3. Address 확인
↓
4. Command 확인
↓
5. Length 확인
↓
6. Sequence 확인
↓
7. Payload 분리
↓
8. Encoding 확인
↓
9. Checksum / CRC 검증
↓
10. Frame 종료 확인44장 여러 Packet을 비교하면 Protocol이 보인다#
예:
02 10 01 A0 05 01 31 32 33 34 35 7B 03
02 10 02 A0 05 02 31 32 33 34 36 7D 03
02 10 03 B0 02 03 01 00 4A 03여러 Sample을 비교하면:
항상 같은 값
장비마다 바뀌는 값
Command마다 바뀌는 값
Length에 따라 이동하는 값을 찾을 수 있습니다.
Protocol 분석에서 하나의 Frame보다 여러 조건의 Frame 비교가 훨씬 중요합니다.
45장 흔히 하는 잘못된 판단#
45.1 STX는 항상 0x02다#
아닙니다.
Protocol마다 Frame 시작 방식이 다릅니다.
45.2 ETX가 있으면 Length는 필요 없다#
둘을 함께 사용하는 Protocol도 있습니다.
45.3 Length는 항상 Payload 길이다#
아닙니다.
어떤 범위를 세는지 Protocol마다 다릅니다.
45.4 모든 Payload는 ASCII다#
Binary·BCD·Integer·Bit Field 등 다양한 형식을 사용할 수 있습니다.
45.5 Checksum은 단순 합산이다#
다양한 Algorithm이 존재합니다.
45.6 CRC가 틀리면 CRC Code 문제다#
전송 과정에서 Byte가 손상됐을 수도 있습니다.
45.7 Sequence가 하나 빠지면 Packet Loss가 확실하다#
Log 누락이나 Protocol 정책 등 다른 원인도 가능합니다.
46장 Packet 분석 체크리스트#
□ STX 또는 Frame 시작 규칙을 확인했는가?
□ Header 길이가 고정인지 가변인지 확인했는가?
□ Source·Destination Address 구조를 확인했는가?
□ Command Code 표를 확보했는가?
□ Length가 어느 범위를 의미하는지 확인했는가?
□ Multi-byte 값의 Endianness를 확인했는가?
□ Sequence Number의 증가 규칙을 확인했는가?
□ Payload Encoding을 확인했는가?
□ Checksum 또는 CRC Algorithm을 확인했는가?
□ Checksum 계산 범위를 확인했는가?
□ ETX 또는 종료 규칙을 확인했는가?
□ Payload 내부에 Delimiter가 들어갈 수 있는지 확인했는가?
□ Escape 규칙을 확인했는가?
□ 최대 Frame Length를 확인했는가?
□ Timestamp와 TX/RX Direction을 기록했는가?47장 자기 점검#
47.1 STX와 ETX는 무엇을 위한 것인가#
Byte Stream에서 하나의 Frame이 시작하고 끝나는 위치를 식별하는 데 사용할 수 있습니다.
47.2 Length가 왜 중요한가#
Parser가 Payload 또는 Frame의 크기를 판단하고 정확한 경계를 찾는 데 사용됩니다.
47.3 Sequence Number는 왜 사용하는가#
Frame 순서, 누락, 중복 또는 재전송을 추적하는 데 활용할 수 있습니다.
47.4 Checksum과 CRC의 역할은 무엇인가#
전송 과정에서 Frame Data가 손상되었는지 검출하는 데 사용합니다.
47.5 Packet을 분석할 때 가장 먼저 해야 할 일은 무엇인가#
각 Byte의 의미를 추측하기 전에 해당 Protocol이 Frame의 시작과 끝을 어떻게 정의하는지 확인하는 것입니다.
48장 이 글을 마치며#
처음에는:
02 10 01 A0 05 01 31 32 33 34 35 7B 03같은 HEX 데이터가 의미 없는 숫자처럼 보입니다.
하지만 구조를 나누면:
STX
↓
Header
↓
Device Address
↓
Command
↓
Length
↓
Sequence
↓
Payload
↓
Checksum
↓
ETX라는 하나의 Message가 됩니다.
이 과정에서 중요한 것은 각 Byte를 무작정 해석하는 것이 아닙니다.
먼저:
Frame의 시작은 어디인가?
Frame의 끝은 어디인가?
Length는 무엇을 의미하는가?
Command에 따라 Payload가 어떻게 달라지는가?
Checksum은 어떤 범위를 검사하는가?를 확인해야 합니다.
특히 다음 다섯 가지를 기억하면 됩니다.
STX와 ETX는 Frame 경계를 표시하는 방법 중 하나이며 모든 Protocol이 사용하는 것은 아닙니다.
Length는 Payload 길이일 수도 있고 전체 Frame 길이일 수도 있으므로 Protocol 정의를 확인해야 합니다.
Payload의 의미는 Command에 따라 달라질 수 있고 Binary와 ASCII가 한 Frame 안에 섞일 수도 있습니다.
Checksum이나 CRC Error는 Algorithm 문제뿐 아니라 Noise·Byte 손실·Serial 설정 오류 같은 하위 계층 문제에서도 발생할 수 있습니다.
Serial이나 TCP의 한 번의 read 결과가 반드시 하나의 Packet과 일치하는 것은 아니므로 Stream Parser가 필요합니다.
결국 Packet을 해부한다는 것은 HEX 값을 많이 외우는 일이 아닙니다.
Byte Stream에서 하나의 Frame을 정확하게 찾아내고, 각 Field의 위치와 길이, 의미, 검증 관계를 순서대로 복원하는 것이 핵심입니다.