Thuật toán Dijkstra

Một phần của tài liệu ĐÒ ÁN TỐT NGHIỆP ĐH-BỘ GIAO THỨC TCP-IP (Trang 100)

Thuật toán này do Dijkstra đưa ra. Nó thích hợp cho việc tìm đường đi tối un tù‟ một đỉnh tới tất cả các đỉnh còn lại trong đồ thị. Hoạt động của thuật toán này như sau: Giả sử ta cần tìm đường đi ngắn nhất từ đỉnh s đến tất cả các đỉnh còn lại trong đồ thị. Thuật toán được xây dựng dựa trên cơ sở gán cho các đỉnh các nhãn tạm thời. Các nhãn này được biến đôi theo một thủ tục lặp. Sau mỗi vòng lặp, sẽ có một nhãn tạm thời trở thành nhãn cố định, đó chính là nhãn tạm thời có giá trị nhỏ nhất. Nhãn cố định, tất nhiên, không bị biến đồi trong các vòng lặp, và chính là độ dài của con đường ngắn nhất tù‟ đỉnh nguồn tới đỉnh tương ứng với nhãn đó. Đỉnh mới được gán nhãn cố định này sẽ được quét đê gán lại nhãn tạm thời cho các đỉnh khác.

Ta thấy rằng, việc gán nhãn lại cho các đỉnh chỉ được thực hiện mỗi khi có thêm một đỉnh được gán nhãn cố định. Đỉnh được gán nhãn cố định trước phải có giá trị của nhãn cố định nhỏ hơn nhãn cố định của đỉnh được gán sau. Nên, đế đảm bảo một đỉnh đã có nhãn cố định không được gán nhãn lại, phải có yêu cầu ràng không có cung nào trong mạng có chiều dài âm.

Thuật toán Dijkstra được cài đặt như sau: array[n] Dijkstra(n , root, dist [n,n])// đist[i,j] = ljj // root: node nguồn // n: so node var pre_node[n]// Node liền

Phạm Văn Hiến - ĐOI VT 29

trước

cur_dist[n] // Khoảng cách hiện tại

scanned[n] // nếu bang TRUE, là đã được gán nhãn cố định index 4r Findmin() drnin = INFINITY for each (i, n )

if( !scanneđ[i] && (cur_dist[i] < d rnin)) irnin = i

d min = cur dist[i] return i_min void 4r Scan( i ) for each (j, n)

if (cur_dist [j] > cur_dist [i] + dist [i,j]) cur_dist [ị] = cur_dist [i] + dist [i,j] pre_nođe[j] = i

cur dist <7

INFINITY pre node <- -1

Phạm Văn Hiến - Đ01VT 18

Đô án tôt nghiệp Đai hoc

Chương 2thuật định tuyến trong mang IP

scanned FALSE cur_đist [root] = 0 #_scanned = 0 while ( #_scanned < n) i (Finđmin()

Scan(i) return (pre_node)

Với mảng pre node, ta sẽ thu được tất cả các con đường tối ưu từ các đỉnh trong mạng tới đỉnh nguồn.

1.1.332.3.4 Thuât toán Bellman-Ford

Khác với thuật toán Dijkstra, tìm và quét đỉnh có nhãn nhỏ nhất, và mỗi đỉnh chỉ phải quét một lần, thuật toán Bellman quét các đỉnh theo thứ tự gán nhãn của đỉnh, vì vậy sẽ không phải tìm đỉnh nhỏ nhất, tuy nhiên lại dẫn tới việc một đỉnh có thể phải quét nhiều lần.

Thuật toán Bellman cơ bản hoạt động bằng cách quét lần lượt tất cả các đỉnh, nhằm gán lại nhãn cho các đỉnh khác. Và cứ thực hiện lặp lại như vậy cho đến khi sau một vòng lặp mà không có đỉnh nào được gán nhãn lại nừa. Tuy nhiên, làm như vậy phải thực hiện một lượng tính toán rất lớn. Thông thường, khi quét một đỉnh, chỉ cần kiểm tra xem có phải gán lại nhãn cho các đỉnh lân cận hay không. Và chỉ cần quét những đỉnh được gán nhãn lại trong vòng lặp trước.

Để thực hiện theo cách vừa nói, có thể sử dụng một hàng đợi để lưu giừ thứ tự quét các đỉnh cần quétề Mồi khi một đỉnh được gán nhãn, nó lại được đưa vào hàng đợi. Vì hàng đợi là kho dữ liệu quản lý theo kiểu vào trước - ra trước (FIFO) nên các đỉnh sẽ được quét theo thứ tự gán nhãn. Neu một đỉnh được gán nhãn lại sau khi đã quét, nó lại được đưa vào trong hàng đợi.

Để hiểu thuật toán Bellman-Ford, ta xem ví dụ sau: Xét mạng như trong Hình 2.10, giả sử A là đỉnh nguồn. A được gán nhãn 0 và được đưa vào hàng đợi. Quét A, đỉnh B và c được gán nhãn tương ứng là 5 và 1, và cùng được đưa vào hàng đợi. Tiếp theo, ta quét đỉnh B, gán nhãn cho D và E các giá trị 6 và 11. D và E cũng được đặt vào hàng đợi. Tiếp theo ta quét đỉnh c, B được gán nhãn mới là 4 và được đưa trở lại hàng đợi. Quét D, gán nhãn 10 cho F và đưa F vào hàng đợi. Quét E. B được quét lần thứ 2, nó gán cho D và E các nhãn tương ứng là 5 và 10, và cả hai tiếp tục lại quay trở lại hàng đợi. Quét F, không gán nhãn mới cho đỉnh nào. Quét D,

Đô án tôt nghiệp Đai hoc

Chương 2thuật định tuyến trong ma nợ IP

Phạm Văn Hiến - ĐOI VT 82

gán nhãn 9 cho F và đưa F trở lại hàng đợi. Quét E, quét F.

Thuật toán Bellman được cài đặt như sau: array[n] 4r Bellman (n , root, dist [n,n])

var pre_node[n] , cur_dist[n] ,

in_queue[n], scan_queue[n] void <- Scan( i)

in_queue[ i ] = FALSE for j = 1 to n

if (cur dist [j] > cur dist [i] + dist [ij]) cur_dist [j] = cur_dist [i] + dist [i,j] pre node [j] = i if ( !

in_queue [j]) push

(scan_queue, j) in queue [j] = FALSE cur dist <7

INFINITY pre node <- -1 in queue f- FALSE

initializequeue (scanqueue) curdist [root] = 0 push (scan queue, root) in_queue[root] = TRUE while ( ! empty (scan queue)) i <- pop(scan queue) scan (i) return (pre_node).

Ta thay rang, các đỉnh được quét theo thứ tự gán nhãn, dẫn đến là các đỉnh được quét theo khoảng cách bước (hop) tới đỉnh nguồn. Đầu tiên, đỉnh nguồn được quét (hop = 0), tiếp theo là các đỉnh lân cận đỉnh nguồn

(hop = 1). Và cứ thế tiếp tục. Do đó, ta thấy, một đỉnh có thể cần phải quét tối đa n-ỉ lần.

Trong hầu hết các trường họp thực tế, số lần quét trung bình của các đỉnh không lớn, thường chỉ là 3 đến 4 lần, dù là mạng có tới hàng ngàn đỉnh. Trong khi đó, với những mạng có số lượng đỉnh lớn, chương trình sử

Đô án tôt nghiệp Đai hoc

Chương 2thuật định tuyến trong ma nợ IP

Phạm Văn Hiến - ĐOI VT 82

Đô án tôt nghiệp Đai hoc

Chương 2thuật định tuyến trong ma nợ IP

Phạm Văn Hiến - ĐOI VT 82

khá nhiều thời gian vào việc tìm đỉnh có giá trị nhãn nhỏ nhất. Do đó, thuật toán Bellman nói chung thực hiện nhanh hơn so với thuật toán Dijkstra.

Như trong ví dụ trước, khi quét đỉnh c, ta đã gán nhãn lại cho đỉnh B, mà trước đó, đỉnh B đã gán nhãn cho hai đỉnh D, E. Sau khi quét c xong, ta quét D và E rồi mới đến đỉnh B lần thứ hai. Khi quét B lần thứ hai, ta gán nhãn lại cho D và E, dẫn tới là lại phải quét lại hai đỉnh này. Dường như, khi ta quét lại B thì cũng phải quét lại D và E. Từ vấn đề đó, ta thấy ràng có thể giảm được số lần quét D và E bằng cách đặt B vào đầu hàng đợi ngay sau khi nó được gán nhãn lại. Công việc này thực tế làm tăng đáng kể hiệu quả của chương trình, mà ta chỉ phải sửa đổi thuật toán một chút, đó là sử dụng một hàng đợi có hai đầu vào, và ngoài việc lưu thông tin về việc có mặt của một đỉnh trong hàng đợi hay chưa, ta còn cần thông tin về việc đỉnh đó đã từng ở trong hàng đợi hay chưa.

Tuy nhiên, với thuật toán Bellman-Ford sửa đôi này, ta có thê gặp phải trường họp vô cùng xấu, như trong ví dụ sau (Hình 2.1 l).ẳ

Hình 2.11 Mạng ví dụ

Neu khi gán nhãn các đỉnh lân cận theo thứ tự ABC, quá trình quét các đỉnh sẽ xảy ra như sau: đầu tiên, R gán cho A nhãn 11, B nhãn 9 v.v... Sau đó quét A không gán nhãn cho đỉnh nào cả. Tiếp theo, quét B, gán nhãn cho A, đặt A vào đầu hàng đợi, rồi sau đó lại quét A. Quét c, gán nhãn lại cho A và B... Cứ tiếp tục như thế, cuối cùng, đỉnh A được gán nhãn và quét 2N"' lần.

Trường họp trên xảy ra là các giá trị không tụ- nhiên của trọng số các đoạn đường và cách ta gán nhãn các đỉnh lân cận của các đỉnh đang quét. Tuy nhiên, trường họp tương tụ' rất hiếm khi xảy ra trong thực tế. Và nếu ta thấy nó xảy ra thường xuyên, thì tốt nhất nên sử dụng thuật toán Dijkstra.

Phạm Văn Hiến - ĐOI VT

So sánh vói thuật toán Dijặkstra:

Cả hai thuật toán này đều là những thuật toán đon giản, hiệu quả, dễ cài đặt, tuy nhiên có khác nhau ớ một số điêm sau:

Đô án tôt nghiệp Đai hoc

Chương 2thuật định tuyến trong mang IP

♦ Thuật toán Dijkstra chỉ có thể hoạt động được ở những mạng có độ

dài các kênh đều dương. Trong khi đó, thuật toán Bellman có thể sử dụng được ở trong những mạng có kênh có độ dài âm, miễn là không tồn tại các vòng có tổng độ dài các cung trong vòng âm.

♦ Thuật toán Dijkstra cần thông tin về tất cả các đỉnh, tất cả các cung. Trong khi đó, thuật toán Bellman, có thể tìm đường ngắn nhất cho một đỉnh dựa vào thông tin tìm đường ngắn nhất của các đỉnh lân cận, và độ dài các cung nổi với các đỉnh lân cận đó.

1.142.4 Các loại giao thửc định tuyến

Hầu hết các giải thuật định tuyến có thê được chia thành một trong hai giải thuật cơ bản:

♦ Distance - vector ♦ Link - State

Định tuyến distance-vector xác định hướng và khoảng cách đối với bất kì liên kết nào trong liên mạng

Định tuyến Link - State (còn được gọi là shortest path fist) kiến tạo lại chính xác kiến trúc của toàn liên mạng( hay chí ít là một phần trong đó router thuộc vào).

Định tuyến Blanced-hybrid phối hợp các khía cạnh của hai loại trên

1.1.342.4.1 Định tuyến theo vec-to' khoảng cách

1.5.4.1 92.4. 1.1 Giói thiệu

Định tuyến theo vectơ khoảng cách ( Distance - vector ) dựa trên nguyên tắc trao đổi phiên bản copy trong các bảng định tuyến giữa các router một cách định kỳ.Việc trao đôi thông tin định tuyến chỉ diễn ra giữa 2 router kế cận .Các router tiếp nhận các bảng định tuyến đó cộng thêm “khoảng cách” và xây dựng nên thực thê định tuyến của nó.Khoảng cách đến đích sẽ là tổng khoảng cách thành phần

Các thuật toán chọn đường theo vec-tơ khoảng cách đã được sử dụng phổ biến trong các mạng chuyển mạch gói từ cách đây vài thập kỷ, bắt đầu từ mạng ARPANET. Nó được sử dụng phổ biến có thể là do đơn giản, tính toán phân tán, chỉ sử dụng những thông tin cục bộ để định ra con đường tới đích.

Phạm Văn Hiến - Đ01VT 18

đường tối un theo một tiêu chuẩn tối ưu định trước. Thước đo để đánh giá có the là các tham số về trễ, tỉ lệ lỗi, cước phí truyền dẫn... Khi đánh giá một đường truyền, ta dựa trên một giá trị gọi là cost của đường truyền đó. Cost có thể là một trong những tham số ở trên, cũng có thể là một hàm phụ thuộc vào nhiều tham số. Đường truyền tối ưu nghĩa là có cost nhỏ nhất, ở đây chúng ta chỉ xét trường hợp: cost của một tuyến đường (route) bàng

Đồ án tốt nghiệp Đai hoc

Chương 2thuật định tuyến trong mạng IP

tổng cost của các link. Bởi vì, có những trường họp, ví dụ, cost của route bàng một hàm tích của cost các link (trong trường họp tỉ lệ lỗi bit).

Cơ sở của các thuật toán chọn đường theo vec-tơ khoảng cách là thuật toán Bellman-Ford đã nói ớ trên.

Hạn chế của thuật toán chọn đường theo khoảng cách là tốc độ hội tụ bị ảnh hưởng rất nhiều khi các link trong mạng thay đối cost liên tục.

1.5.4.202.4.1.2 Tính toán lại cost

Giả sử tại thời điêm trước khi có thay đôi về cost của các link, tuyến đường từ node i đến node j phải đi qua node lân cận với i là k, và cost của toàn tuyến đường đó là d. Neu sau khi thay đổi cost, node i nhận được thông tin từ node lân cận k‟ rằng qua k‟ con đường tới j có tổng cost là d‟ < d, thì thông tin về con đường tới j của i sẽ được cập nhật. Trường hợp khác, nếu node k thông báo với node i ràng con đường tới j qua k tăng cost, khi đó node i sè thực hiện lại việc tính toán chọn đường tới node j.

Trong trường hợp, node k bị hỏng (hoặc link từ i tới k bị hóng), cần phải có biện pháp đế xử lý lỗi này, bởi vì theo như hoạt động thông thường, lồi này không thể được xử lý. Bởi con đường tới j của i chỉ có thể thay đôi khi k gửi thông tin thay đổi cost của con đường tới j cho i. mà việc gửi này không thề thực hiện được. Các giao thức chọn đường theo phương pháp vec-tơ khoảng cách đều cần có một cơ chế xử lý trường hợp này. Ví dụ như đối với RIP, sẽ qui định một chu kỳ cho các node gửi thông tin cập nhật tới các node lân cận. Neu một node, cứ sau một số hữu hạn chu kỳ đó, không nhận được thông tin cập nhật từ một node lân cận thì tất cả các con đường từ node này qua node lân cận đó đều bị huỷ và phải tính toán lại những con đường bị huỷ đó.

1.5.4.212.4.1.3 Đếm đến vô cùng

Thuật toán chọn đường theo vec-tơ khoảng cách có tốc độ hội tụ khác nhau trong các trường hợp thay đổi cost khác nhau. Nó đáp ứng nhanh với tin lành và đáp ứng chậm với tin xấu. Để thấy rõ điều này, chúng ta xem xét ví dụ sau: Một mạng có 5 node như Hình 2.12 trong đó

Phạm Văn Hiến - ĐOI VT

cost là số bước nhảy (hop).

A B c D E • --- • --- • --- • --- •

Hình 2.12 Mạng ví dụ

Con đường tới các đích không thê tới có cost băng „vô cùng‟ (infinite) (Giá trị „vô cùng‟ này lớn hơn bất cứ cost của con đường ngắn nhất nào. Đối với RIP, infinite bàng 16). Giả sử, lúc đầu A bị hỏng và tất cả các node khác đều biết điều này nên có

cost của con đường tới A là „vô cùng‟. Khi A được khôi phục (tin lành), ở lần trao đổi thông tin đầu tiên, B biết được láng giềng bên trái của nó có cost bằng 0 đến A. Theo bảng định tuyến của B, con đường tới A sẽ có cost bằng 1. Tất cả các node còn lại vẫn nghĩ A bị hỏng và có cost của con đường tới A bằng „vô cùng‟ như trong bảng 2.1, dòng thứ hai. Tại lần trao đổi sau, c biết B có cost đến A là 1 vì thế nó cập nhật trong bảng định tuyến của nó cost đến A là 2. Cứ vậy, sau 4 chu kỳ trao đổi thông tin, kết quả đúng đã có ở tất cả các node.

Bảng 2. ỉ Code của các node tại các thời điêm

Xét trường hợp thứ hai, mạng đang hoạt động tốt thì đường link tù‟ node B đến node A bị hỏng (tin xấu). Khi B không nhận được thông tin gì về A từ phía bên trái, nó sẽ coi rang cost của con đường tới A theo hướng bên trái bằng „vô cùng‟. Trong khi đó, con đường tới A theo hướng bên phải sẽ là 2 (qua C) + 1 (từ B đến C) = 3. Con đường này thực ra là không chính xác bới nó phải đi qua B đê tới A. Cost tới A của theo các node C,D,E vẫn không thay đôi (Xem bảng 2.2). Đen lần cập nhật thông tin thứ hai, c nhận được thông tin từ các node lân cận về con đường ngắn nhất đến A là 3, nó sẽ có cost của con đường đến A là 4. Đen lần cập nhật thứ ba, B lại cập nhật lại thông tin của mình theo c... Và thông tin cứ chậm chạp được thay đôi như vậy cho tới khi tất cả các node đều có cost của con đường tới A là „vô cùng‟.

B c 1 D E

Thời điếm ban

đầu 00 00 1 00 00 Sau 1 lần cập nhật 1 00 : 00 00 Sau 2 lần cập nhật 1 2 00 00 Sau 3 lần cập nhật 1 2 3 00 Sau 4 lần cập nhật 1 2 3 4

Phạm Văn Hiến - ĐOI VT 29

Đô án tôt nghiệp Đai hoc

Chương 2thuật định tuyến trong mang IP

1 . 5 . 4 . 222.4.1.4 Chia cắt hai hướng

Trong trường hợp tin xấu ở trên, hai node c và B đã liên tiếp truyền

Một phần của tài liệu ĐÒ ÁN TỐT NGHIỆP ĐH-BỘ GIAO THỨC TCP-IP (Trang 100)

Tải bản đầy đủ (PDF)

(149 trang)