CRC(Cyclic Redundancy Check, 순환 중복 검사)

1. CRC의 핵심 원리

CRC는 송신측과 수신측이 동일한 생성 다항식($G(x)$)을 공유한다는 점을 이용합니다.

  • 송신측 : 데이터 비트열을 생성 다항식으로 나누어 나머지를 구합니다. 이 나머지를 FCS(Frame Check Sequence)라고 하며, 원래 데이터 뒤에 붙여서 보냅니다.
  • 수신측 : 받은 전체 비트열을 동일한 생성 다항식으로 나눕니다.
  • 나머지가 0이면 : 오류 없음 (통과)
  • 나머지가 0이 아니면 : 전송 중 오류 발생 (폐기)

 

2. 오류 검출 vs 오류 정정 비교

CRC를 제대로 이해하려면 오류 검출(Detection)과 오류 정정(Correction)의 메커니즘 차이를 아는 것이 중요합니다.

구분 오류 검출 (Error Detection) 오류 정정 (Error Correction)
핵심 목적 데이터에 에러가 있는지 여부 확인 에러의 위치를 찾아 올바른 값으로 수정
대표 방식 CRC, Parity Check, Checksum Hamming Code, Reed-Solomon
오버헤드 상대적으로 적음 (검사 비트 소량 필요) 매우 큼 (위치 파악을 위해 많은 비트 필요)
후속 조치 ARQ(재전송 요청)를 통해 해결 수신측에서 자체 수정 (FEC, 전진 오류 정정)
효율성 에러 발생률이 낮을 때 유리 에러 발생률이 높거나 재전송이 힘들 때 유리

 

3. 다른 검출 방식과의 차이점 (CRC vs Checksum vs Parity)

  • Parity Check : 가장 단순한 방식. 1비트 에러만 검출 가능하며, 짝수 개의 비트 에러가 동시에 나면 감지하지 못합니다.
  • Checksum : 주로 전송 계층(TCP/UDP)이나 네트워크 계층(IP)에서 사용합니다. 데이터를 일정 단위로 나누어 합산한 값을 이용하며, CRC보다 연산 부담은 적지만 검출 능력은 상대적으로 낮습니다.
  • CRC : 데이터 링크 계층(L2)에서 주로 사용합니다. 비트 단위의 버스트 에러(Burst Error, 연속된 에러) 검출 능력이 매우 뛰어나 신뢰성이 높습니다.

 

4. 왜 CRC는 오류 정정을 하지 않을까?

CRC는 "어딘가 잘못되었다"는 것은 확실히 알지만, "몇 번째 비트가 틀렸다"는 위치 정보까지는 제공하지 않습니다. 이론적으로는 가능할 수 있으나, 정정을 위한 계산 복잡도와 추가 비트 소모를 고려할 때, "틀리면 그냥 다시 보내달라고 하자(ARQ)"는 방식이 네트워크 효율성 면에서 더 이득이기 때문입니다. 

 

5. CRC 계산 시 주의할 점

시험에서 CRC 계산 문제를 풀 때는 다음 세 가지만 기억하세요.

  • XOR 연산 : CRC 나눗셈은 일반 산술 나눗셈이 아니라 Modulo-2 연산(XOR)을 사용합니다.
    즉, 뺄셈 대신 자릿수가 같으면 0, 다르면 1을 씁니다. (내림수가 없음)
  • 0의 추가 : 데이터 뒤에 붙이는 0의 개수는 생성 다항식의 최고 차수와 같습니다. (예: $x^3 + 1$이면 0을 3개 추가)
  • 나머지(FCS)의 길이 : 최종 FCS 비트 수는 생성 다항식의 최고 차수와 일치해야 합니다. (비트열이 부족하면 앞을 0으로 채움)

 

6. 비트열과 CRC다항식을 상호변환하는 법(시험빈출)

 

비트열 → CRC 다항식 변환

비트열의 각 자릿수를 오른쪽에서 왼쪽 방향으로 $x^0$부터 시작하여 지수를 부여합니다. 비트가 1인 위치의 항만 남기면 됩니다.

 

예시 : 비트열 101101

  • 자릿수 매칭 : 1(5번 자릿수) 0(4번) 1(3번) 1(2번) 0(1번) 1(0번)
  • 지수 할당 : $1 \cdot x^5 + 0 \cdot x^4 + 1 \cdot x^3 + 1 \cdot x^2 + 0 \cdot x^1 + 1 \cdot x^0$
  • 다항식 정리 : $x^5 + x^3 + x^2 + 1$ (0이 곱해진 항은 생략, $x^0 = 1$)

 

CRC 다항식 → 비트열 변환

다항식에서 가장 높은 차수를 확인하여 전체 비트 길이를 결정한 후, 해당 차수가 존재하면 1, 존재하지 않으면 0을 채웁니다.

 

예시 : 다항식 $x^4 + x + 1$

  • 최고 차수 확인 : 최고 차수가 4이므로, 비트는 $x^4$부터 $x^0$까지 총 5비트가 됩니다.
  • 모든 항 나열 : $(1) \cdot x^4 + (0) \cdot x^3 + (0) \cdot x^2 + (1) \cdot x^1 + (1) \cdot x^0$
  • 계수만 추출 (비트열 생성) : 1 0 0 1 1

 

그런데......

 

2025년 정보시스템감리사 92번 문제

 

이제는 비트열과 다항식을 상호변환하는 것을 넘어 갑자기 하드웨어 회로도를 보여주면서 다항식을 찾으라 합니다.

갑자기 하드웨어 구조도가 나오다니.. 하지만 이 문제는 앞서 공부한 '다항식 변환' 원리만 알면 5초 만에 풀 수 있는 보너스 문제입니다. 복잡해 보이는 회로도를 "다항식의 지도"라고 생각하고 아래 순서대로 따라와 보세요.

 

7. 회로되에서 다항식 찾기

이 그림에서 딱 두 가지만 기억하세요. 

  • 사각형($\square$) : 지수(자릿수)를 의미합니다. 오른쪽에서 왼쪽으로 가면서 $x^1, x^2, x^3, x^4...$가 됩니다.
  • 더하기 기호($\oplus$) : 이게 바로 XOR 연산자이자, 다항식에서 항이 존재한다(+)는 뜻입니다.

그림을 오른쪽에서 왼쪽 방향으로 훑으면서 XOR($\oplus$) 기호가 어디에 붙어 있는지 확인하면 됩니다.

  • 가장 오른쪽 XOR (데이터 입력부) : 이건 무조건 상수항 $1$을 의미합니다. (모든 생성 다항식의 시작점입니다.)
  • 사각형 개수 확인 : 사각형이 총 4개죠? 그러면 이 다항식의 최고 차수는 $x^4$입니다. 맨 왼쪽 사각형을 빠져나오는 선이 다시 돌아가므로 $x^4$ 항은 무조건 존재합니다.
  • 중간의 XOR 위치 찾기 : 오른쪽에서 두 번째 사각형과 세 번째 사각형 사이에 $\oplus$ 기호가 보이죠? 오른쪽부터 자릿수를 세어보면 $x^1$ 다음인 $x^2$ 자리에 XOR이 있는 것입니다.
  • 맨 오른쪽 입력부 (상수항) : $1$
  • 중간 XOR 위치 : $x^2$
  • 맨 왼쪽 출력 (최고 차수) : $x^4$
  • 이걸 다 더하면? $x^4 + x^2 + 1$ 이 됩니다. 

따라서 정답은 ①번입니다.

 

 

2023년 정보시스템감리사 85번 문제

 

 

최대항의 지수가 16이므로 총 17자리 이진수여야 한다. 왜냐? 0부터 16까지의 이진수니까. 

정답은 ③

 

 

 

2017년 정보시스템감리사 97번 문제

 

이 문제는 CRC(Cyclic Redundancy Check)의 기본 원리와 코드워드(Codeword)의 구성을 이해하면 아주 간단하게 풀 수 있는 문제입니다. 계산 과정을 길게 거칠 필요 없이 정의만 알면 바로 답이 보입니다.


코드워드란?

CRC에서 송신측이 보내는 코드워드는 원래의 데이터에 계산된 나머지 값(FCS, Frame Check Sequence)을 덧붙인 형태입니다.

코드워드(Codeword) = 데이터워드(Dataword) + 나머지(Remainder)

문제에서 주어진 값들은 다음과 같습니다.

  • 데이터워드 : 111111
  • 제수(Divisor) : 1010
  • 몫(Quotient) : 110011
  • 나머지(Remainder) : 110

CRC 알고리즘에 따라 코드워드를 구성하면 원래의 데이터워드인 111111을 앞에 둡니다. 그 뒤에 계산된 나머지 값인 110을 그대로 붙입니다. (참고: 나머지의 비트 수는 보통 (제수의 비트 수 - 1)입니다. 여기서는 제수가 4비트이므로 나머지는 3비트인 110이 됩니다.)

따라서 코드워드는 111111 + 110 = 111111110 이 됩니다.  정답은 ③ 111111110