오류 제어는 전송 중에 뒤집힌 비트를 받는 쪽이 알아내고(검출) 바로잡는(정정) 방법입니다. 보내는 쪽이 계산해 붙인 검사 비트를 받는 쪽이 같은 계산으로 맞춰 보고, 패리티 검사·CRC는 오류를 알아내 다시 받으며(ARQ), 해밍 코드는 뒤집힌 자리까지 찾아 스스로 고칩니다(FEC).
선을 지나는 신호는 잡음에 흔들려 0이 1로, 1이 0으로 바뀌기도 합니다. 받는 쪽이 알아챌 방법이 없으면 틀린 값을 그대로 씁니다. OSI 7계층의 데이터 링크 계층이 프레임 끝에 붙이던 FCS가 이 일을 하는 값입니다. 아래 그림은 같은 4비트 1011을 세 방식으로 지켜 보내고, 비트가 뒤집혔을 때 각 방식이 어디까지 알아내는지 견줍니다.
1패리티 검사 — 1의 개수를 맞춘다
패리티 검사(parity check)는 데이터 끝에 패리티 비트 하나를 붙여 1의 개수를 짝수(짝수 패리티)나 홀수(홀수 패리티)로 맞춥니다. 1011은 1이 셋이라, 짝수 패리티면 1을 붙여 10111을 보냅니다.
받는 쪽은 1을 셉니다. 비트 하나가 뒤집힌 11111은 1이 다섯이라 오류를 알아채지만, 어느 비트인지는 모릅니다. 두 비트가 함께 뒤집힌 11011은 1이 넷이라 오류를 놓칩니다. 패리티 검사는 홀수 개 비트의 오류만 검출합니다.
2CRC — 나눈 나머지를 붙인다
CRC(Cyclic Redundancy Check, 순환 중복 검사)는 데이터를 미리 정한 비트 줄인 생성 다항식(generator polynomial)으로 나눈 나머지를 붙여 보냅니다. 나눗셈은 빼기 대신 XOR(같으면 0, 다르면 1)을 쓰는 모듈로-2 나눗셈입니다. 1011을 생성 다항식 1101(x³ + x² + 1)로 나누면 아래와 같습니다.
| 단계 | 비트 줄 | 한 일 |
|---|---|---|
| 시작 | 1011000 | 1011 뒤에 0을 셋(생성 다항식 자릿수 − 1) 붙인다 |
| 1 | 0110000 | 맨 앞 1부터 네 자리 1011에 1101을 XOR |
| 2 | 0000100 | 다음 1부터 네 자리 1100에 1101을 XOR |
| 끝 | 100 | 앞이 모두 0 — 끝 세 자리가 나머지 |
보내는 쪽은 1011 뒤에 나머지를 붙인 1011100을 보냅니다. 받는 쪽이 같은 1101로 나눠 나머지가 000이면 통과, 아니면 오류입니다. 패리티가 놓친 두 비트 오류(1101100)도 나머지 100이 남아 잡힙니다. 여러 비트가 연달아 망가지는 집단 오류에도 강해서 HDLC·이더넷 프레임의 FCS로 씁니다.
3해밍 코드 — 뒤집힌 자리까지 찾는다
해밍 코드(Hamming code)는 검사 비트를 1·2·4처럼 2의 거듭제곱 자리에 끼워 넣습니다. 검사 비트 1은 자리 1·3·5·7을, 2는 2·3·6·7을, 4는 4·5·6·7을 묶음으로 맡아 묶음 안 1의 개수를 짝수로 맞춥니다. 1011은 데이터 자리 3·5·6·7에 들어가고, 검사 비트가 0·1·0으로 정해져 0110011이 됩니다.
받는 쪽은 묶음마다 1을 다시 셉니다. 어긋난 묶음의 번호를 더한 값이 뒤집힌 비트의 자리입니다. 6번이 뒤집히면 묶음 2와 4가 어긋나 2 + 4 = 6입니다. 그 비트를 되돌리면 되어 다시 받지 않아도 됩니다. 고칠 수 있는 것은 1비트 오류까지입니다.
데이터가 m비트일 때 검사 비트 수 p는 2^p ≥ m + p + 1을 만족하는 가장 작은 수입니다. 4비트면 3, 8비트면 4입니다.
4다시 받을까, 스스로 고칠까 — ARQ와 FEC
| 방식 | 받는 쪽이 하는 일 | 쓰는 부호 |
|---|---|---|
| 후진 오류 수정(BEC, Backward Error Correction) | 오류를 검출하고 다시 보내 달라고 한다 | 패리티 검사·CRC |
| 전진 오류 수정(FEC, Forward Error Correction) | 덧붙은 비트로 스스로 고친다 | 해밍 코드 |
BEC에서 받는 쪽이 '잘 받았다'·'다시 보내라'를 알려 다시 받는 절차가 ARQ(Automatic Repeat reQuest)이고, 넷으로 나뉩니다. 정지-대기(stop-and-wait) ARQ는 하나 보내고 확인을 받은 뒤 다음을 보내고, Go-Back-N ARQ는 이어 보내다 오류가 난 프레임부터 뒤를 모두 다시 보내고, 선택적 재전송(selective repeat) ARQ는 오류가 난 프레임만 다시 보냅니다. 적응적(adaptive) ARQ는 회선 상태에 맞춰 프레임 길이를 바꿉니다. 자료에 따라 FEC를 순방향 오류 정정, BEC를 역방향 오류 정정이라고도 부릅니다.
예제
해밍 코드로 받은 7비트가 1110110입니다(왼쪽이 자리 1). 오류가 난 자리를 찾아 고친 뒤 아래 표로 맞춰 보세요.
| 단계 | 묶음(자리) | 받은 비트 | 1의 수 | 판정 |
|---|---|---|---|---|
| 1 | 묶음 1(1·3·5·7) | 1·1·1·0 | 3 | 홀수 — 어긋남 |
| 2 | 묶음 2(2·3·6·7) | 1·1·1·0 | 3 | 홀수 — 어긋남 |
| 3 | 묶음 4(4·5·6·7) | 0·1·1·0 | 2 | 짝수 — 맞음 |
| 4 | 어긋난 묶음 번호의 합 | 1 + 2 | — | 3번 자리 |
| 5 | 3번 자리를 되돌린다 | 1110110 → 1100110 | — | 데이터(자리 3·5·6·7) 0110 |
묶음 하나만 어긋나면, 뒤집힌 것은 그 번호 자리의 검사 비트입니다.
시험 포인트
- 필기: 검출만 하는 패리티 검사·CRC(BEC)와 고치기까지 하는 해밍 코드(FEC)를 가릅니다. 패리티는 짝수 개 비트가 뒤집히면 놓치고, CRC는 집단 오류에 강하며, 해밍 코드는 검사 비트를 2의 거듭제곱 자리에 두고 1비트 오류를 고칩니다. 오류 자리(어긋난 묶음 번호의 합)와 검사 비트 수(
2^p ≥ m + p + 1)를 계산하게 합니다. ARQ 가운데 오류가 난 프레임부터 뒤를 모두 다시 보내는 것은 Go-Back-N, 그것만 다시 보내는 것은 선택적 재전송입니다. - 실기: 이름을 씁니다 — 패리티 검사(Parity Check), CRC(Cyclic Redundancy Check, 순환 중복 검사), 해밍 코드(Hamming Code), 전진 오류 수정(FEC, Forward Error Correction), 후진 오류 수정(BEC, Backward Error Correction), ARQ(Automatic Repeat reQuest).
확인 문제
1. 전진 오류 수정(FEC)에 해당하는 장면을 고르세요.
- ① 받는 쪽이 1의 개수가 홀수인 것을 보고, 같은 글자를 한 번 더 보내 달라고 합니다.
- ② 받는 쪽이 검사 비트 묶음을 다시 세어 뒤집힌 자리를 짚고, 그 비트를 되돌립니다.
- ③ 받는 쪽이 프레임을 생성 다항식으로 나눈 나머지가 0이 아니어서, 그 프레임을 버리고 다시 받습니다.
- ④ 받는 쪽이 3번 프레임이 깨졌다고 알리자, 보내는 쪽이 3번부터 그 뒤 프레임을 모두 다시 보냅니다.
정답
②입니다. 받는 쪽이 다시 보내 달라고 하지 않고 스스로 고치는 것이 전진 오류 수정이고, 해밍 코드가 그렇게 합니다.
- ① 패리티 검사로 오류를 검출만 하고 다시 받는 후진 오류 수정(BEC)입니다.
- ③ CRC로 검출만 하고 다시 받는 후진 오류 수정입니다. CRC는 어느 비트인지 짚지 못합니다.
- ④ 다시 보내 달라고 하는 ARQ 가운데 Go-Back-N입니다. 받는 쪽이 고친 것이 아닙니다.
2. 다음 (가)~(다)에 맞는 이름을 쓰세요. (가)·(다)는 한글 이름과 영문을, (나)는 영문 약어와 원어, 한글 이름을 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 7비트 글자마다 한 비트를 더 붙여, 1의 개수가 늘 짝수가 되게 맞춰 보내는 방식
- (나) 프레임 전체를 미리 정한 비트 줄로 XOR 나눗셈해 나온 나머지를 뒤에 붙이는 방식. 여러 비트가 연달아 망가져도 잘 잡아냅니다.
- (다) 2의 거듭제곱 자리마다 덧붙인 비트를 끼워 넣어, 받는 쪽이 뒤집힌 비트의 자리까지 알아내는 부호
정답
받는 답: (가) 패리티 검사(Parity Check) · (나) CRC(Cyclic Redundancy Check, 순환 중복 검사) · (다) 해밍 코드(Hamming Code)
(가)의 실마리는 '한 비트로 1의 개수를 맞춘다', (나)는 '나눗셈의 나머지', (다)는 '2의 거듭제곱 자리에 끼워 넣고 자리까지 알아낸다'입니다.
- 같은 이름의 다른 꼴: (나)를 약어만, 또는 한글 이름만 쓴 꼴 — 문제가 셋을 함께 쓰라고 했습니다.
- 틀리는 꼴 (나)에 패리티 검사: 패리티는 1의 개수만 셉니다. 나머지를 붙이는 것은 CRC입니다.
- 틀리는 꼴 (다)에 CRC: CRC는 오류가 있다는 것까지만 압니다. 뒤집힌 자리까지 짚는 것은 해밍 코드입니다.
3. 다음 (가)~(다)에 맞는 이름을 쓰세요. (가)·(나)는 한글 이름과 영문 약어, 원어를, (다)는 영문 약어와 원어를 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 멀리 떨어진 탐사선이 보낸 사진처럼 다시 보내 달라고 하기 어려울 때, 받는 쪽이 덧붙은 비트로 틀린 비트를 스스로 바로잡는 방식
- (나) 받는 쪽은 틀렸다는 것만 알아내고, 보내는 쪽에서 같은 데이터를 한 번 더 받아 바로잡는 방식
- (다) (나)에서 '잘 받았다'·'다시 보내라' 신호를 주고받아, 보내는 쪽이 같은 데이터를 거듭 보내게 하는 절차
정답
받는 답: (가) 전진 오류 수정(FEC, Forward Error Correction) 또는 순방향 오류 정정 · (나) 후진 오류 수정(BEC, Backward Error Correction) 또는 역방향 오류 정정 · (다) ARQ(Automatic Repeat reQuest)
가르는 기준은 '누가 바로잡나'입니다. 받는 쪽이 혼자 고치면 (가), 보내는 쪽이 다시 보내 주어야 하면 (나)입니다. (다)는 (나)를 해내는 절차입니다.
- 같은 이름의 다른 꼴: 약어만 쓴 꼴 — 문제가 한글 이름과 원어까지 쓰라고 했습니다.
- 틀리는 꼴 (가)에 해밍 코드: 해밍 코드는 (가)를 해내는 부호의 이름입니다. 방식의 이름은 전진 오류 수정입니다.
- 틀리는 꼴 (가)와 (나)를 바꿔 쓴 꼴: 다시 보내 달라고 하지 않는 쪽이 전진 오류 수정입니다.
4. 예제와 같은 해밍 코드로 받은 7비트가 1100100입니다(왼쪽이 자리 1). 오류가 난 자리 번호와 고친 7비트를 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 6번 자리 · 1100110
묶음 1(자리 1·3·5·7)은 1·0·1·0으로 1이 둘이라 맞고, 묶음 2(2·3·6·7)는 1·0·0·0으로 하나, 묶음 4(4·5·6·7)는 0·1·0·0으로 하나라 둘 다 어긋납니다. 2 + 4 = 6이라 6번 비트를 0에서 1로 되돌립니다. 데이터(자리 3·5·6·7)는 0110입니다.
- 틀리는 꼴 2번 또는 4번: 어긋난 묶음을 하나만 보고 멈췄습니다. 어긋난 묶음 번호를 모두 더합니다.
- 틀리는 꼴 1번: 묶음 1을 어긋남으로 셌습니다. 1·0·1·0은 1이 둘이라 짝수입니다.
5. 데이터 16비트를 해밍 코드로 보내려면 검사 비트가 몇 개 있어야 하는지 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 5개
2^p ≥ m + p + 1에 m = 16을 넣습니다. p = 4이면 2⁴ = 16이 16 + 4 + 1 = 21보다 작아 모자라고, p = 5이면 2⁵ = 32가 16 + 5 + 1 = 22 이상이라 5개입니다.
- 틀리는 꼴 4개: 데이터 비트 수만 보고 2⁴ = 16 ≥ 16으로 셌습니다. 검사 비트 자신과 '오류 없음'을 나타낼 몫(+ p + 1)까지 셀 수 있어야 합니다.
- 틀리는 꼴 1개: 패리티 검사처럼 한 비트만 붙이면 오류가 있다는 것까지만 알고, 자리는 찾지 못합니다.