Checksum — 송신 데이터 뒤에 붙여 전송하는 작은 에러 검출 값. Parity를 바이트(또는 워드) 단위로 확장해 검출 능력을 높인다. LIN 통신 등이 기본 보호 수단으로 채택.
주요 알고리즘
LRC (Longitudinal Redundancy Check)
- Word 또는 Byte 단위로 모든 데이터를 XOR한 값이 LRC.
- 결과가 Even Parity 역할.
- 변형: XOR 값의 2의 보수를 취하면 Odd Parity 역할.
Sum Complement
- 모든 데이터를 Byte 단위로 더한 후 2의 보수를 취함 (자리 올림수 무시).
- 2의 보수는 NOT 연산과 동일 (, 여기서는 +1 생략 변형도 존재).
- 변형:
- 합의 값을 그대로 사용 (2의 보수 미사용, 자리 올림수 버림).
- 합 및 자리 올림 값의 합 — LIN 통신 Checksum 방식.
Fletcher’s Checksum, Adler-32
- Sum Complement의 한계(순서 변경·all-zero 삽입 미검출)를 극복하기 위해 설계된 변종.
- 실제로는 자동차 네트워크에서는 더 강력한 CRC가 지배적.
XOR 연산 기초
| X | Y | X ⊕ Y |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Bitwise XOR: 11100011 ⊕ 11001100 = 00101111.
Sum Complement 검증 절차
수신측은 수신 데이터로 Checksum을 재계산한 후 수신된 Checksum 값과 XOR.
- XOR 결과 = 0 → 데이터 이상 없음 (Checksum 일치).
- XOR 결과 ≠ 0 → 데이터 이상 있음 → 수신 데이터 버림.
예시 (Data = [0xC9, 0xAA, 0xCC, 0xE3, 0xDC])
- 합:
0xC9 + 0xAA + 0xCC + 0xE3 + 0xDC의 하위 바이트 → 2의 보수 = Checksum. - 수신측 재계산 후 수신 Checksum과 XOR → 0이면 정상.
LIN 통신 Checksum
LIN은 자리 올림(carry)까지 포함한 덧셈을 사용하는 Sum Complement 변형을 채택.
계산 예시
- 전송 데이터:
[0x4A, 0x55, 0x93, 0xE5]. - 각 바이트 누적 덧셈 (자리 올림 포함), 결과의 보수 취해 Checksum = 0x19.
- 수신측 검증: 계산한 Checksum(0x19) + 수신된 Checksum 값(0xE6) = 0xFF → 정상.
- 결과가 0xFF가 아니면 비정상.
자세한 LIN 물리 계층은 LIN 참조.
한계
Sum Complement 기반 Checksum의 검출 실패 사례:
- Word/Byte 단위 데이터의 순서가 변경된 경우 — 합이 같으므로 감지 불가.
- 모든 비트가 0인 데이터가 추가된 경우 — 합이 변하지 않아 감지 불가.
- 오류 비트가 상쇄되어 Checksum이 그대로 유지되는 경우.
이런 한계 때문에 실제 차량 고신뢰 버스에서는 CRC를 쓴다. Checksum은 LIN(저속 저신뢰) 수준에서만 주 보호 수단.
실제 응용 예시
TOF Sense (레이저 센서)
- UART 통신으로 데이터 송수신.
- 마지막 Byte에 모든 데이터의 합을 Checksum으로 전송.
- 수신측에서 Checksum 검증 후 정상이면 센서 값 사용.