Mạng cần có khả năng truyền dữ liệu một cách chính xác. Một hệ thống không bảo đảm được tính năng này thì không sử dụng được. Trong quá trình truyền thì dữ liệu luôn bị tác động bởi nhiều yếu tố, như nhiễu, như thế hệ thống cần có độ tin cậy tốt với cơ chế phát hiện và sửa lỗi.
Việc phát hiện và sửa lỗi được thiết lập ở lớp kết nối dữ liệu hoặc lớp vận chuyển trong mô hình OSI.
22 trang |
Chia sẻ: maiphuongtt | Lượt xem: 7105 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng: Truyền số liệu Chương 9: Phát hiện và sửa lỗi, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 9
PHÁT HIỆN VÀ SỬA LỖI
Mạng cần có khả năng truyền dữ liệu một cách chính xác. Một hệ thống không bảo đảm được tính năng này thì không sử dụng được. Trong quá trình truyền thì dữ liệu luôn bị tác động bởi nhiều yếu tố, như nhiễu, như thế hệ thống cần có độ tin cậy tốt với cơ chế phát hiện và sửa lỗi.
Việc phát hiện và sửa lỗi được thiết lập ở lớp kết nối dữ liệu hoặc lớp vận chuyển trong mô hình OSI.
CÁC DẠNG LỖI
Khi tín hiệu điện từ trường đi từ điểm này sang điểm khác, sẽ chịu các tác động nhiễu chưa dự báo được từ nhiệt, từ và các dạng khác của điện. Nhiễu loạn này có thể làm thay đổi hình dạng hay độ rộng của tín hiệu. Nếu tín hiệu mang các dữ liệu mã nhị phân, thì yếu tố này có thể làm thay đổi ý nghĩa của dữ liệu. Trong lỗi một bit, thì 0 biến thành 1 và 1 biến thành 0. Trong lỗi bệt (nhiều bit), thì nhiều bị có thể bị thay đổi. Thí dụ, một bệt nhiễu xung trogn truyền dẫn với tốc độ dữ liệu 1200 bps có thể làm thay đổi toàn bộ hay một số bit trong 12 bit thông tin (xem hình 1)
Lỗi một bit: tức là chỉ có một bị trong một đơn vị dữ liệu (byte, ký tự, đơn vị dữ liệu, hay gói) là bị thay đổi từ 1 xuống 0 hay từ 0 xuống 1. Hình 2 cho thấy ảnh hưởng của sai một bit đối với đơn vị dữ liệu. Để hiểu được tác động này, giả sử mỗi nhóm 8 bit là một ký tự ASCII có thêm một bit 0 ở cuối. Trong hình, 00000010 (ASCII STX) được gởi đi, tức là bắt đầu văn bản text (STX: start of text), như khi nhận thì là 0001010 (ASCII LF), lại có nghĩa là xuống dòng (LF:line feed; xem thêm bản mã ASCII)
Lỗi một bit thường ít xuất hiện trong phương thức truyền nối tiếp. Thí dụ, xét trường hợp máy phát gởi dữ liệu với tốc độ 1 Mbps, tức là mỗi bit tồn tại trong 1/1.000.000 giây, hay 1 ms. Khi sai một bit, thì nhiễu phải xuất hiện trong thời gian 1 ms, như thế là rất hiếm, nhiễu thường có độ rộng hơn nhiều.
Tuy nhiên, lỗi một bit có thể xuất hiện khi ta gởi dữ liệu dùng phương pháp song song. Thí dụ, dùng 8 dây dẫn để gởi 8 bit, để gởi đồng thời, như thế khi một dây bit nhiễu thì có một bit có thể bị sai. Trường hợp này cũng xuất hiện trong truyền dẫn song song bên trong máy tính, giữa CPU và bộ nhớ.
Lỗi bệt:
Tức là lỗi trên hai hay nhiều bit trong đơn vị dữ liệu đã thay đổi từ 1 thành 0 hay từ 0 thành 1.
Hình 3 cho thấy ảnh hưởng của nhiễu bệt lên đơn vị dữ liệu. Trong trường hợp này, thì 0100010001000011 được gởi đi, như nhận được 0101110101000011. Chú ý là nhiễu bệt không có nghĩa là các bit bị lỗi lần lượt, mà có nghĩa là bệt trong khoãng từ bit sai đầu tiên cho đến bit cuối. Một số bit bên trong bệt có thể không bị sai.
Nhiễu bệt thường xuất hiện trong truyền nối tiếp. Độ dài của nhiễu thường dài hơn độ rộng của bit, tức là khi nhiễu tác động thì ảnh hưởng được lên nhiều bit. Số bit bị ảnh hưởng tùy thuộc vào tốc độ dữ liệu và độ rộng nhiễu. Thí dụ, nếu ta gởi dữ liệu với tốc độ 1 Kbps, thì nhiễu với độ rộng 1 ms có thể ảnh hưởng lên 10 bit; nhưng khi ta gởi dữ liệu với tốc độ 1 Mbps, thì nhiễu này gây ảnh hưởng lên 10.000 bit.
PHÁT HIỆN LỖI
Khi ta biết được dạng lỗi, thì ta có ghi nhận được hay không? Nếu ta có bản copy của dữ liệu truyền để só ánh, thì dễ dàng. Nhưng nếu ta không biết được dữ liệu gốc, thì rõ ràng ta chỉ có thể biết được khi giải mả bản tin để biết rằng ý nghĩa đã bị sai, điều này đòi hỏi phải có một cơ chế để phát hiện lỗi, để có biện pháp xử lý thích hợp.
Mã thừa (Redundancy)
Một cơ chế phát hiện lỗi phải được thực hiện bằng cách gởi cùng lúc với các đơn vị dữ liệu. Thiết bị thu sẽ có thể so sánh từng bit với hai dạng của dữ liệu. Bất kỳ một sựu không nhất quán nào sẽ cho thấy lỗi, và cho phép thiết lập một cơ chế sữa lỗi, tuy nhiên cơ chế này nhất thiết phải tương đối đơn giản và hiệu quả, không làm gia tăng thời gian truyền cũng như làm tăng độ phức tạp của thiết bị.
Ý tưởng thêm các thông tin phụ vào trong bản tin chỉ nhằm mục đích giúp kiểm tra lỗi, nên thay vì gởi đi một bản tin dài, thường thì ta chỉ thêm vào một đoạn bit ngắn vào cuối mỗi đơn vị dữ liệu. Kỹ thuật này được gọi là mã thừa do các bit thêm vào không có ý nghĩa về thông tin, chúng sẽ được loại ra sau khi đã xác định xong độ chính xác của quá trình truyền.
Hình 4 cho thấy quá trình dùng bit thừa để kiểm tra tính chính xác của đơn vị dữ liệu. Sau khi dòng bit được tạo ra, thì được đưa qua một thiết bị để phân tích và gắn thêm vào mã thừa thích hợp dùng kiểm tra. Đơn vị dữ liệu sau khi đuợc thêm vào nhiều bit (trường hợp hình vẽ là 7) trở nên lớn hơn và đi qua đường truyền đến máy thu. Máy thu cho bản tin này qua phần kiểm tra, nếu các bit nhận được thỏa mãn các tiêu chuẩn dùng kiểm tra thì phẩn dự liệu trong đơ vị dữ liệu được chấp nhận và các bit dư được loại đi.
Có bốn dạng kiểm tra dùng mã thừa trong thông tin dữ liệu; VRC (vertical redundancy check), LRC (longitudinal redundancy check), CRC (cyclic redundancy check) và checksum. Ba dạng đầu, VRC, LRC, và CRC thường được thiết lập trong lớp vật lý để dùng trong lớp kết nối dữ liệu. Dạng checksum thường được dùng trong các lớp trên (hình 5)
9.3 VRC (VERTICAL REDUNDANCY CHECK)
Cơ chế đơn giản và thường được dùng nhất trong phát hiện lỗi là VRC, còn được gọi là kiểm tra parity (chẵn/lẻ). Trong kỹ thuật này, một bit thừa, gọi là bit parity được gắn thêm vào các đơn vị dữ liệu sao cho tổng số bit 1 trong đơn vị dữ liệu (bao gồm bit parity) là một số chẵn (even).
Giả sử ta muốn truyền đơn vị dữ liệu nhị phân 1100001 [ASCII là a 97]; xem hình 6. Ta thấy tổng số số 1 là 3, tức là một số lẻ. Trước khi truyền, ta cho đơn vị dữ liệu qua bộ tao parity, để gắn thêm vào đơn vị dữ liệu một bit 1, làm tổng số bit 1 thành 4, là số chẵn. Hệ thống truyền dữ liệu với parity bit này vào đường truyền. Thiết bị thu, sau khi nhận sẽ đưa đơn vit dữ liệu sang hàm kiểm tra parity chẵn. Nếu dữ liệu nhận được có tổng số số 1 là chẵn thì chấp nhận, nếu không, thì loại toàn đơn vị dữ liệu.
Chú ý là để đơn giản, ta đã thảo luận về parity chẵn, thực ra một số hệ thống có thể dùng phương pháp parity -lẻ. Nguyên tắc thì giống nhau, tuy phép tính khác.
Thí dụ 1:
Giả sử ta muốn truyền từ “world” trong mã ASCII, thì năm ký tự này được mã hóa như sau:
Bốn ký tự đầu có số bit một là chẵn, nên có bit parity là 0, còn ký tự cuối có số bit 1 là lẻ nên có bit parity là 1 (các bit parity được gạch dưới)
Thí dụ 2:
Giả sử ký tự tạo được từ thí dụ 1 được máy thu nhận được như sau:
Máy thu đếm số bit 1 và nhận ra có số bit một là chẵn và lẻ, phát hiện có lỗi, nên loại bản tin và yêu cầu gởi lại.
Hiệu năng:
VRC có thể phát hiện tất cả các dạng lỗi 1 bit. Đồng thời cũng có thể phát hiện các lỗi bệt bao lâu mà tổng số bit thay đổi là lẻ(1, 3, 5, v,v....) trong mỗi đơn vị dữ liệu. Thí dụ, xét dữ liệu 1000111011, nếu có ba bit thay đổi thì kết quả sẽ là lẻ và máy thu phát hiện ra được: 1111111011: 9 0110 0111011:7 1000011011:5.
Trường hợp hai bit bị lỗi: 1110111011:8 1100011011:6 1000011010:4
Máy thu không phát hiện được ra lỗi và chấp nhận.
9.4 LRC (LONGITUDINAL REDUNDANCY CHECK)
LCR là khối bit được sắp xếp thành bảng (hàng và cột). Thí dụ, thay vì gởi đi một khối 32 bit, ta tổ chức chúng thành bốn hàng và tám cột như hình 7. tiếp đến, tính bit parity cho mỗi cột và tạo một cộ mới gồm tám bit, và là bit parity của toàn khối. Chú ý là bit parity đầu tiên được tính từ tất cả các bit đầu trong khối, tương tự cho bit hai, ect.
Thí dụ 3:
Gỉa sử khối bit truyền đi là:
Tuy nhiên, có nhiễu bệt độ dài tám bit xuất hiện, làm một số bit bị lỗi:
Khi máy thu kiểm tra LRC, một số bit không theo đúng parity chẵn và toàn khối bị loại (các giá trị sai được in đậm)
Hiệu năng:
LCR cho phép gia tăng khả năng phát hiện nhiễu bệt. Trong thí dụ vừa qua, ta thấy được là LCR với n bit thì có khả năng phát hiện dễ dàng nhiễu bệt n bit. Bệt nhiễu với độ dài lớn hơn n bit cũng có nhiều khả năng được LCR phát hiện. Tuy nhiên khi hai bit cùng sai ở hai vị trí giống nhau thì LCR không phát hiện được. Thí dụ, hai đơn vị dữ liệu: 11110000 và 11000011. Nếu bit đầu và bit cuối của hai đơn vị đều bit lỗi, tức là dữ liệu nhận được là 01110001 và 01000010 thì LCR không thể phát hiện được lỗi.
9.5 CRC (CYCLIC REDUNDANCY CHECK):
Dạng thứ 3 và cũng là dạng mạnh nhất là CRC. Không giống như VRC và LCR, đều dựa trên phép cộng, CRC dùng phép chia nhị phân. Trong CRC, thay vì cộng các bit để có parity, trường hợp này dùng một chuỗi bit thừa, gọi là CRC hay dư số CRC, và gắn thêm vào phần cuối của đơn vị dữ liệu sao cho đơn vị dữ liệu mới là số chia chính xác của dữ liệu trước. Nơi nhận, đơn vị dữ liệu được chia với cùng số chia (divisor). Đến đây, nếu không có dư số, thì dữ liệu được xem là không bị lỗi và được chấp nhận. Trường hợp có dư số tức là đơn vị dữ liệu nhận được đã bị lỗi và nên bị loại.
Các bit thừa trong CRC có được bằng cách chia đơn vị dữ liệu với một số chia (divisor) cho trước và dư số là CRC. Yêu cầu đối với CRC gồm hai yếu tố: phải có số bit nhỏ hơn 1 so với divisor, và được gắn vào cuối chuỗi dữ liệu thì phải làm cho chuỗi dử liệu mới chia được cho divisor.
Lý thuyết và ứng dụng của phương pháp phát hiện lỗi dùng CRC thì dễ hiểu. Tuy nhiên, khó khăn nhất là tìm CRC. Phần tiếp theo đây ta sẽ dần dần tìm hiểu về phương pháp này:
Đầu tiên, gắn thêm n bit 0 vào đơn vị dữ liệu, số n này nhỏ hơn một so với (n+1) bit của bộ chia (divisor).
Bước hai, dữ liệu mới này được chia cho bộ chia dùng phép chia nhị phân. Kết quả có được chính là CRC.
Bước ba, CRC với n bit của bước hai thay thế các bit 0 găn ở cuối đơn vị dữ liệu. Chú ý là CRC có thể chứa toàn bit 0.
Đơn vị dữ liệu đến máy thu với phần đầu là dữ liệu, tiếp đến là CRC. Máy thu xem toàn chuỗi này là một đơn vị và đem chia chuỗi cho cùng bộ chia đã được dùng tạo CRC.
Khi chuỗi đến máy thu là không lỗi, thì bộ kiểm tra CRC có số dư là 0 và chấp nhận đơn vị dữ liệu này. Khi chuỗi bị thay đổi trong quá trình truyền, thì số dư sẽ khác không và bộ thu không chấp nhận đơn vị này.
Bộ tạo CRC
Bộ CRC dùng phép chia modulo – 2 như vẽ trong hình 9. Trong bước đầu, bộ chia bốn bitt được trừ đi. Mỗi bit trong bộ chia được trừ với các bit tương ứng mà không anh hưởng đến bit kế tiếp. Trong thí dụ này, bộ chia 1101, được trừ từ bốn bit của bộ divident, 1001, có được 100 (bit 0 đầu bị bỏ qua).
Bước kế tiếp, lấy 1000 – 1101
Trong quá trình này, bộ chia luôn bắt đầu với1 bit 1; và hệ thống thự hiện phép chia theo cách trừ nhị phân không có số nhớ (tức là 0 – 0 = 0; 1 – 1 = 0; 0 – 1 = 1; 1 – 0 = 1).
Bộ kiểm tra CRC
Bộ này hoạt động giống hệt như bộ phát. Sau khi nhận được giữa liệu có gắn thêm phần CRC, mạch thực hiện lại phép chia modulo – 2. Nếu kết quả là 0, cắt bỏ phần CRC và nhận dữ liệu; ngược lại thì loại bỏ dữ liệu và yêu cầu gởi lại. Hình 10 mô tả quá trình này, vớ giả sử là không có lỗi, dư số là 0 và dữ liệu được chấp nhận.
Các đa thức:
Bộ tạo CRC (bộ chia) thường không chỉ là chuỗi các bit 1 và 0, nhưng tạo ra từ đa thức đại số (như hình 11). Các đa thức này tiện lợi vì hai lý do: Chúng thường ngắn, và thường được dùng để chứng minh các ý niệm toán học trong quá trình CRC).
Quan hệ giữa chuỗi đa thức với biểu diễn nhị phân được minh họa ở hình 12.
Một đa thức sinh của bộ chia cần được chọn theo các đặc tính sau:
Không được chia hết cho thức x
Chia đúng cho đa thức (x + 1)
Điều kiện đầu nhằm bảo đảm là tất cả các nhiễu bệt có độ dài bằng bậc của đa thức sinh đều được phát hiện. Điều kiện thứ hai bảo đảm là tất cả các nhiễu bệt ảnh hưởng lên thứ tự bit lẻ được phát hiện.
Thí dụ 4:
Rõ ràng là ta không thể chọn x (số nhị phân 10) hay x2 + x (số nhị phân 110) làm đa thức được vì chúng chia hết cho x. Tuy nhiên, ta có thể chọn x+1 (tương ứng 11) do không chia hết cho x, mà chia hết cho (x+1), cũng như ta có thể chọn x2 + 1 (số nhị phân 101) do chia hết cho (x+1).
Các đa thức chuẩn dùng trong bộ chia CRC được minh họa trong hình 13. Các số 12, 16, và 32 có liên quan đến kích thước của dư số CRC. Bộ chia CRC tương ứng là 13, 17 và 33 bit.
Hiệu năng:
CRC là phương pháp phát hiện lỗi rất hiệu quả nếu bộ chia được chọn theo các luật vừa nêu do:
CRC có thể phát hiện tất cả các nhiễu bệt ảnh hưởng lên các bit có thứ tự lẻ.
CRC có thể phát hiện các nhiễu bệt có độ dài bé hơn hay bằng bậc của đa thức.
CRC có thể phát hiện với xác suất cao các nhiễu bệt có độ dài lớn hơn bậc của đa thức.
Thí dụ 5:
CRC – 12 (x12+x11+x3+x+1) có bậc 12, có thể phát hiện tất cả các nhiễu bệt ảnh hưởng lên các bit lẻ, và cũng có thể phát hiện tất cả các nhiễu bệt có độ dài lớn hơn hay bằng 12, và phát hiện đến 99,97% các nhiễu bệt có độ dài lớn hơn 12 hay dài hơn nữa.
9.6 CHECKSUM
Phương pháp phát hiện lỗi ở giao lớp lớp cao hơn và giống như các phương pháp VRC, LRC, và CRC thì phương pháp này cũng dựa trên yếu tố thừa (redundancy).
Bộ tạo Checksum:
Tại máy phát, bộ này chia các đơn vị dữ liệu thành các phân đoạn bằng nhau với n bit (thường là 16). Các phân đoạn này được cộng với nhau dùng phương pháp bù 1 để có kết quả cũng có độ dài n bit. Giá trị tổng này được lấy bù và gắn vào đươi của dữ liệu gốc như là giá trị thừa, và được gọi là trường checksum. Các đơn vị dữ liệu mở rộng này được truyền qua mạng. Như thế, nếu tổng của đơn vị dữ liệu là T, thì checksum là - T (xem hình 14 và 15).
The sender follows these steps :
■ The unit is divided into k sections, each of n bits.
■ All sections are added together using one’s complement to get the sum.
■ The sum is complemented and becomes the check sum.
■ The check sum is sent with the data.
The receiver follows these steps :
■ The unit is divided into k sections, each of n bits.
■ All sections are added together using one’s complement to get the sum.
■ The sum is complemented.
■ If the result is zero, the data are accepted : otherwise, they are rejected.
Bộ kiểm tra checksum:
Máy thu chia nhỏ đơn vị dữ liệu thành các phân đoạn và lấy các giá trị bù. Nếu đơn vị dữ liệu là còn nguyên, thì giá trị tổng có được từ phép cộng các phân đoạn dữ liệu và checksum sẽ là 0. Nếu kết quả khác không, thì gói có chứa lỗi và máy thu loại bỏ đơn vị dữ liệu này.
Thí dụ 6:
Giả sử khối 16 bit sau được gởi đi dùng checksum 8 bit
Số này được cộng với phần bù một , để có:
Thí dụ 7:
Giả sử máy thu nhận được mẫu sau của thí dụ 7 và không có lỗi, thì
Khi máy thu cộng ba phân đoạn lại, thì sẽ có tổng là các giá trị 1, tức là sau khi lấy bù, có giá trị 0, cho thấy không có lỗi.
Thí dụ 8:
Giả sử có nhiễu bệt với độ dài 5 ảnh hưởng lên 4 bit
Khi máy thu cộng ba đoạn này lại, thì có giá trị khác không, nên không nhận:
Hiệu năng:
Checksum phát hiện được tất cả các lỗi bit lẻ cùng như hầu hết các bit chẵn. Tuy nhiên, nếu một hay nhiều bit trong phân đoạn bị hỏng và bit tương ứng hay bit có giá trị đảo trong phân đoạn thứ hai cũng bị lỗi, thì khi lấy tổng, không nhận ra thay đổi và máy thu không phát hiện lỗi được. Nếu bit cuối trong một phân đoạn là 0 và bi đổi thành 1 khi truyền, thì ta không thể phát hiện ra lỗi nếu bit 1 cuối của phân đoạn thứ hai cũng chuyển thành 0.
9.7 SỬA LỖI
Các cơ chế vừa trình bày chỉ có thể phát hiện, nhưng không thể sửa lỗi. Có hai phương pháp sửa lỗi là: Thứ nhất, khi phát hiện một lỗi, máy thu phải yêu cầu máy phát chuyển lại toàn bộ đơn vị dữ liệu; cách thứ hai máy thu dùng các mã sửa lỗi, để sử tự động một số lỗi.
Về mặt lý thuyết, thì có có thể sửa chửa tự động bất kỳ số nhị phân nào. Các mã sửa lỗi, thường rất phức tạp hơn so với mã phát hiện lỗi và cần nhiều bit dư hơn nữa. Số bit cần thiết để sửa lỗi nhiều bit hay lỗi bệt thường rất lớn và không phải lúc nào cũng hiệu quả. Nên , thông thường hầu hết các phương pháp sửa lỗi đều giới hạn ở một, hai hoặc ba bit mà thôi.
SỬA LỖI ĐƠN
Ý niệm đơn giản và dễ hiểu nhất. Như đã biết thì lỗi bit đơn có thể được phát hiện bằng cách thêm các bit dư (parity) vào trong đơn vị dữ liệu (VRC). Một bit được thêm vào có thể phát hiện lỗi một bit trong nhiều chuỗi bit do phải phân biệt hai điều kiện: lỗi và không có lỗi. Mỗi bit có hai trạng thái (0 và 1) nên đủ điều kiện để phát hiện lỗi ở cấp độ này.
Nhưng nếu muốn sửa lổi đơn thì phải làm sao? Hai trạng thái là đủ để phát hiện lỗi nhưng chưa đủ để sửa lỗi. Lỗi xuất hiện khi máy thu đọc bit 1 thành 0 và bit 0 thành 1. Để sửa lỗi thì máy thu chỉ cần đảo ngược lại giá trị bit bit sai. Tuy nhiên, điều quan trọng là phải biết được bit nào bị sai. Như thế, bí mật trong sửa lỗi là phương pháp định vị được bit sai này.
Thí dụ, khi cần sửa lỗi một bit trong ký tự ASCII, thì mã sửa lỗi phải xác định bit nào bị thay đổi trong bảy bit. Trường hợp này, cần phân biệt được giữa tám trạng thái khác nhau: không lỗi, lỗi ở vị trí 1, lỗi ở vị trí 2, và tiếp tục cho đến vị trí 7. Như thế cần thiết phải có đủ số bit dư để biểu diễn được tám trạng thái này.
Đầu tiên, ta nhận thấy là với 3 bit là đủ do có thể biểu diễn được tám trạng thái (từ 000 đến 111) và như thế thì có thể chỉ ra được tám khả năng khác nhau. Tuy nhiên, việc gì xảy ra nếu lỗi lại rơi vào các bit dư này? Bảy bit trong ký tự ASCII cộng với 3 bit dư sẽ tạo ra 10 bit. Với ba bit là đủ, tuy nhiên cần có thêm các bit phụ cho tất cả các tình huống có thể xảy ra.
Các bit dư
Để tính số bit dư (r) cần có để có thể sửa lỗi một số bit dữ liệu (m), ta cần tìm ra quan hệ giữa m và r. Trong hình 16 cho thấy m bit dữ liệu và r bit dư. Độ dài của mã có được là m+r.
Nếu tổng số các bit trong một đơn vị được truyền đi là m+r, thì r phải có khả năng chỉ thị ít nhất m+r+1 trạng thái khác nhau. Trong đó, một trạng thái là không có lỗi và m+r trạng thái chỉ thị vị trí của lỗi trong mỗi vị trí m+r.
Điều đó, tức là m+r+1 trạng thái phải được r bit phát hiện ra được; và r bit có chể chỉ được 2r trạng thái khác nhau. Như thế, 2r phải lớn hơn hay bằng m+r+1:
2r ³ m+r+1.
Giá trị của r có thể được xác định từ cách gắn vào trong giá trị của m (chiều dài ban đầu của đơn vị dữ liệu cần gởi đi). Thí dụ, nếu giá trị của m là 7 (trường hợp 7 bit của mã ASCII), thì gía trị bé nhất của r cần thỏa mãn phương trình là 4:
24 ³ 7+4+1.
Bảng B.1 cho thấy một số khả năng của các giá trị m và r tương ứng.
Số lượng bit dữ liệu (m)
Số lượng bit dư (r)
Tổng số bit (m+r)
1
2
3
2
3
5
3
3
6
4
3
7
5
4
9
6
4
10
7
4
11
Mã Hamming
Ta đã xem xét số lượng bit cần thiết để phủ toàn bộ trạng thái bit lỗi có thể có khi truyền. Nhưng điều còn lại là phải xử lý như thế nào để biết được trạn thái đang xuất hiện? R.W.Hamming cung cấp một giải pháp thực tiển.
Định vị của các bit dư
Mã Hamming có thể được áp dụng vào đơn vị dữ liệu có chiều dài bất kỳ dùng quan hệ giữa dữ liệu và các bit dư đã được khảo sát trước đây. Thí dụ, mã 7 bit ASCII cần có bốn bit dư được thêm vào phần cuối đơn vị dữ liệu hay phân bố vào bên trong các bit gốc. Trong hình 17, các bit này được đặt ở các vị trí 1, 2, 4 và 8 (vị trí của chuổi 11 bit được sắp xếp theo số lũy thừa của 2). Để hiểu rõ hơn, ta gọi các bit này lần lượt là r1, r2, r4 và r8.
Trong mã Hamming, mỗi bit r là bit VRC của một tổ hợp các bit; r1 là bit VRC của một tổ hợp bit; r2 là một bit trong một tổ hợp bit khác và cứ thế tiếp tục. Tổ hợp được dùng để tính toán mỗi giá trị trong bốn bit r này trong chuỗi bảy bit được tính toán như sau:
r1: bit 1, 3, 5, 7, 9, 11
r2: bit 2, 3, 6, 7, 10, 11
r4: bit 4, 5, 6, 7
r8: bit 8, 9, 10, 11
Mỗi bit dữ liệu có thể tính đến trong nhiều hơn một lần tính VRC. Thí dụ, trong chuỗi trên, mội bit dữ liệu gốc được tính đến trong ít nhất hai tập, trong khi r chỉ được tính một lần.
Để tìm các mẫu trong chiến lược tính toán này, hảy xem cách biểu diễn của mỗi vit trí bit. Bit r1 được tính dùng tất cả các vị trí bit có cách biểu diễn nhị phân có 1 trong vị trí tận cùng bên phải. Bit r2 được tính dùng tất cả các vị trí bit có cách biểu diễn nhị phân có 1 trong vị trí thứ hai bên phải và tiếp tục như vẽ trong hình 18.
Tính toán các giá trị r
Hình 19 minh họa các thiết lập mã Hamming trong ký tự ASCII. Bước đầu tiên, ta đặt mỗi bit của ký tự gốc vào vị trí thích hợp trong đơn vị 11 bit. Trong bước kế tiếp, ta tính các parity chẵn với nhiều tổ hợp bit khác nhau. Giá trị parity của mỗi tổ hợp là giá trị bit r tương ứng.Thí dụ, giá trị của r1 được tính để cung cấp parity chẵn cho tổ hợp các bit 3, 5, 7, 9 và 1