Network·2025. 06. 14
Error detection, Error correction
- 데이터가 전송되는 과정에서 신호 약화나 잡음 때문에 비트가 바뀌는 오류가 발생할 수 있음
- 링크 계층에서는 이러한 비트 오류를 탐지해서 잘못된 데이터를 버리거나 재전송을 요청함
- 오류 검출은 100% 완벽하지 않음
- 아주 드물지만 감지되지 않는 오류도 있을 수 있음
- 하지만 EDC 필드가 클수록 오류 검출률은 높아짐
- 즉, 더 많은 체크 비트를 사용하면 더 정밀하게 오류를 잡아낼 수 있음
- 에러가 감지되면 보통 프레임을 폐기하고, 상위 계층이 재전송을 유도하거나, 무선 링크라면 링크 계층에서 자체 재전송을 할 수도 있음
오류 검출의 기본 구조
- D (Data)
- 오류 검출을 적용할 데이터
- 보통은 실제 데이터 비트와 헤더 일부까지 포함됨
- EDC (Error Detection and Correction bits)
- 오류 검출을 위한 추가 비트들
- 패리티 비트, 체크섬, CRC 등
프레임 전송 전 구조
- D + EDC → 송신자가 전송
수신 시 구조
- D’ + EDC’ → 수신자가 오류가 있는지 확인
- 수신자가 D’의 모든 비트가 유효한지 확인
- 유효하면 OK
- 오류가 발견되면, 오류 감지되고 프레임 폐기 또는 재전송 요청
Parity Checking (패리티 검사)
전송 데이터에 추가적인 비트(패리티 비트)를 붙여서, 전송 중 오류가 발생했는지 확인하는 방식
단일 비트 패리티 (single-bit parity)
- 데이터를 전송할 때, 1의 개수가 짝수/홀수인지에 따라 패리티 비트를 추가함
- 짝수 패리티라면, 데이터의 1의 개수가 짝수가 되도록 패리티 비트를 설정
- 수신 측에서는 다시 1의 개수를 세고, 짝수가 아니면 오류 발생 감지
- 간단하고 계산이 빠르지만, 짝수 개의 비트 오류는 감지하지 못함
- 오류를 감지만 하고 수정은 할 수 없음
이차원 패리티 (two-dimensional bit parity)
- 데이터를 행렬처럼 정렬하고, 각 행과 각 열에 대해 각각 패리티 비트를 붙이는 방식
- 행과 열 양쪽에 패리티를 붙이므로 오류가 생긴 위치를 정확히 찾을 수 있음
- 특정 행과 특정 열의 패리티 오류가 동시에 발생하면 그 교차점에 오류가 있다고 판단함
- 단일 비트 오류는 검출, 수정 가능
- 이중 오류 이상에서는 오류 위치 파악이 힘들고, 오버헤드(패리티 비트 수)가 늘어남
Internet checksum
전송 중 비트가 뒤바뀌는 오류(flip)를 감지하는 것이 Internet checksum의 목적
송신 측 (sender)
- UDP 세그먼트 전체를 16비트 정수 단위로 쪼갬
- 세그먼트의 데이터뿐 아니라 UDP 헤더, 필요시 IP 주소도 포함
- 16비트씩 읽어서 계산함
- 1의 보수 합(one’s complement sum)을 구함
- 일반적인 덧셈과 비슷하지만, 합이 16비트를 넘어가면 넘친 비트를 다시 더해줌
- 전파된 비트를 한 번 더 더해주므로, 전송 중 발생할 수 있는 일부 오류에 대해서도 검출할 수 있도록 함
- 일반적인 덧셈과 비슷하지만, 합이 16비트를 넘어가면 넘친 비트를 다시 더해줌
- 계산된 체크섬 값을 UDP 헤더의 checksum 필드에 기록
수신 측 (receiver)
- 받은 세그먼트를 동일하게 16비트 단위로 나눔
- 다시 1의 보수 합을 계산
- 결과가 0xFFFF이면 OK, 아니면 오류가 감지됨
Cyclic Redundancy Check (CRC)
데이터를 다항식으로 간주하고, 특정 생성 다항식(G)을 기준으로 나머지를 계산해서 오류를 검출하는 방식
- 복잡한 오류도 잘 잡아냄
- 모든 ‘burst error’가 r + 1 비트 미만일 경우 100% 검출 가능
- Ethernet, Wi-Fi (802.11), HDLC 등 다양한 프로토콜에서 실제 사용
송신 측
- D (Data)
- 보낼 데이터 비트를 2진수 숫자로 간주
- G (Generator)
- r + 1 비트 길이의 생성 다항식
- 미리 정해져있음
- r비트의 CRC(R)을 계산해야 함
- D에 r개의 0을 덧붙인 을 G로 나눈 나머지(R)를 구함
- 이 R을 데이터 뒤에 붙여서 보냄
- 전송되는 데이터 = <D, R>
- 이 전체 비트 시퀀스가 G로 나누어 떨어지도록 구성
수신 측
- <D, R>을 그대로 받아서 같은 G로 나눔
- 나머지가 0이면 OK, 나머지가 0이 아니면 오류 발생
-
- 즉, 전송 비트가 로 나누어 떨어지게 만드는 을 찾아야 함
- → 나머지
- 전송 데이터 =