Giải thuật định tuyến của Humblet [11] là một giải thuật phân tán tìm các đường đi ngắn nhất trong một mạng có tôpô thay đổi. Nó không tạo vòng lặp định tuyến như giải thuật của Bellman-Ford mặc dù tính toán của nó thực sự phân tán. Nếu như giải thuật Netchange thuộc nhóm giải thuật định tuyến độc lập điểm đích, giải thuật của Humblet thuộc nhóm giải thuật định tuyến cộng tác giữa các điểm đích.
Xét mạng bao gồm các nút và các liên kết có hướng. Ký hiệu LEN(I, J) là độ dài liên kết (I, J), MAXLEN là cận trên của các LEN(., .). Chỉ mình nút I có thể biết thay đổi của
LEN(I, J). Chúng ta có nhận xét như sau:
Giả sử biết K là nút liền trước nút đích J trên đường đi ngắn nhất từ nút I đến nút J, ta có các kết quả sau với giả thiết 0 LEN(., .) MAXLEN và các đường đi từ I đến J, I đến K đã được tính đúng:
- Khoảng cách từ I đến J lớn hơn khoảng cách từ I đến K.
- Khoảng cách từ I đến J nhỏ hơn tổng khoảng cách từ I đến K với MAXLEN. - Nút láng giềng của I trên đường đi ngắn nhất từ I đến K nằm trên đường đi
nhất xuất phát từ nút I tương đương biết toàn bộ cây định tuyến gốc I.
Giải thuật của Humblet được cho trong Hình 3.6 và một thực hiện của giải thuật được minh họa trong các Hình 3.7.a-3.7.d. Mục đích của giải thuật là xây dựng cây bao các đường đi ngắn nhất cho mỗi nút. Mỗi nút I sử dụng cấu trúc dữ liệu như sau:
- RTd(I, J) – Ước lượng khoảng cách ngắn nhất từ I đến J.
- RTn(I, J) – Lưu nút liền trước J trên đường đi ngắn nhất từ I đến J. - RTa(I, J) – Lưu nút liền kề I trên đường đi ngắn nhất từ I đến J. - NTd(I, J, M) – Lưu giá trị RTd(M, J) cuối cùng I nhận được từ M. - NTn(I, J, M) – Lưu giá trị RTn(M, J) cuối cùng I nhận được từ M. - Các thông báo được gửi bởi I có dạng (J, RTd(I, J), RTn(I, J)).
Giải thuật bao gồm hai phần. Trong phần thứ nhất, các nút quan sát sự thay đổi tôpô mạng hoặc nhận thông báo thay đổi khoảng cách của láng giềng; các thông báo này được lưu giữ trong NT (trong Hình 3.7.c, NT của B là các cây gốc A, C và D của Hình 3.7.b). Trong phần thứ hai (COMPUTE), mỗi nút I xây dựng một cây lớn với cạnh có trọng số từ các NT(I, ., .) (xem Hình 3.7.c với I = B), trong đó một nút có thể xuất hiện nhiều lần trong cây: nút I đặt nó làm gốc và “lớn” lên trên mỗi liên kết liền kề các cây đường đi ngắn nhất được tính bởi các láng giềng. Cây lớn này sau đó được duyệt theo chiều rộng (dựa trên trọng số các cạnh được tích lũy bắt đầu từ gốc) để nhận được một cây con trong đó mỗi nút xuất hiện nhiều nhất một lần. Cây con được sử dụng làm cây RT. Những thay đổi của cây RT so với phiên bản trước được gửi cho các nút láng giềng. Hình 3.7.d minh họa hoạt động của B khi nút liền kề bị hỏng.
Cụ thể hơn, COMPUTE() ở nút I xây dựng RT bắt đầu từ I, xét các phần tử NT(I, J, P) theo thứ tự không giảm khoảng cách đến I, và bao hàm nút J vào RT chỉ nếu J chưa được bao hàm (UNSEEN(J) = TRUE) và nếu nó là nút liền kề I trên cây lớn (NTn(I,J,P) = NIL) hoặc một nút láng giềng của nó đã nằm trong RT (K = NTn(I, J, P) và RTa(I, K)=P). Như vậy cấu trúc RT tạo nên một cây có hướng (điều này đúng ngay cả khi các NT không tạo cây). Chúng ta gọi cây này là cây định tuyến.
Khởi tạo:
RTd(I,I) = 0;
RTn(I,I) = RTa(I,I) = NIL;
Phát hiện liên kết (I,M) Up:
Với mỗi nút J, NTd(I,J,M) = ;
Gửi M một thông báo chứa các bộ (J, RTd(I,J), RTn(I,J)) với mọi nút J;
Phát hiện LEN(I,M) thay đổi (LEN(I,M) = nếu (I,M) Down):
COMPUTE();
Nhận được thông báo cập nhật từ láng giềng M:
Thông báo bao gồm các bộ (J,D,K), trong đó J, K là các đỉnh, D là khoảng cách. Với mỗi bộ (J,D,K) chứa trong thông báo
NTd(I,J,M) = D; NTn(I,J,M) = K; COMPUTE();
COMPUTE()
Với mỗi nút J, UNSEEN(J) = TRUE; UNSEEN(I) = FALSE;
MESSAGE = NIL; Với mỗi nút liền kề P
Sắp xếp các nút J theo thứ tự không giảm NTd(I,J,P).
Ký hiệu TOP(P) là phần tử hiện tại nằm trên cùng của danh sách ứng với nút P. Forever do:
Với mỗi nút láng giềng P, xóa nút trên đầu danh sách ứng với P cho đến khi
(UNSEEN(TOP(P)) = TRUE) và ((NTn(I,TOP(P),P) = NIL ) hoặc (RTa(I,NTn(I,TOP(P),P)) = P));
kề có trạng thái Up; Thoát vòng lặp;
P* =argmin (NTd(I,TOP(P),P) + LEN(I,P)); P
J = TOP(P*);
UNSEEN(J) = FALSE;
Nếu ((RTd(I,J) NTd(I,J,P*) + LEN(I,P*)) hoặc (RTn(I,J) NTn(I,J,P*))) RTd(I,J) = NTd(I,J,P*) + LEN(I,P*);
RTn(I,J) = NTn(I,J,P*);
Nếu (RTn(I,J) = NIL) thì RTn(I,J) = I;
MESSAGE = MESSAGE U {(J, RTd(I,J), RTn(I,J));} RTa(I,J) = P*;
Hình 3.6. Giải thuật của Humblet, mã cho nút I.
A B C D 5 1 2 4 Hình 3.7.a. Tôpô mạng.
A B
C
B B
Hình 3.7.c. Xây dựng cây định tuyến ở nút B. A C D 5 1 2 D C D B A 2 1 5 5 1 2 1 5 4 A B C D B
Hình 3.7.b. Các cây định tuyến cho từng nút. A C D 5 1 2 B C D A C D B A 2 1 5 5 1 2 2 5 1
Để giải thuật hoạt động, chúng ta phải giả thiết một số tính chất sau của các nút và các liên kết trong mạng:
1. Có một giao thức liên kết duy trì hai trạng thái Up và Down của liên kết, và chịu trách nhiệm chuyển các thông báo. Giao thức này thỏa mãn các tính chất sau:
a) Khoảng thời gian liên tục tại đó liên kết ở trạng thái Up ở một nút được gọi là LUP (Link Up Period). Một LUP ở một đầu liên kết tương ứng với nhiều nhất một LUP ở đầu kia của liên kết. Cả hai đầu của liên kết chỉ nằm ở các LUP không tương ứng trong thời gian hữu hạn.
b) Thông báo chỉ được gửi tại LUP của nút gửi và được nhận tại LUP của nút nhận. c) Nếu chuỗi thông báo nhận được trong một LUP không phải là tiền tố của chuỗi thông báo được gửi trong LUP tương ứng, LUP phải được kết thúc.
2. Các nút cũng có thể Up hoặc Down. Các LUP chỉ tồn tại ở một nút khi nút này Up. A
B
C
B
Hình 3.7.d. Tạo lại cây định tuyến sau tôpô thay đổi.
D C D B A 2 1 5 5 1 2 1 4 D 2 B C D 2 1
3. Ban đầu, tất cả các nút đều Down.
4. Tất cả các thông báo cập nhật và thông báo thay đổi trạng thái liên kết được xử lý ngay theo thứ tự chúng nhận được.
5. Độ dài các liên kết đều dương. Liên kết có trạng thái Down được gán độ dài +. 6. Với mục đích chứng minh tính hội tụ của giải thuật, chúng ta giả thiết thời gian từ 0 đến T, tôpô mạng có thể thay đổi, nhưng sau thời gian T, tôpô mạng không thay đổi. Dưới đây ta sẽ dùng từ cuối cùng để nói đến độ dài liên kết, đường đi ngắn nhất sau thời điểm T. D(I, J) được sử dụng để chỉ khoảng cách từ I đến J trong tôpô mạng sau T.
Dễ dàng thấy rằng các giả thiết 1-4 cùng với phần thứ nhất của giải thuật đảm bảo các giá trị RTd(M, .) và RTn(M, .) ở và sau thời điểm T sẽ được chuyển sang NTd(I, ., M) và
NTn(I, ., M) nếu liên kết (I, M) cuối cùng Up. Chúng ta sẽ chứng minh tính đúng của giải thuật theo nghĩa rằng trong khoảng thời gian hữu hạn sau thời điểm T, các RT ở tất cả các nút tạo các cây định tuyến cuối cùng.
Đặt T(0) = T và T(k+1) là thời điểm tại đó tất cả các thông báo đang được gửi ở thời điểm T(k) (k 0) được nhận tại đích và đã được xử lý (thực hiện COMPUTE() và chuyển các thông báo sinh ra từ COMPUTE()).
Định lý 3.3.Đến thời điểm T(K), tại mỗi cây định tuyến, tất cả các đường đi có ít hơn hoặc bằng K liên kết đạt được độ dài cuối cùng.
Chứng minh. Chúng ta chứng minh định lý này bằng phương pháp quy nạp theo K. Định lý dĩ nhiên đúng tại thời điểm T(0) với K = 0. Giả sử định lý đúng đối với tất cả các M, 0 ≤ M < K. Tại thời điểm T(K), các cây định tuyến tại thời điểm T(K-1) của tất cả các nút đã được gửi đến các láng giềng. Một đường đi có ít hơn hoặc bằng K liên kết là sự nối tiếp của một cạnh liền kề (có độ dài cuối cùng tại thời điểm T(1)) và một đường đi có ít hơn K liên kết trong cây định tuyến của nút láng giềng, và do vậy đạt độ dài cuối cùng từ thời điểm T(K) trở đi.□
Định lý 3.3 cho chúng ta thấy tính hội tụ của giải thuật vì kích thước mạng là hữu hạn.
Nhận xét:
- Khác với giải thuật Netchange và giải thuật Bellman-Ford, trong giải thuật Humblet có sự cộng tác giữa các điểm đích.
“bánh xe”, tức có một nút trung tâm liên kết với N nút khác trên một vòng lưỡng hướng. Tất cả các liên kết theo chiều kim đồng hồ và các liên kết hướng vào nút trung tâm có độ dài bằng 1, các liên kết khác có độ dài N. Khi các cây định tuyến đã được tạo, nếu tất cả các liên kết hướng vào nút trung tâm bị hỏng, tất cả các nút sẽ tính lại định tuyến, trong đó mỗi nút trên vòng nhận nút láng giềng theo chiều kim đồng hồ làm nút cha trên đường định tuyến từ nó đến nút trung tâm. Khi thông báo định tuyến đi hết một vòng thì vòng lặp định tuyến mới được phá bỏ.
- Có thể thực hiện COMPUTE() theo sự kiện: khi tôpô thay đổi hoặc nhận được thông báo cập nhật như trong giải thuật. Cũng có thể thực hiện COMPUTE() theo chu kỳ: mỗi nút thực hiện COMPUTE() theo chu kỳ riêng. Cách thực hiện COMPUTE() theo chu kỳ làm giảm lan truyền cập nhật, tuy nhiên làm giảm tải và số thông báo được truyền. Cũng có thể kết hợp hai khả năng thực hiện COMPUTE() kể trên: thực hiện COMPUTE()
theo sự kiện nhưng kết hợp tất cả các thông báo trong hàng đợi thành một thông báo. Thông báo cho biết tất cả những thay đổi phải thực hiện trên NT của nút nhận.
- Nếu không cần tìm đường đi ngắn nhất mà chỉ cần tìm đường đi ngắn, chúng ta có thể dễ dàng sửa đổi giải thuật Humblet để đạt được mục đích. Ví dụ, có thể sửa đổi giải thuật để cho mỗi nút chỉ gửi cho láng giềng thông báo cập nhật nếu trị tuyệt đối độ chênh lệch giữa độ dài cũ và độ dài mới vượt quá ngưỡng nào đó.
CHƯƠNG 4. ĐỊNH TUYẾN PHÂN TÁN TỰ ỔN ĐỊNH CỦA SHLOMI DOLEV
Như đã trình bày trong Chương 2, tự ổn định là tính chất cần thiết của các giải thuật phân tán trong đó có giải thuật định tuyến. Đã có nhiều bài báo đề xuất nhiều giải thuật định tuyến tự ổn định khác nhau. Trong chương này, tôi xin trình bày một giải thuật định tuyến phân tán tự ổn định, độc lập điểm đích của Shlomi Dolev và trong chương tiếp theo, tôi xin đưa ra một giải thuật định tuyến phân tán tự ổn định khác có sự cộng tác giữa các điểm đích.