CS/정보통신공학

[정보통신공학] Ch06. Error Detection and Correction

rngPwns 2025. 4. 11. 14:55

📌 개요

  • 데이터 통신을 위해 송신기(TX)와 수신기(RX) 간에는 다음과 같은 협력이 필요함:
    • 타이밍(Timing)
      • 비동기 직렬 전송 (Asynchronous serial transmission)
      • 동기 직렬 전송 (Synchronous serial transmission)
    • 오류 검출(Error Detection)
      • 패리티 검사(Parity check), 인터넷 체크섬(Internet checksum), 순환 중복 검사(CRC: Cyclic Redundancy Check)
    • 오류 정정(Error Correction)
      • 역방향 오류 정정(BEC: Backward Error Correction)
      • 순방향 오류 정정(FEC: Forward Error Correction)

✅ 1. 타이밍 동기 문제

  • 송신기와 수신기 간의 클록(시간) 차이가 있으면 신호가 정확히 해석되지 않음
    → 수신기는 비트 도착 시간과 지속 시간을 정확히 알아야 함
  • 동기 방식 2가지:
    • 비동기 방식(Asynchronous): 공통 클록 없이 개별 동기
    • 동기 방식(Synchronous): 연속적인 비트 흐름에서 동기화 유지

✅ 2. 비동기 직렬 전송 (Asynchronous Serial Transmission)

  • 공통 시계 신호 없음 → 데이터 내에 동기 정보 포함

구조

  • 시작 비트(start bit, 항상 0)
  • 데이터 비트 (5~8비트)
  • (선택) 패리티 비트
  • 정지 비트(stop bit, 1비트/1.5비트/2비트)
  • 각 문자마다 시작부터 다시 동기화 가능
    → 타이밍 오류 누적되지 않음

장단점

      

장점 단점
단순하고 저렴 문자당 오버헤드 큼 (20% 이상)
키보드처럼 간헐적 데이터에 적합 대용량 전송에는 부적합

✅ 3. 동기 직렬 전송 (Synchronous Serial Transmission)

  • TX와 RX 간의 클록 동기 유지

방법

  • Layer 1: 클록 신호 직접 전송 or 맨체스터 부호화(Manchester encoding)
  • Layer 2: 프레임 전·후에 **프리앰블(preamble)**과 포스트앰블(postamble) 삽입

효율성

  • HDLC 예시: 1000문자 전송 시 48비트 오버헤드
    오버헤드: 0.6%, 효율성: 99.4%

비교

항목비동기동기
속도 느림 (바이트 간 간격) 빠름 (프레임 연속)
동기 정보 시작/정지 비트 포함 프리앰블, 포스트앰블
오버헤드 작음
구현 쉬움 복잡함
효율성 낮음 높음
용도 키보드, RS-232 이더넷, ATM 등

✅ 4. 오류의 종류 (Types of Errors)

  • 단일 비트 오류(Single-bit error): 1개의 비트만 변경됨
    • 보통 **백색 잡음(white noise)**로 발생
  • 버스트 오류(Burst error): 여러 연속된 비트가 오류
    • 무선 환경, 순간 노이즈 등으로 발생
    • 고속일수록 영향 큼

✅ 5. 오류 검출 (Error Detection)

  • 프레임은 연속된 비트로 구성된 데이터 단위
  • 프레임 길이가 길어질수록 오류 발생 확률 증가

과정

  1. 송신 측이 검사용 코드 비트 추가
  2. 수신 측이 같은 방식으로 계산하여 비교
    불일치 시 오류 감지

✅ 6. 오류 검출 기법 (3가지)

방식계층방식
Parity check L2 HW 기반 단순 오류 검출
Internet checksum L3/L4 IPv4, TCP/UDP용 SW 방식
CRC (순환 중복 검사) L2 HW/SW 기반 정교한 검출

→ 모두 추가 비트를 데이터에 부가하여 전송


✅ 7. 단일 패리티 검사

    • 가장 단순한 방법: 데이터 끝에 패리티 비트 추가
    • 전체 비트 수를 짝수 or 홀수로 만들도록 설정
    • 단점: 짝수 개 비트 오류는 검출 불가
      • 두 비트가 동시에 잘못 바뀜!
         
        10100 → 11110
        (첫 번째와 두 번째 0이 1로 바뀜)
        • 1이 4개 → 어? 또 짝수네?!
        • 👉 오류인데도 패리티는 오류가 없다고 착각해!
  • 패리티는 "짝수냐 홀수냐"만 보는 거야
  • 근데 짝수 개로 잘못되면 눈치 못 챔!
  • 하나만 바뀌었을 때만 확실히 잘 잡아줘

✅ 8. 2차원 패리티 검사 (2D Parity)

  • 행/열 패리티 모두 적용
  • 단일 비트 오류는 정정 가능
  • 다중 오류는 검출만 가능

✅ 9. 인터넷 체크섬 (Internet Checksum)

  • IPv4, TCP, UDP 등에 사용

절차

  1. 16비트 정렬
  2. 1의 보수 합산(ones-complement addition)
    • end-around carry  : One’s complement addition에서는 덧셈 결과에서 최상위 비트에서 carry가 발생하면, 그 carry를 맨 끝(LSB)에 다시 더해줘야 해!
    • 모든 1의 비트가 정확히 합쳐지면 전체 결과가 0이 되어야 함
    • 이걸 위해 carry를 뒤로 넘겨서 더하는 특별한 덧셈 방식을 씀
  3. 1의 보수 변환
    • 결과가 모두 1이면 무결성 통과

<1의보수 합산 예제>

<carry가 없는 예제>

word 1 = 1111 0000 1111 0000
word 2 = 0000 1111 0000 1111

   1111 0000 1111 0000
+  0000 1111 0000 1111
-----------------------
= 1111 1111 1111 1111 ✅  → carry 없음 → 그냥 이 값 유지




<carry가 있는 예제>

Word 1 = 1111 1111 1111 1111  
Word 2 = 0000 0000 0000 0001

   1111 1111 1111 1111
+  0000 0000 0000 0001
-----------------------
= 1 0000 0000 0000 0000 ← ❗️이건 17비트야!  
(맨 앞에 carry = 1)

   0000 0000 0000 0000  
+  0000 0000 0000 0001  ← carry
-----------------------
= 0000 0000 0000 0001 ✅

 
 
<16진수로 표현된 두 값을 더해서 F가 되도록 만드는 것이 checksum 이다.

  • "각 자리(4bit 단위)에서 더했을 때 F(=1111)가 되게 만드는 값"을 찾는 게 one's complement이다.
  • 이건 암산 팁이야 💡예:이 방식은 16진수 자리 수가 하나씩일 때만 가능
    → 즉, 0xAB라면:
    • A = 0xA = 10 → F - A = 5
    • B = 0xB = 11 → F - B = 4
      → 결과 = 0x54
    하지만! 그건 진짜 one’s complement이 아니라 자리별 보수
    → 진짜 one's complement은 전체 비트를 뒤집는 거고,
    이건 단순히 자리마다 F - 값 해서 구하는 암산용 테크닉이야.
  • yaml
    코드 복사
    0xC = 1100 보수 = 0011 = 0x3 F - C = 15 - 12 = 3 똑같다!
  • “16진수 자리 단위에서 One’s complement 값
    F에서 그 자리 값을 빼는 것과 같다
    → 왜냐면 F(=15)는 4비트에서 모든 비트가 1이기 때문!

 
* 0x는 "이 숫자는 16진수(hexadecimal)입니다" 라고 표시해주는 접두사


✅ 10. 인터넷 체크섬 한계

  • **16비트 내의 비트 교환(swap)**은 오류 검출 못함

✅ 11. 순환 중복 검사 (CRC)

  • 버스트 오류에 강함, 하드웨어에서도 빠르게 계산 가능

핵심

  • 메시지 D(k), 총 프레임 길이 T(n), 생성 다항식 P(n-k+1)
  • 송신기: D(k) 뒤에 FCS(F(n-k)) 추가 → T(n) 만들기
  • 수신기: T(n) ÷ P → 나머지 0이면 정상, 아니면 오류
  • “RX가 받은 데이터를 divisor로 나눴는데 나누어 떨어지지 않으면 오류다.
    그런데 divisor와 에러 패턴이 공통 인수를 갖고 있으면 오류를 검출 못 한다.”
    • TX와 RX가 공통으로 알고 있는 divisor:
       → 보통 CRC 다항식 P(x)P(x)
        예: P(x)=x3+x+1P(x) = x^3 + x + 1
    • TX는 전송할 데이터 D(x)를 P(x)로 나누어 떨어지게끔 FCS를 붙임
       → 최종 전송 데이터: T(x)=D(x)⋅xr+F(x)T(x) = D(x) \cdot x^r + F(x)
    • RX는 받은 T'(x)를 P(x)로 나눠서 나머지가 0이면 “오류 없음”이라고 판단
    • 어떤 전송 중 비트가 뒤바뀌어서 에러 패턴 E(x)E(x)가 생기면, 수신 데이터는:
                  T′(x)=T(x)+E(x)T'(x) = T(x) + E(x)
    • RX는 이걸 P(x)로 나누어 봄
       → T′(x)mod  P(x)T'(x) \mod P(x)
    • 만약 E(x)E(x)가 P(x)의 배수라면 → P(x)로 나눴을 때 나머지 = 0
      오류인데도 감지하지 못함
  • FCS field가 5bit라는 말은 divisor(P)의 degree가 5이고, 따라서 divisor는 6bit라는 뜻이다.
    • 다항식의 차수(degree)가 5라는 건, 최고차항이 x⁵라는 뜻이고, 그걸 포함한 전체 항은 x⁵부터 x⁰까지 총 6개니까 6비트가 필요하다.

✅ 12. CRC 생성 방식 (3가지)

방법설명
모듈로 2 연산(Bit 방식) XOR 기반
다항식 방식(Polynomial) D(x), P(x) 수식화
디지털 논리 방식 하드웨어 회로로 구현

✅ 13. CRC – Modulo 2 방식 요약

  1. D(k)에 0을 (n-k)개 추가
  2. (D << (n-k)) ÷ P → 나머지 계산
  3. 그 나머지를 FCS로 추가
  4. 수신자는 전체 프레임 ÷ P로 검증

✅ 14. CRC – Polynomial 방식 예

  • 예: D(x) = 1010001101 → 다항식으로 변환
  • P(x) = 110101 → x⁵ + x⁴ + x² + 1
  • 나눗셈 후 나머지를 FCS로 추가

✅ 15. P(x)의 조건

  • 최소 두 항 이상
  • x⁰ 항의 계수는 반드시 1
  • CRC 종류:
    • CRC-8, CRC-10, CRC-16, CRC-32, CRC-CCITT 등

✅ 16. 오류 정정 방법

1) BEC (Backward Error Correction)

  • 수신 측이 오류 발생 시 재전송 요청
  • TCP, HDLC 등에 사용
  • 실시간 서비스(VoIP), 위성통신 등에 부적합

2) FEC (Forward Error Correction)

  • 송신 측이 정정 가능한 코드를 함께 전송
  • 수신자는 재전송 없이 오류 정정 가능
  • 예: 실시간 음성, 위성 링크

✅ 17. FEC 동작 구조

  1. 송신 측: 데이터 → 코드워드(n비트)로 인코딩
  2. 수신 측: 코드워드 분석 → 오류 감지 & 정정
    • 정정 가능 오류: 복구
    • 정정 불가 오류: 오류 알림

✅ 18. 해밍 거리(Hamming Distance)

  • 두 코드워드 간 다른 비트의 수
    → 최소 해밍 거리(d) = 2t + 1이면 t비트 오류까지 정정 가능

✅ 19. FEC 블록 코드의 예시

  • (n=5, k=2) 블록 코드
  • 가능한 코드워드:
    • 00 → 00000
    • 01 → 00111
    • 10 → 11001
    • 11 → 11110
  • 수신된 데이터가 유효하지 않다면 해밍 거리가 최소인 코드워드로 정정

✅ 20. FEC 코드 성능 지표

지표설명
Redundancy (여유도) (n – k)/k → 데이터 대비 추가된 비트 비율
Code rate (코드율) k/n → 실제 정보 비율 (낮을수록 많은 오버헤드)