📌 개요
- 데이터 통신을 위해 송신기(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)
방법
- 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)
- 프레임은 연속된 비트로 구성된 데이터 단위
- 프레임 길이가 길어질수록 오류 발생 확률 증가
과정
- 송신 측이 검사용 코드 비트 추가
- 수신 측이 같은 방식으로 계산하여 비교
→ 불일치 시 오류 감지
✅ 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)
절차
- 16비트 정렬
- 1의 보수 합산(ones-complement addition)
- end-around carry : One’s complement addition에서는 덧셈 결과에서 최상위 비트에서 carry가 발생하면, 그 carry를 맨 끝(LSB)에 다시 더해줘야 해!
- 모든 1의 비트가 정확히 합쳐지면 전체 결과가 0이 되어야 함
- 이걸 위해 carry를 뒤로 넘겨서 더하는 특별한 덧셈 방식을 씀
- 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 이다.
* 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)
예: P(x)=x3+x+1P(x) = x^3 + x + 1P(x)=x3+x+1
- TX는 전송할 데이터 D(x)를 P(x)로 나누어 떨어지게끔 FCS를 붙임
→ 최종 전송 데이터: T(x)=D(x)⋅xr+F(x)T(x) = D(x) \cdot x^r + F(x)T(x)=D(x)⋅xr+F(x)
- RX는 받은 T'(x)를 P(x)로 나눠서 나머지가 0이면 “오류 없음”이라고 판단
- 어떤 전송 중 비트가 뒤바뀌어서 에러 패턴 E(x)E(x)E(x)가 생기면, 수신 데이터는:
T′(x)=T(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)T′(x)modP(x)
- 만약 E(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 방식 요약
- D(k)에 0을 (n-k)개 추가
- (D << (n-k)) ÷ P → 나머지 계산
- 그 나머지를 FCS로 추가
- 수신자는 전체 프레임 ÷ 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 동작 구조
- 송신 측: 데이터 → 코드워드(n비트)로 인코딩
- 수신 측: 코드워드 분석 → 오류 감지 & 정정
- 정정 가능 오류: 복구
- 정정 불가 오류: 오류 알림
✅ 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 → 실제 정보 비율 (낮을수록 많은 오버헤드) |