본문 바로가기

IT/network

[네트워크] 통신 오류 검출

통신 오류 검출

 

통신을 하다 보면 여러 가지 이유로 비트 에러가 발생한다. 이 때, 수신 측에서 보낸 데이터가 정확하게 전달이 되었는지를 확인하는 방법이 통신 오류 검출이다. 통신 오류 검출에는 패리티 비트 검사, 블록 합 검사, 순환 중복 검사가 있다.

 

1) 패리티 비트 검사

패리티 비트 검사는 전송하는 데이터마다 패리티 비트를 하나씩 추가하여 비트가 1인 데이터의 개수가 짝수인지 홀수인지로 판별하는 방법을 말한다.

 

인코딩(encoding)하는 방법은

1) 짝수 패리티 방식의 경우 1인 비트의 개수를 짝수개로 맞춰주면 되고

2) 홀수 패리티 방식의 경우 1인 비트의 개수를 홀수개로 맞춰주면 된다.

만약 7비트의 데이터를 전송할 때 앞에 한 비트를 추가하여 8비트를 만든 후

1(Pb)

0

1

0

1

0

0

0

- 홀수 패리티(odd parity)방식을 사용했을 경우, 1인 비트가 3개 이므로 에러가 없음을 확인할 수 있다.

1(Pb)

0

1

0

0

1

0

1

- 짝수 패리티(even parity)방식을 사용했을 경우, 1인 비트의 개수가 짝수이므로 에러가 없음을 확인할 수 있다.

디코딩(decoding)하는 방법은

모든 비트를 XOR(exclusive or/비트가 같으면 0, 다르면 1/ (1)의 입력 개수가 홀수일 때 참(1))하여 계산한다. 짝수 패리티 방식을 사용했을 경우, 모든 비트의 XOR값은 0이 나와야 하며 홀수 패리티 방식을 사용했을 경우, 모든 비트의 XOR값은 1이 나와야 한다. 

문제점

짝수 패리티 방식을 사용했다고 가정하고 데이터를 아래와 같이 보냈을 때

1(Pb)

0

1

1

0

1

0

0

다음과 같은 문제점이 발생할 수 있다.

여러 비트가 에러난 경우

1(Pb)

0

1

1

1(Error)

1

1(Error)

0

해당 데이터들의 XOR값은 0이 나오기 때문에 실제로는 2군데 에러가 발생하였지만 오류가 없다고 판단한다.

 

2) 블록 합 검사

블록 합 검사는 수평 패리티와 수직 패리티를 적용하여 문자 블록을 이차원적으로 검사하는 방식이다. 행 단위의 패리티에 열 단위의 오류 검사를 수행할 수 있는 열 패리티 문자를 추가하여 이증으로 오류 검출 작업을 수행한다. 추가된 열 패리티 문자는 블록 검사 문자(Block Check Character)라고 한다.

4비트의 데이터를 보낸다고 가정하자.

수직과 수평 모두 짝수 패리티 방식이 적용되었다고 가정한다.

오류 X

0

0

1

1

0

오류 X

0

0

1

0

1

오류 O

0

0

1

1

1

오류 O

1

0

1

1

0

BCC

1

1

0

0

0

 

오류 X

오류 O

오류 X

오류 O

오류 X

단점

패리티 비트의 단점과 같다. BCC 값만 같으면 다중 오류가 발생했을 때 오류 검출이 안될 수 있다.

1

0

0

1

0

0

<원본 데이터(짝수 패리티 사용)>

1

1(Error)

0

0(Error)

0

0

<오류 검출이 불가한 경우>

 

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

정확한 오류 검출을 위해 사용하는 방식이다. 오류가 없을 때는 발생하지 않고, 오류가 발생한 시점부터 검출되기 때문에 오류 검출능력이 탁월하고 구현도 간단하다. 프레임의 실제 내용으로 계산되는 프레임 검사 순서(FCS : Frame Check Sequence)를 프레임 끝에 추가해서 전송해야 한다. FCS는 제수(divisor, 나누는 수)보다 1비트 작다. 

예시)

전송할 데이터 다항식 = 10101101

생성 다항식(제수, divisor) = 11101

FCS = 4비트(제수가 5비트이므로)

 

이제 아래 제수로 전송할 데이터 + FCS 비트 수 만큼 shift 한 값을 XOR하면 된다.

11101 | 101011010000(FCS비트 수만큼 shift, 뒤에 FCS 비트 수만큼 0을 더해준다고 생각하자)

           11101

11101 |  10001

            11101

11101 |    11000

              11101

10111 |       10110

                 11101

11101 |         10110

                   11101

11101 |           10110

                     11101

11101 |             10110

                       11101

                         1011(결과값)

해당 값을 전송할 데이터(10101101) 뒤에 붙여서 전송한다.(101011011011)

수신 측에서는 해당 값을 제수로 나누고 나눈 나머지가 0일 경우 오류가 없는 것이다.