CRC(Cyclic Redundancy Check, 순환 중복 검사)는 디지털 데이터의 오류를 감지하는 대표적인 기술로, 데이터 전송 과정에서 발생하는 오류를 효과적으로 탐지할 수 있습니다. 이 기술의 핵심 원리는 이진 나눗셈(binary division)에 있습니다.
이 기법에서는 순환 중복 검사 비트(CRC 비트), 즉 일련의 중복 비트(redundant bits)가 사용됩니다. 이 비트들은 데이터 단위(data unit)의 끝에 덧붙여져, 최종적으로 생성된 데이터 단위가 사전에 약속된 특정 이진수로 정확하게 나누어 떨어지도록 만듭니다.
수신 측에서는 도착한 데이터를 송신 측과 동일한 이진수로 나눕니다. 이때 나머지가 0이라면 데이터가 전송 중 손상되지 않았다고 판단하고 정상적으로 수신을 진행합니다.
반대로 나머지가 존재한다면 전송 과정에서 오류가 발생하여 데이터 단위가 손상되었음을 의미합니다. 따라서 해당 데이터 단위는 수신을 거부하고 폐기(discard)됩니다.
CRC의 주요 특징
- 비교적 간단한 연산만으로 높은 오류 탐지율을 제공합니다.
- 연속된 비트 오류(burst error) 탐지에 특히 효과적입니다.
- 이더넷, Wi-Fi, USB 등 다양한 통신 프로토콜에서 널리 활용되고 있습니다.
예제 코드
아래 예제는 파이썬의 pycrc 라이브러리를 활용하여 송신 측(Sender), 채널(Channel), 수신 측(Receiver)의 CRC 동작 과정을 단계별로 보여줍니다.
from pycrc.crclib import *
def main():
#-----------------------------------------------------------------------------
# 송신 측(Sender Side)
div = str(input("Input divisor in binary type: "))
# user_dataword = str(raw_input("Input dataword in binary type: "))
userdataword = '1001'
print("\nSender:")
sen = Sender(bin2dec(userdataword), div)
sen.send()
print("arg_dataword:", sen.arg_dataword2)
print("remainder:", sen.remainder2)
print("codeword:", sen.codeword2)
#-----------------------------------------------------------------------------
# 채널(Channel)
print("\nChannel:")
ch = Channel(sen.codeword)
print("Through to the channel get channel codeword:", dec2bin(ch.ch_codeword))
#-----------------------------------------------------------------------------
# 수신 측(Receiver Side)
print("\nReceiver:")
rcv = Receiver(ch.ch_codeword, div)
rcv.receive()
print("syndrome:", rcv.syndrome2)
print("Discard or not?", rcv.discard)
print("rx_dataword:", rcv.rx_dataword2)
if __name__ == '__main__':
main()
실행 결과
Sender Input dataword in binary type 1010000 arg_dataword:1010000000 remainder: 011 codeword:1010000011 Receiver syndrome:1010000011 Discard or not? N rx_dataword:1010000011
실행 결과를 살펴보면, 송신 측은 데이터워드(dataword)에 CRC 비트를 붙여 코드워드(codeword)를 생성하고, 수신 측은 이를 검증하여 신드롬(syndrome) 값이 나머지 없이 나누어떨어질 경우 데이터를 정상적으로 수신함을 확인할 수 있습니다.