mmin.h 2020. 4. 29. 23:34

CRCλž€?

CRC(Cyclic Redundancy Checking) μˆœν™˜ μ€‘λ³΅κ²€μ‚¬λŠ” μ—λŸ¬κ²€μΆœ λŠ₯λ ₯이 μš°μˆ˜ν•œ μˆœνšŒλΆ€ν˜Έμ˜ 일쒅이닀. μˆœνšŒλΆ€ν˜Έλž€ μ„ ν˜• 블둝 λΆ€ν˜Έ(λΆ€ν˜Έμ–΄ 집합이 μ„ ν˜• 벑터곡간을 ν˜•μ„±ν•˜λŠ” λΆ€ν˜Έ)의 μΌμ’…μœΌλ‘œμ„œ μ£Όμš”νŠΉμ§•μœΌλ‘  잘 μ •μ˜λœ μˆ˜ν•™μ  ꡬ쑰λ₯Ό κ°€μ§€κ³  있고 λΆ€ν˜Έν™”μ— μš©μ΄ν•˜λ©° 맀우 효율적인 λ³΅ν˜Έν™” κΈ°λŠ₯을 κ°€μ§€κ³  μžˆλ‹€.

 

CRC의 νŠΉμ§•

1.     μ‚°λ°œ μ—λŸ¬(Random Error) 뿐만 μ•„λ‹ˆλΌ, μ—°μ§‘ μ—λŸ¬(Burst Error)μ—μ„œλ„ κ²€μΆœ λŠ₯λ ₯이 μš°μˆ˜ν•˜λ‹€. μ—°μ§‘μ—λŸ¬λŠ” 데이터 전솑 μ‹œ ν•œ 무리의 데이터에 μ§‘λ‹¨μ μœΌλ‘œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것이고, 이와 λ°˜λŒ€λ‘œ μ—¬κΈ°μ €κΈ° μ‚°λ°œμ μœΌλ‘œ λŒ„λ€ν•˜κ²Œ λ‚˜νƒ€λ‚˜λŠ” 였λ₯˜λ₯Ό μ‚°λ°œ μ—λŸ¬ 라고 λΆ€λ₯Έλ‹€.

 

2.     μˆœνšŒλΆ€ν˜Έμ— κΈ°λ°˜ν•œ 였λ₯˜κ²€μΆœλΆ€ν˜Έμ΄λ‹€. 솑신 μΈ‘μ—μ„œ 데이터에 λŒ€ν•΄ νŠΉμ • λ‹€ν•­μ‹μœΌλ‘œ λ‚˜λˆˆ κ²°κ³Όλ₯Ό μ—¬λΆ„μ˜ FCS에 덧뢙여 보내면, μˆ˜μ‹ μΈ‘μ—μ„œ λ™μΌν•œ λ°©λ²•μœΌλ‘œ κ³„μ‚°ν•œ κ²°κ³Όμ™€μ˜ μΌμΉ˜μ„±μœΌλ‘œ 였λ₯˜κ²€μ‚¬λ₯Ό ν•˜λŠ” κΈ°μˆ μ΄λ‹€.

μ—¬κΈ°μ„œ FCSλž€(Frame Check Sequence) ν”„λ ˆμž„ 끝 뢀뢄에 μˆ˜μ‹ μΈ‘μ˜ μ—λŸ¬κ²€μΆœμ„ λ•κΈ°μœ„ν•΄ μ‚½μž…ν•˜λŠ” ν•„λ“œμ΄λ‹€. μˆ˜μ‹μΈ‘μ€ μžμ‹ μ΄ κ°–κ³ μžˆλŠ” FCS와 μ „μ†‘λ˜μ–΄μ˜¨ ν”„λ ˆμž„μ˜ FCS와 λΉ„κ΅ν•˜μ—¬ μ—λŸ¬ μ—¬λΆ€λ₯Ό 확인 κ°€λŠ₯ν•˜κ³  μ—λŸ¬ ν™•μΈμ‹œμ—λŠ” ν•΄λ‹Ή ν”„λ ˆμž„μ„ νκΈ°ν•˜κ³  솑신츑에 μž¬μ „μ†‘μ„ μš”κ΅¬ν•œλ‹€.

 

 

CRC 생성 및 검사 방법

1.    솑신단

전솑할 μ›λž˜ 데이터 ν”„λ ˆμž„(k bit)에 λŒ€ν•΄ 미리 μ •μ˜λœ CRCλ‹€ν•­μ‹μœΌλ‘œ λ‚˜λˆ„κ³  κ·Έ λ‚˜λ¨Έμ§€ 값을 μ›λž˜μ˜ 데이터 ν”„λ ˆμž„ 뒀에 FCS(n-k bits)둜 뢙인닀. 이떄, κ·Έ κ²°κ³Ό ν”„λ ˆμž„(μ›λž˜μ˜ 데이터 + FCS)이 미리 μ •μ˜λœ CRC 닀항식에 μ˜ν•˜μ—¬ μ •ν™•νžˆ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§ˆ 수 있게 λœλ‹€.

κ·Έ κ²°κ³Ό ν”„λ ˆμž„(μ›λž˜μ˜ 데이터 + FCS)(n bits)을 μ†‘μ‹ ν•œλ‹€.

 

2.    μˆ˜μ‹ λ‹¨

μˆ˜μ‹ λœ ν”„λ ˆμž„ (n bits)을 받은 후에 CRC 검사λ₯Ό ν•˜κ²Œ λ˜λŠ”λ°, μˆ˜μ‹ λœ 전체 데이터λ₯Ό 솑신 μ‹œμ™€ 같은 미리 μ •μ˜λœ CRC λ‹€ν•­μ‹μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ λ‚˜λ¨Έμ§€λ₯Ό κ²€μ‚¬ν•œλ‹€.

였λ₯˜ κ²€μΆœ 방법은 μˆ˜μ‹ λ‹¨μ—μ„œ μž‰μ—¬λΆ„(FCS)을 ν¬ν•¨ν•œ 전체 데이터λ₯Ό 미리 μ •μ˜λœ CRC λ‹€ν•­μ‹μœΌλ‘œ λ‚˜λˆŒ λ•Œ λ‚˜λ¨Έμ§€κ°€ 0이면 였λ₯˜κ°€ μ—†λŠ” 것이고 λ‚˜λ¨Έμ§€κ°€ 0이 μ•„λ‹Œ μˆ˜κ°€ 되면, 전솑 μ‹œ 였λ₯˜κ°€ λ°œμƒν•œ 것이닀.

 

λ‹€ν•­μ‹μ˜ ν‘œν˜„

예둜 x4+x+1 μ΄λž€ 닀항식을 λ‹€μŒκ³Ό 같이 μ„Έκ°€μ§€ λ°©λ²•μ˜ 숫자둜 ν‘œν˜„ν•  수 μžˆλ‹€.

-        0x3 = 0b0011 : x4+ 0x3+0x2+1x1+1x0 (MSB – μš°μ„ μ½”λ“œ)

-        0xC = 0b1100 : 1x0+1x1+0x2+0x3+x4 (LSB – μš°μ„ μ½”λ“œ)

-        0x9 = 0b1001 : 1x4+0x3+0x2+1x1+x0 (Koopman ν‘œμ‹œ)

-       

닀항식(representations)

정상

(normal)

μ—­λ°©ν–₯

(reversed)

μ—­λ°©ν–₯의 μ—­μˆ˜

(reversed reciprocla)

0x3

0xC

0x9

 

CRC 계산 방법

- λŒ€μƒ ν•­λͺ©λ“€

μ›λž˜ 데이터 : D(x) (k bits)

μž‰μ—¬ 데이터 : F(x) (n-k bits)

전솑 데이터 : T(x) (n bits)

미리 μ •μ˜λœ CRC 닀항식 (Divisor) : P(x) (n-k+1 bits)

(n–k+1 bits)의 λΉ„νŠΈ νŒ¨ν„΄ (생성 닀항식)

λ‚˜λˆ—μ…ˆ λͺ« (Quotient) : Q(x) (k bits)     (버렀짐)

λ‚˜λ¨Έμ§€ (Reminder) : R(x) (n-k bits)   (덧뢙여짐)

 

- 닀항식 ν‘œν˜„

(원 λ°μ΄ν„°μ˜ prescale)   D'(x) = xn-kD(x)

μ›λž˜ 데이터에 생성 λ‹€ν•­μ‹μ˜ κ°€μž₯ 큰 차수λ₯Ό κ³±ν•œλ‹€.

(즉, 그만큼 0 값을 λ§λΆ™μ΄λŠ” 것)

 

(이것을 μƒμ„±λ‹€ν•­μ‹μœΌλ‘œ λ‚˜λˆ”) D'(x)/P(x) = xn-kD(x)/P(x)

xn-kD(x)/P(x) = Q(x) + R(x)/P(x)

xn-kD(x) = Q(x)P(x) + R(x)

 

(μœ„μ—μ„œ xn-kD(x)을 전솑)   T(x) = xn-kD(x) + R(x)

T(x) = xn-kD(x) + R(x) = Q(x)P(x)

즉, 전솑 λΉ„νŠΈ νŒ¨ν„΄ T(x)κ°€ 생성닀항식 P(x)에 μ˜ν•΄ μ •ν™•νžˆ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§„λ‹€.

 

-CRC 계산 및 λΉ„νŠΈ 처리 방법

λ‚˜λˆ—μ…ˆ 연산은, 캐리(overflow 및 borrow)λ₯Ό λ¬΄μ‹œν•˜κ³ , XOR (mod-2) μˆ˜ν–‰ν•œλ‹€.

λ‚˜λˆ„λŠ” 수인 제수(Divisor)λŠ” 미리 μ •μ˜λœ 이진 μ†Œμˆ˜(Divisor)에 μ˜ν•΄ λ‚˜λˆˆλ‹€.

        μ΄λ•Œμ˜ 제수의 κΈΈμ΄λŠ” `(λ§λΆ™μ΄λŠ” λΉ„νŠΈμˆ˜ n-k) + 1

λ‚˜λ¨Έμ§€(Reminder)λŠ” λ‚˜λˆ—μ…ˆμ˜ λ‚˜λ¨Έμ§€(Reminder)λ₯Ό ν”„λ ˆμž„μ— 덧뢙여 μ†‘μ‹ ν•œλ‹€.

μ΄λ•Œμ˜ λ‚˜λ¨Έμ§€ κΈΈμ΄λŠ” `n-k`이닀.

 

κ³„μ‚°μ˜ˆμ‹œ