CRC (cyclic redundancy check) là một loại hàm băm, được dùng để sinh ra giá trị kiểm thử, của một chuỗi bit có chiều dài ngắn và cố định, của các gói tin vận chuyển qua mạng hay một khối nhỏ của tệp dữ liệu. Giá trị kiểm thử được dùng để dò lỗi khi dữ liệu được truyền hay lưu vào thiết bị lưu trữ. Giá trị của CRC sẽ được tính toán và đính kèm vào dữ liệu trước khi dữ liệu được truyền đi hay lưu trữ. Khi dữ liệu được sử dụng, nó sẽ được kiểm thử bằng cách sinh ra mã CRC và so khớp với mã CRC trong dữ liệu.
CRC rất phổ biến, vì nó rất đơn giản để lắp đặt trong các máy tính sử dụng hệ cơ số nhị phân, dễ dàng phân tích tính đúng, và rất phù hợp để dò các lỗi gây ra bởi nhiễu trong khi truyền dữ liệu.
Giới thiệu
CRC là một loại mã phát hiện lỗi. Cách tính toán của nó giống như phép toán chia số dài trong đó thương số được loại bỏ và số dư là kết quả, điểm khác biệt ở đây là sử dụng cách tính không nhớ (carry-less arithmetic) của một trường hữu hạn. Độ dài của số dư luôn nhỏ hơn hoặc bằng độ dài của số chia, do đó số chia sẽ quyết định độ dài có thể của kết quả trả về. Định nghĩa đối với từng loại CRC đặc thù quyết định số chia nào được sử dụng, cũng như nhiều ràng buộc khác.
Mặc dù các mã CRC có thể xây dựng được bằng cách sử dụng bất kỳ trường hữu hạn nào, nhưng tất cả các mã CRC thường dùng đều sử dụng trường hữu hạn GF(2). Đây là trường hai phần tử, thường được ký hiệu là 0 và 1, phù hợp với kiến trúc máy tính. Phần còn lại của bài viết sẽ chỉ đề cập đến những mã CRC thuộc dạng này, nhưng nguyên tắc thì khái quát hơn.
Một lý do quan trong lý giải sự phổ biến của mã CRC trong phát hiện sự thay đổi ngẫu nhiên của dữ liệu là hiệu suất đảm bảo. Điển hình, một mã CRC n bit, được áp dụng cho một đoạn dữ liệu có độ dài tùy ý, sẽ phát hiện được bất kỳ lỗi tín hiệu đơn nào có độ dài không quá n bit (nói cách khác, bất kỳ sự biến đổi đơn lẻ nào có chiều dài không quá n bit của dữ liệu), và sẽ phát hiện một phần 1-2-n của tất cả các lỗi tín hiệu có độ dài dài hơn thế. Các lỗi trong cả các kênh truyền dữ liệu và phương tiện bộ nhớ từ dẫn đến phân bố không ngẫu nhiên (v.d, "bursty"), làm cho các đặc tính của CRC trở nên hữu dụng hơn những mã khác như Multiple Parity checks.
Hệ thống tìm lỗi đơn giản nhất, bit parity (xet chẵn lẽ), thực ra là một mã CRC ở dạng tầm thường: sử dụng số chia độ dài 2 bit là 11.
Tính toán CRC
Để tính toán một mã nhị phân n bit CRC, xếp các bít biểu diễn đầu vào thành một hàng, và đặt mẫu (n+1) bit biểu diễn số chia của CRC (gọi là một "đa thức") vào bên dưới bên trái ở cuối hàng. Sau đây là phép tính đầu tiên để tính một hàm CRC 3 bít:
11010011101100 <--- Đầu vào 1011 <--- Số chia (4 bit = 3 + 1 bit) -------------- 01100011101100 <--- Kết quả (--> Lại đưa vào đầu vào của phép tính tiếp theo)Nếu dãy nhị phân đầu vào bên trên có bít cực tả (đầu tiên bên trái) là 0, không làm gì hết và dịch số chia sang phải một bít. Nếu dãy nhị phân đầu vào bên trên có bít cực tả là 1, lấy dãy số đầu vào trừ đi số chia (hay nói cách khác, lấy từng bít ở dãy số đầu vào trên trừ đi từng bít ở số chia). Số chia sau đó dịch vị trí 1 bít sang phải, quá trình cứ tiếp diễn như vậy đến khi số chia chạm tới tận cùng bên phải của dãy số đầu vào. Đây là phép tính cuối cùng:
00000000001110 <--- Kết quả của phép nhân 1011 <--- Số chia -------------- 00000000000101 <--- Số dư (3 bits)Do cực tả của số chia sẽ làm các bít tương ứng của dãy số đầu vào trở về 0 qua mỗi lần dịch, khi quá trình này kết thúc, chỉ còn những bít ở dãy đầu vào có thể không là 0 trở thành n bit cuối bên phải của dãy số. n bit này là số dư của bước chia, và cũng sẽ là giá trị hàm CRC (trừ khi hàm CRC được chọn đặc biệt được gọi cho một số công đoạn tiền xử lý).
Những hàm CRC thường dùng và được tiêu chuẩn hóa
Các dạng mã kiểm soát lỗi CRC (cyclic redundancy check) được chia thành nhiều tiêu chuẩn, chúng không được tiêu chuẩn hóa thống nhất cho 1 thuật toán nào ở mỗi mức độ trên toàn cầu: có 3 đa thức CRC-12[1], ít nhất 8 biến thể có trong tài liệu của CRC-16, và 3 biến thể của CRC-32[2] được biết đến. Các đa thức thường được xem như không phải là tối ưu nhất có thể. Trong những năm từ 1993 đến 2004, Koopman, Castagnoli và một số nhà khoa học đã tiến hành tìm kiếm trong không gian các đa thức lên đến 16[3], và không gian 24 và 32 bit,[4][5] tìm các ví dụ có hiệu suất tốt hơn nữa (trong các điều kiện quãng cách Hamming cho một bức tin có kích thước cho trước) so với các đã thức trong các giao thức trước đó, và xuất bản những kết quả tốt nhất trong số chúng với mục đích cải thiện năng tực tìm lỗi cho cac tiêu chuẩn trong tương lai[5].
Far from being arbitrarily chosen, đa thức phổ biển CRC-32 , được IEEE giới thiệu và được dùng trong V.42, Ethernet, FDDI và ZIP và các file PNG cũng như nhiều ứng dụng khác, là một đa thức sinh ra từ mã Hamming và được chọn để tìm lỗi[6] trong các kênh truyền thông. Dù vậy, nó còn có hiệu suất tốt hơn với đa thức Castagnoli CRC-32C sử dụng ở iSCSI[5] trong các môi trường Internet SCSI.
Bảng dưới đây chỉ liệt kê những đa thức của những thuật toán đa dạng đang được sử dụng. Bất kỳ giao thức cá biệt.
Tên | Đa thức | Các biểu diễn: thông thường hoặc nghịch đảo (đảo của đảo) |
---|---|---|
CRC-1 | x + 1 (hầu hết phần cứng; còn biết với tên parity bit) | 0x1 or 0x1 (0x1) |
CRC-4-ITU | x4 + x + 1 (ITU G.704, p. 12) | 0x3 or 0xC (0x9) |
CRC-5-ITU | x5 + x4 + x2 + 1 (ITU G.704, p. 9) | 0x15 or 0x15 (0x1A) |
CRC-5-USB | x5 + x2 + 1 (USB token packets) | 0x05 or 0x14 (0x12) |
CRC-6-ITU | x6 + x + 1 (ITU G.704, p. 3) | 0x03 or 0x30 (0x21) |
CRC-7 | x7 + x3 + 1 (Các hệ thống viễn thông, MMC,SD) | 0x09 or 0x48 (0x44) |
CRC-8-ATM | x8 + x2 + x + 1 (ATM HEC) | 0x07 or 0xE0 (0x83) |
CRC-8-CCITT | x8 + x7 + x3 + x2 + 1 (1-Wire bus) | 0x8D or 0xB1 (0xC6) |
CRC-8-Dallas/Maxim | x8 + x5 + x4 + 1 (1-Wire bus) | 0x31 or 0x8C (0x98) |
CRC-8 | x8 + x7 + x6 + x4 + x2 + 1 | 0xD5 or 0xAB (0xEA [3]) |
CRC-8-SAE J1850 | x8 + x4 + x3 + x2 + 1 | 0x1D or 0xB8 (0x8E) |
CRC-10 | x10 + x9 + x5 + x4 + x + 1 | 0x233 or 0x331 (0x319) |
CRC-11 | x11 + x9 + x8 + x7 + x2 + 1 (FlexRay) | 0x385 or 0x50E (0x5C2) |
CRC-12 | x12 + x11 + x3 + x2 + x + 1 (Các hệ thống viễn thông, [7][8] ) | 0x80F or 0xF01 (0xC07) |
CRC-15-CAN | x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1 | 0x4599 or 0x4CD1 (0x62CC) |
CRC-16-Fletcher | Không phải một CRC; xem Fletcher's checksum | Sử dụng trong Adler-32 A & B CRC |
CRC-16-CCITT | x16 + x12 + x5 + 1 (X.25, V.41, CDMA, Bluetooth, XMODEM, HDLC,PPP, IrDA, BACnet; known as CRC-CCITT, MMC,SD) | 0x1021 or 0x8408 (0x8810 [3]) |
CRC-16-DNP | x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1 (DNP, IEC 870, M-Bus) | 0x3D65 or 0xA6BC (0x9EB2) |
CRC-16-IBM | x16 + x15 + x2 + 1 (SDLC, USB, khác; còn được biết là CRC-16) | 0x8005 or 0xA001 (0xC002) |
CRC-24-Radix-64 | x24 + x23 + x18 + x17 + x14 + x11 + x10 + x7 + x6 + x5 + x4 + x3 + x + 1 (FlexRay) | 0x864CFB or 0xDF3261 (0xC3267D) |
CRC-30 | x30 + x29 + x21 + x20 + x15 + x13 + x12 + x11 + x8 + x7 + x6 + x2 + x + 1 (CDMA) | 0x2030B9C7 or 0x38E74301 (0x30185CE3) |
CRC-32-Adler | Không phải một CRC; xem Adler-32 | xem Adler-32 |
CRC-32-IEEE 802.3 | x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 (V.42, MPEG-2, PNG [9]) | 0x04C11DB7 or 0xEDB88320 (0x82608EDB [5]) |
CRC-32C (Castagnoli) | x32 + x28 + x27 + x26 + x25 + x23 + x22 + x20 + x19 + x18 + x14 + x13 + x11 + x10 + x9 + x8 + x6 + 1 | 0x1EDC6F41 or 0x82F63B78 (0x8F6E37A0 [5]) |
CRC-32K (Koopman) | x32 + x30 + x29 + x28 + x26 + x20 + x19 + x17 + x16 + x15 + x11 + x10 + x7 + x6 + x4 + x2 + x + 1 | 0x741B8CD7 or 0xEB31D82E (0xBA0DC66B [5]) |
CRC-64-ISO | x64 + x4 + x3 + x + 1 (HDLC — ISO 3309) | 0x000000000000001B or 0xD800000000000000 (0x800000000000000D) |
CRC-64-ECMA-182 | x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 + x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1 (as described in ECMA-182 p.63) | 0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0xA17870F5D4F51B49) |
- CRC-128 (IEEE)
- CRC-256 (IEEE)
0 nhận xét:
Đăng nhận xét