순환 중복 검사 CRC(cyclic redundancy check)

주고받는 데이터에 통신과정에서 발생한 오류가 없는지  검증하는 방법

일정한 바이트 형태의 데이터를 주고받는 과정에서

발신자는 사전에 지정한 값을 연산(XOR)한 나머지 값을 송신하는 데이터 마지막에 붙이고

수신자는 수신한 데이터에 동일한 연산을 거쳐서 결과값이 동일한지 (연산결과가 0인지) 확인.

 

1. CRC16-CITT

 → 체크섬에 일반적으로 쓰이는 연산 방식 중 하나

1) 발신자는 데이터에 다항식 0x1021을 XOR 연산한 나머지 값을 데이터 마지막에 2byte 형태로 추가.

2) 수신자는 수신한 데이터에 다항식 0x1021을 XOR 연산하여 나머지 값이 0이 나오는지 확인.

* XOR : 배타적 논리합. 비교하는 두 값이 같으면 0, 다르면 1

** 보안을 위해 다항식 연산 전에 발신자와 수신자가 사전에 정한 초기값으로

    데이터를 1차적으로 변환한 후 연산하기도 한다.

 

2. 다항식 0x1021의 의미

1) CRC16이라는 이름과 같이 16비트(2바이트)의 데이터를 사용

2) 다항식으로 표현 시 : x^16 + x^12 + x^5 + 1

3) 이진법으로 표시 시 : 1 0001 0000 0010 0001 

  → 이진법으로 표시하면 17비트가 되는데, 앞자리 1은 각단계에서 연산 확인 용으로만 쓰여서 생략한 것인지?

 

3. 연산 과정

1) 체크섬을 표시할 데이터 준비

 e.g. 0xF4 0x55 = 11110100 01010101

 *  예시는 2byte지만 적용 가능한 데이터 길이 제한 없음

 

2) 데이터 뒤에 0을 16자리 추가

  → 0xF4 0x55 0x00 0x00

  → 11110100 01010101 00000000 00000000

 

3) 데이터 앞자리부터 다항식 0x1021을 XOR 연산

4) 연산 결과 (나머지 값)

 → 1101 0101 0101 0101 = 0xD5 0x55

 

5) 발신할 데이터 뒤에 나머지 값을 붙인다.

 → 원본 : 0xF4 0x55

 → 발신 : 0xF4 0x55 0xD5 0x55

 

6) 수신자는 수신한 데이터로 동일한 연산을 시행한다.

  → 수신 데이터 : 0xF4 0x55 0xD5 0x55 = 11110100 01010101 11010101 01010101

 

7) 연산 결과

 → 0x00 0x00 = 00000000 00000000

 → 나머지값을 발신자가 채워서 보냈기 때문에 연산한 결과값이 0x00 0x00이 된다.

 

8) 결과값이 0x00 0x00이 아니라면 통신과정에서 문제가 발생했다는 의미

 

 

 

4. 목표

 1) CRC16의 연산과정을 엑셀 매크로 함수 형태로 구현하기

 2) 매크로 연산 효율 최적화

 사실, 이미 구현은 성공했는데, 그 과정에서 익힌 지식을 잊지 않기 위해 순차적으로 정리할 예정

Posted by 지마군
,

rss