Phương pháp kiểm tra lỗi Checksum

Bạn chắc hẳn đã từng download 1 phần mềm hoặc 1 bộ phim từ trên mạng Internet. Khi download xong, nhưng mở thì không lên, báo lỗi, chúng ta thắc mắc nhưng người chia sẻ file bảo là file chia sẻ không có vấn đề gì? Vậy nguyên nhân do đâu? Có 1 cách để biết bạn kiểm tra file bạn download có còn nguyên vẹn, có bị lỗi khi truyền tải qua mạng Internet hay không. Đó là sử dụng checksum. Vậy hôm nay vinasupport sẽ giúp bạn tìm hiểu về checksum nhé và cách checksum đơn giản trên Windows 10 mà không cần sử dụng phần mềm của 1 bên thứ 3.

Checksum là gì?

Checksum [Nghĩa tiếng Việt-Anh dịch nôm na là kiểm tra tổng] thường được sử dụng để xác minh tính toàn vẹn dữ liệu. Checksum là một kiểm tra dữ liệu với mục đích phát hiện lỗi xảy ra trong quá trình truyền tải và lưu trữ của nó. Nó thường được áp dụng cho một file sau khi nó được nhận từ máy chủ tải xuống.

Bạn có thể hiểu qua ví dụ như sau:

File A [File gốc] -> Qua checksum -> Mã hash A
File B [Copy từ file B] -> Qua checksum -> Mã hash B

Nếu mã hash A bằng mã hash B thì file B là 1 bản sao hoàn chỉnh của file A.
Nếu mã hash A khác mã hash B thì file B là 1 bản sao lỗi của file A. Nó đã gặp lỗi trong quá trình copy từ file A

Hướng dẫn checksum trên Windows 10

Sử dụng ứng dụng CertUtil có sẵn của Windows 10. Các bạn làm theo hướng dẫn sau đây.

Bước 1: Bấm tổ hợp phim [Window] + [R] -> gõ cmd -> Enter để mở ứng dụng Command Line CMD của Windows.

Hoặc bạn có thể sử dụng ứng dụng PowerShell trên Windows 10 bằng việc bấm tổ hợp phim [Window] + [X]. Ở đây mình sử dụng PowerShell

Bước 2: Từ giao diện command line của PowerShell gõ các command sau để kiểm tra định dạng của 1 file

cd C:\Windows\System32
CertUtil -hashfile  
  • : Đường dẫn tới file cần checksum trên máy tính
  • : Loại hash cần kiểm tra. Các loại hash gồm có:  md2, md3, md4, md5, sha1, sha256, sha384, sha512. Để biết loại mã hash nào cần kiểm tra, bạn cần xem người chia sẻ file cung cấp loại mã Hash nào.

VD: Như hình bên dưới mình thực hiện checksum file SLE-15-Installer-DVD-x86_64-GM-DVD1.iso với loại hash là md5.

Khi truyền tải một chuỗi các bit, các lỗi có thể phát sinh ra, bit 1 có thể biến thành bit 0 hay ngược lại.

Ta định nghĩa tỷ lệ lỗi bởi tỷ số sau:

τ = Số bít bị lỗi / Tổng số bít được truyền

Tỷ lệ lỗi này có giá trị từ 10-5 đến 10-8. Tùy thuộc vào từng loại ứng dụng, một lỗi có mức độ nghiêm trọng khác nhau, chính vì thế cần có các cơ chế cho phép phát hiện lỗi cũng như sửa lỗi.

Các thống kê cho thấy rằng 88% các lỗi xẩy ra do sai lệch một bit và 10% các lỗi xảy ra do sự sai lệch 2 bit kề nhau. Chính vì thế ta ưu tiên cho vấn đề phát hiện các lỗi trên một bit và sửa đổi chúng một cách tự động.

Với ý tưởng như thế, ta sử dụng các mã phát hiện lỗi: bên cạnh các thông tin hữu ích cần truyền đi, ta thêm vào các thông tin điều khiển. Bên nhận thực hiện việc giải mã các thông tin điều khiển này để phân tích xem thông tin nhận được là chính xác hay có lỗi.

Mô hình xử lý lỗi trong truyền dữ liệu[H4.5]

Thông tin điều khiển được đưa vào có thể theo 2 chiến lược. Chiến lược thứ nhất gọi là bộ mã sửa lỗi [Error-correcting codes] và chiến lược thứ hai gọi là bộ mã phát hiện lỗi [Error-detecting codes]. Bộ mã sửa lỗi cho phép bên nhận có thể tính toán và suy ra được các thông tin bị lỗi [sửa dữ liệu bị lỗi]. Trong khi bộ mã phát hiện lỗi chỉ cho phép bên nhận phát hiện ra dữ liệu có lỗi hay không. Nếu có lỗi bên nhận sẽ yêu cầu bên gởi gởi lại thông tin. Với tốc độ của đường truyền ngày càng cao, người ta thấy rằng việc gởi lại một khung thông tin bị lỗi sẽ ít tốn kém hơn so với việc tính toán để suy ra giá trị ban đầu của các dữ liệu bị lỗi. Chính vì thế đa số các hệ thống mạng ngày nay đều chọn bộ mã phát hiện lỗi.

Những bộ mã phát hiện lỗi [Error-Detecting Codes]

Có nhiều sơ đồ phát hiện lỗi, trong đó có các sơ đồ thông dụng là:

  • Kiểm tra chẵn lẻ [Parity checks]
  • Kiểm tra thêm theo chiều dọc [Longitudinal reduncy check]
  • Kiểm tra phần dư tuần hoàn [Cyclic redundancy check]

Kiểm tra chẵn lẻ [Parity Check]

Sơ đồ phát hiện bit lỗi đơn giản nhất là nối một bit chẵn-lẻ vào cuối của mỗi từ trong khung. Một ví dụ tiêu biểu là việc truyền các ký tự ASCII, mà trong đó một bit chẵn-lẻ được nối vào mỗi ký tự ASCII 7 bit. Giá trị của bit này được lựa chọn sao cho có một số chẵn của bit 1, với kiểm tra chẵn [even parity] hoặc một số lẻ của bit 1, với kiểm tra lẻ [odd parity].

Ví dụ, nếu bên gởi đang truyền một ký tự ASCII G [ mã ASCII là1110001] và đang dùng phương pháp kiểm tra lẽ, nó sẽ nối một bit 1 và truyền đi 11100011. Bên nhận sẽ kiểm tra ký tự nhận được và nếu tổng của các bit 1 là lẻ, nó xem như không có lỗi. Nếu một bit hoặc một số lẻ bất kỳ các bit bị lỗi đảo ngược thì rõ ràng bên nhận sẽ phát hiện được lỗi. Tuy nhiên, nếu hai hay một số chẵn bất kỳ các bit bị lỗi đảo ngược thì nó sẽ không phát hiện được lỗi. Trên thực tế những xung nhiễu lại thường đủ dài để có thể phá hủy hơn một bit, đặc biệt là với tốc độ dữ liệu cao. Do đó, cần phải có một phương pháp cải thiện trường hợp này.

Kiểm tra thêm theo chiều dọc [Longitudinal Redundancy Check or Checksum]

Kiểm tra chiều dọc tuần hoàn[H4.6]

Có thể cải thiện sơ đồ trên bằng cách dùng phương pháp LRC. Trong phương pháp này, khung được xem như một khối nhiều ký tự được sắp xếp theo dạng hai chiều, và việc kiểm tra được thực hiện cả chiều ngang lẫn chiều dọc.

Theo chiều ngang, mỗi ký tự được thêm vào một bit kiểm tra chẵn lẽ như trường hợp trên, và được gọi là bit Kiểm tra chiều ngang VRC [Vertical Redundancy Check].

H4.6 Kiểm tra chiều dọc tuần hoànTheo chiều dọc, cung cấp thêm một ký tự kiểm tra, được gọi là ký tự Kiểm tra chiều dọc LRC [Longitudinal Redundancy Check] hay Checksum. Trong đó, bít thứ i của ký tự này chính là bit kiểm tra cho tất cả các bit thứ i của tất cả các ký tự trong khối.

Các phép đo chỉ ra rằng việc dùng cả hai VRC và LRC giảm đi tỷ lệ lỗi không phát hiện được hai đến bốn bậc so với dùng chỉ VRC. Hãy xem trường hợp bit 1 và 3 trong ký tự 1 đang bị lỗi. Khi bên nhận tính toán được bit VRC cho ký tự 1, nó sẽ kiểm tra với bit VRC đã nhận, và sẽ không phát hiện được lỗi. Tuy nhiên, khi nó tính toán được ký tự LRC, bit 1 và 3 của ký tự này sẽ khác với những bit đó trong ký tự LRC nhận được, và sẽ phát hiện được lỗi.

Tuy nhiên, ngay sơ đồ này cũng không phải là thật sự tốt. Bây giờ, nếu giả sử bit 1 và 3 của ký tự 5 cũng bị lỗi, phương pháp này sẽ không phát hiện được điểm sai.

Kiểm tra phần dư tuần hoàn [Cyclic Redundancy Check]

Để cải tiến hơn nữa các nhà thiết kế đã dùng kỹ thuật mới dễ dàng và hiệu quả được gọi là kiểm tra phần dư tuần hoàn, trong đó có thể sử dụng một số phương pháp cài đặt khác nhau như: modulo 2, đa thức, thanh ghi dịch và các cổng Exclusive-or.

Các thủ tục với modulo 2 diễn ra như sau. Với một thông điệp M có k bit cần gởi đi, bên gởi sẽ nối vào cuối thông điệp một chuỗi F có r bit, được gọi là Chuỗi kiểm tra khung [FCS: Frame Check Sequence]. Chuỗi kiểm tra khung sẽ tính toán sao cho khung kết quả T được hình thành từ việc nối M với F [gồm k + r bit] có thể chia hết bởi số P nào đó được định trước. Bên gởi sẽ gởi T đi. Khi bên nhận nhận được T, nó sẽ thực hiện phép chia modulo T cho P. Nếu phép chia không hết, tức có số dư, bên nhận xác định rằng khung T đã bị lỗi, ngược lại là không có lỗi. Nếu khung không có lỗi, bên nhận sẽ tách thông điệp M từ T, là k bits trọng số cao của T.

Phương pháp này dùng phép chia modulo 2 trong việc chia T cho P, phép toán modulo 2 dùng một phép cộng nhị phân không nhớ và đó cũng chính là phép toán Exclusive-or. Ví dụ sau mô tả phép toán cộng và nhân modulo 2:

111111001+1010x1101011100111001101011
  • Giả sử ta có:
    • M: Thông điệp k bit cần được gởi sang bên nhận.
    • F : Chuỗi kiểm tra khung FCS gồm r bit là thông tin điều khiển được gởi theo M để giúp bên nhận có thể phát hiện được lỗi.
    • T =MF là khung [k + r] bit, được hình thành bằng cách nối M và F lại với nhau. T sẽ được truyền sang bên nhận, với r < k
  • Với M [k bit] , P [r+1 bit], F [r bit], T [k+r bit], thủ tục tiến hành để xác định checksum F và tạo khung truyền như sau:
    • Nối r bit 0 vào cuối M, hay thực hiện phép nhân M với 2r
    • Dùng phép chia modulo 2 chia chuỗi bit M*2r cho P.
    • Phần dư của phép chia sẽ được cộng với M*2r tạo thành khung T truyền đi.
    • Trong đó P được chọn dài hơn F một bit, và cả hai bit cao nhất và thấp nhất phải là 1

Ví dụ:

  • Giả sử ta có:
    • M = 1010001101 [10 bit]
    • P = 110101 [6 bit]
    • FCS cần phải tính toán [ 5 bit]
  • Ta lần lượt thực hiện các bước sau:
    • Tính M*25 = 101000110100000.
    • Thực hiện phép chia modulo M*25 cho P như hình dưới, ta được phần dư F = 01110
    • Tạo khung gởi đi là T = M*2r + F = 101000110101110

Ngoài ra người ta còn có thể sử dụng phương pháp đa thức để biểu diễn phương pháp kiểm tra phần dư tuần hòan. Trong phương pháp này người ta biểu diễn các chuỗi nhị phân dưới dạng những đa thức của biến x với các hệ số nhị phân. Các hệ số tương ứng với các bit trong chuỗi nhị phân cần biểu diễn.

Giả sử ta có M=110011và P = 11001, khi đó M và P sẽ được biểu diễn lại bằng 2 đa thức sau:

M[x] = x5 + x4 + x + 1

P[x] = x4 + x3 + 1

Những phép toán trên đa thức vẫn là modulo 2. Quá trình tính CRC được mô tả dưới dạng các biểu thức sau:

Chủ Đề