월간 <네트워커> - 정보화에 대한 다른 시각
11호 이동영의
디지탈은 완벽한가
오류 검출과 복구 기술

이동영  
조회수: 6509 / 추천: 63
흔히 디지탈 방식은 아날로그와 달리 오류가 거의 없다고 생각한다. 디지탈 방식은 복제를 거듭해도 질이 떨어지지 않는다든가, CD의 음질이 LP 레코드에 비해 더 깨끗하고 잡음이 적다는 얘기 등이다.

그러나 실제로는 디지탈 방식에서도 저장이나 전송과정에서 오류가 발생할 가능성은 엄연히 존재한다. 게다가 디지탈 기기들이 점점 용량이 커지고 속도가 빨라짐에 따라서 완벽하게 동작하도록 하기는 그만큼 더 어려워진다고 할 수 있다. 그렇다면 디지탈 방식이 완벽해 보이게 하는 비결은 무엇일까. 사실 그 비밀은 간단하다. 틀린 것이 있으면 고치면 되는 것이다. 문제는 먼저 오류가 있는지 없는지를 알아내는 방법과 그 다음으로 오류가 있으면 그것을 복구하는 방법이다.

오류가 있는지 없는지를 알아내는 방법에는 몇 가지가 있는데, 모두 원래 데이터에다 오류 검출을 위한 정보를 덧붙여서 이를 확인한다. 예를 들어 주민등록번호의 마지막 자리도 앞자리 숫자들을 이용해 특정한 규칙에 따라 계산되는 오류 검출 번호이다. 따라서 이 숫자와 앞자리 숫자들을 이용해 계산한 값이 일치하는지를 봐서 가짜 주민등록번호를 판별할 수 있는 것이다.

패리티

오류 검출 방법 중 가장 간단한 방법은 패리티(parity)라고 불리는 비트를 덧붙이는 방법이다. 패리티는 홀짝이라는 뜻인데, 0과 1로 된 디지탈 데이터에서 1의 갯수가 항상 홀수 혹은 짝수개가 되도록 맞추는 방법이다. 예를 들어 짝수 패리티를 쓴다면, 원래 데이터에서 1의 갯수가 홀수이면 1인 패리티 비트를 덧붙이고 (그러면 전체에서 1의 갯수는 짝수가 된다), 원래 데이터에서 1의 갯수가 짝수이면 패리티 비트는 0으로 한다. 물론 홀수 패리티는 그 반대이다.

패리티 방법의 한계는 홀수 개의 비트가 틀린 경우만을 걸러낼 수 있다는 점이다. 즉 1개의 비트가 달라졌을 때는 오류가 있음을 알 수 있지만, 2개의 비트가 달라지면 홀짝은 변화가 없으므로 알아낼 수가 없는 것이다. 하지만 매우 간단한 방법인만큼 구현하기도 쉬워서 기본적인 오류 검출 방법으로 널리 쓰인다.

패리티 방법과 비슷한 방법으로 체크섬(checksum)이 있다. 체크섬은 몇 개의 데이터의 수치를 더한 합이다. 예를 들어 10,12,20,25라는 네 개의 데이터가 있다고 하면 여기에다 그 합인 67을 체크섬으로 덧붙인다. 오류가 있는지 검사할 때는 앞의 네 개를 더해서 체크섬과 일치하는지를 본다. 이 방법은 패리티에 비해서는 오류를 조금 더 잘 검출해 내지만, 여전히 검출해 내지 못하는 경우가 생긴다. 예를 들어 처음 두 숫자가 10,12에서 11,11로 바뀐다고 해도 합은 같으므로 이를 알아내지 못하는 것이다.

CRC - 오류 검출 방법의 최고봉

오류 검출 방법으로 실제로 많이 쓰이는 것은 CRC(Cyclic Redundancy Check)이다. 체크섬에서 사용하는 합이라는 간단한 연산 대신, CRC는 나눗셈의 나머지를 응용하는 다소 복잡한 방법을 사용한다. 16비트 CRC의 경우 16개 비트까지의 연속된 오류는 모두 검출해낼 수 있을 만큼 강력하다. 인터넷에서 널리 사용되는 통신방식인 TCP(Transmission Control Protocol)의 경우에도 CRC를 사용하여 오류 여부를 검사한다.

오류를 검출한 경우 다음 문제는 그것을 바른 값으로 고치는 것이다. 가장 쉽게 생각할 수 있는 방법은 오류가 발생한 것을 알았을 때 데이터를 다시 읽어들이거나 다시 전송하는 것이다. 다소 시간이 걸리기는 하지만, 가능하기만 하다면 손쉽게 할 수 있는 방법이다. 예를 들어 인터넷에서 전송 중에 오류가 발생한 경우에는 데이터를 다시 전송받으면 된다. 그러나 재전송이 불가능한 경우도 있을 수 있다. 예를 들어 디지탈 TV 방송신호의 경우 받는 쪽에서 보내는 쪽으로 재전송 해 달라는 요청을 보낼 방법이 없고, 혹시 있다고 하더라도 수많은 시청자의 요청을 다 받아줄 수는 없는 것이다.

이런 경우에는 처음에 데이터를 보낼 때 오류 검출 뿐만 아니라 복구까지도 가능한 방법을 사용하여야 한다. 이러한 방법들은 앞으로 발생할 오류를 미리 정정한다는 뜻에서 전방 오류 정정(Forward Error Correction, FEC) 방법이라 한다. 오류를 복구하기 위해서는 데이터를 중복해서 보낼 수밖에 없다. 비유하자면 편지를 보낼 때 잃어버리거나 훼손될 경우에 대비해서 처음부터 두 부를 보내는 것이다. 그러면 그중 하나가 훼손되더라도 나머지 하나를 받아볼 수 있는 것이다. 물론 이런 방법은 용량을 두 배로 사용하게 되므로 그다지 효율적이지 못하다.

신기한 해밍 코드

전방 오류 정정 방법 중 비교적 간단한 예는 해밍 코드(Hamming Code)라는 것이다. 해밍 코드는 패리티를 응용한 것인데, 한 비트가 틀리면 그것을 정정할 수 있고 두 비트가 틀리면 검출이 가능하다. 다음은 4비트의 데이터와 3비트의 패리티로 이루어진 해밍 코드의 예이다.

D7 D6 D5 P4 D3 P2 P1
1 0 1 0 1 0 1


D7, D6, D5, D3은 원래의 데이터 비트이고, P4, P2, P1은 패리티 비트이다. P4는 D7, D6, D5의 짝수 패리티, P2는 D7, D6, D3의 짝수 패리티, P1은 D7, D5, D3의 짝수 패리티이다(해밍 코드의 구조는 이진수의 특성을 교묘히 이용한 것이다). 이제 D6 비트에 오류가 생겼다고 해 보자.

D7 D6 D5 P4 D3 P2 P1
1 1 1 0 1 0 1


그러면 P4와 P2의 두 패리티가 맞지 않게 된다. 신기하게도 6(틀린 비트인 D6)은 4와 2(맞지 않는 패리티인 P4와 P2)의 합이다.

D7 D6 D5 P4 D3 P2 P1
0 1 1 0 1 0 1


이제 D7과 D6 두 개 비트가 틀렸다고 해 보자. 그러면 P1만 맞지 않게 된다. 이 경우에는 오류가 생겼다는 것은 알 수 있지만 제대로 정정할 수는 없다.

리드-솔로몬 코드

전방 오류 정정 방법 중 실제로 많이 쓰이는 것은 리드-솔로몬 코딩(Reed-Solomon Coding)이란 방법으로써, 보통 FEC라고 하면 이를 뜻한다. 이 방법을 사용하면 k개의 원래 데이터가 있고 여기에 r개의 오류 복구 정보를 덧붙였을 때, 그 중 아무 k개만 무사히 읽어들이면 원래의 데이터를 복구할 수 있다. 바꾸어 말하면 r개까지의 데이터에는 오류가 발생해도 원래 데이터를 복구할 수 있다는 뜻이다.

예를 들어 D1, D2, D3, D4의 4개 데이터에 R1과 R2의 오류 복구 정보를 덧붙인다면, D1과 D3를 잃어버리고 D2, D4, R1, R2만 가지고서도 원래의 데이터를 모두 복구할 수 있다. CD(컴팩트디스크)의 경우에도 이 방법을 사용해서 데이터를 저장하기 때문에, 약간의 흠집 등으로 오류가 발생해도 무사히 읽어들일 수 있다. 물론 오류의 양이 너무 많으면 당연히 복구가 불가능하다.

완벽한 기술은 없다

디지탈 방식의 경우 여러 가지 오류 검출 및 복구 방법을 사용해서 어느 정도의 오류는 감출 수 있지만, 그 이상은 감당할 수 없다. 설계할 때 고려한 만큼의 오류만 견딜 수 있다는 것을 잊어서는 안된다. 컴퓨터도 비행기도 핵발전소도 오동작할 가능성은 항상 존재하는 것이다. 과신은 금물이다. 세상에 완벽한 기술은 없다.
추천하기