Xây dựng một thuật toán dựa trên ý tưởng về cây lan tỏa tăng trưởng từng phần mà sử dụng thuật toán Prim và Dijkstra. Mô hình mạng vẫn được coi là một đồ thị vô hướng G(V, E) với V là các đỉnh và E là các cạnh. Mỗi cặp cạnh {i, j} có một trọng số là wij. Ban đầu cây lan tỏa từng phần chỉ chứa nút nguồn (sink). Trong suốt thời gian thực hiện giải thuật, các liên kết mới được thêm vào cây lan tỏa từng phần và cuối cùng một cây lan tỏa được hoàn tất. Tại mỗi vòng lặp, các thao tác cơ bản được thực hiện như sau:
- Mỗi nút trong cây lan tỏa từng phần hiện thời sẽ chọn ra một nút con ưa thích
(nếu có) từ các nút mà vẫn chưa được thêm vào cây hiện tại.
- Mỗi nút của đồ thị mà không phải là thành viên của cây hiện tại sẽ chọn ra một
nút cha ưa thích (nếu có) giữa các nút trong cây hiện tại.
- Các nút trong cây hiện tại mà là cha ưa thích của các con ưa thích của chúng sẽ thiết lập một liên kết giữa các nút đó.
Hình 13: Minh họa việc thiết lập liên kết
Nút nguồn là nút 1 và các nút từ 2 đến 5 là các nút đang ở trọng cây. Các đường nét liền là các liên kết trong cây và các đường nét chấm là các liên kết có thể. Nút 7, 8, 9 là các nút con có khả năng được chọn mà vẫn chưa được thêm vào cây.
Sau đây là giải thuật cặp:
Đầu vào:
E: Tập cạnh của đồ thị
W: Tập các trọng số của cạnh V: Tập các đỉnh
Cost(i,j) : Hàm chi phí tính theo một số metric (Prim, Dijkstra, vv…) mà đầu ra là chi phí của kết nối giữa nút cha i và nút con j.
Đầu ra:
ET : Các cạnh của cây hiện tại
Các biến tạm thời:
T : Tập các đỉnh đã được thêm vào cây định tuyến
FPj : Cha ưa thích của nút j. Gồm có 2 mục, ID của cha ưa thích i và chi phí của liên kết giữa nút j và i, VD: FPj(1)=i, FPj(2)=Cost(i,j).
FCi : Con ưa thích của nút i. Gồm có 2 mục, ID của nút j và chi phí giữa nút i và j, VD: FCi(1) =j, FCi(2) = Cost(i,j). Khởi tạo T := {Sink} T’:= V / {Sink} ET:= {} FPj := {Null, INF} j V FCi := {Null, INF} i V Phần chính While T != V For i T For j T’ If (Cost(i,j) < FCj(2)) FCi(2) := Cost(i,j) FCi(1) := j End If (Cost(i,j) < FPj(2)) FPj(2) := Cost(i,j) FPj(1) := i End End End For i T j := FCi(1) If (i=FPj(1)) T := T {i} T’ := T’ {i} ET := ET {{i,j}} End End
FPj := {Null, INF} j V FCi := {Null, INF} i V
End
Độ phức tạp
Thuật toán cặp có O(n) vòng lặp, với n là số nút trong mạng. Tại mỗi vòng lặp, mọi nút xem xét chỉ hàng xóm của nó. Do vậy, mỗi vòng lặp cần O(d) thời gian, với d là bậc của nút. Do đó độ phức tạp thời gian của thuật toán cỡ O(nd).
2.3. Tóm tắt chƣơng
Chương 2 đã trình bày về các giao thức định tuyến cũng như các thuật toán định tuyến được sử dụng trong mạng cảm biến vô tuyến.
Rỗi Định tuyến lỗi Định tuyến kết thúc So sánh các danh sách và thêm các nút Tạo ra các danh sách cha và con Định tuyến
Nếu không có sự thay đổi nào trong danh sách cha và
con Nếu cây đã
chứa tất cả các nút
Nếu cây vẫn chưa chứa đủ tất cả các
nút
CHƢƠNG 3: ĐỊNH TUYẾN ĐỊA HÌNH XẤU – MÔ PHỎNG VÀ ĐÁNH GIÁ
Nội dung chương bao gồm những phần chính sau:
- Giới thiệu về bộ mô phỏng mạng NS-2 và các công cụ để phân tích, đánh giá
- Xây dựng chương trình mô phỏng sử dụng kịch bản C/C++ và Otcl
- Xây dựng kịch bản dựa trên ngôn ngữ Perl để phân tích đánh giá
- Đánh giá và nhận xét
3.1. Sơ lƣợc về bộ mô phỏng mạng NS-2 [4]
NS là bộ mô phỏng mạng theo sự kiện rời rạc được phát triển ở trường đại học Berkely bang California đầu tiên bắt nguồn từ dự án VINT được bộ quốc phòng Mỹ cấp kinh phí phát riển. NS được phát triển từ bộ mô phỏng REAL của S. Keshav từ năm 1989, còn REAL thì bắt nguồn từ bộ mô phỏng NEST. Các phiên bản NS version 2 ra đời sau năm 1997 và từ đó người ta thường gọi bộ mô phỏng là NS-2. NS-2 được viết trên hai ngôn ngữ hướng đối tượng là C++ và OTcl. C++ được sử dụng để xây dựng phần nhân của bộ mô phỏng để đảm bảo tốc độ thực hiện cao và thay đổi. OTcl được sử dụng để xây dựng phần giao tiếp với người sử dụng (shell), giúp người sử dụng dễ dàng thiết lập cấu hình mạng, lựa chọn giao thức truyền thông, thiết lập các nguồn sinh lưu lượng, các mô hình sinh lỗi v.v.
Hình 15: Mô hình tổng quan bộ mô phỏng NS-2
NS-2 là kịch bản hướng đối tượng, bộ thông dịch nó chứa bộ lập lịch các sự kiện(Event Scheduler) và thư viện đối tượng các thành phần mô phỏng mạng (Network Component Object), thư viện module thiết lập mạng. Nói cách khác, người dùng NS lập trình bằng ngôn ngữ kịch bản OTcl lập lịch các sự kiện trên một đồ hình mạng cụ thể sau đó chạy mô phỏng mạng, thông qua trình thông dịch trong NS-2 để đưa kết quả ra 2 loại tệp chính: đó là tệp vết (trace file), có tên mở rộng là *.tr, ghi lại tất cả các sự kiện mạng (người sử dụng có thể lọc bớt các sự kiện bằng OTcl). Loại tệp thứ hai có tên mở rộng là *.nam, có khuôn dạng tương tự tệp vết, được sử dụng làm đầu vào cho chương trình hiển thị kết quả mô phỏng dưới dạng đồ họa, chương trình NAM.
NS được cải tiến và mở rộng không ngừng, trung bình cứ 6 tháng người ta lại đưa ra một phiên bản mới, trong đó đã sửa chữa các khiếm khuyết được cộng đồng sử dụng phát hiện và bổ sung thêm một số khả năng mô phỏng mới. Phiên bản đầu tiên được giới thiệu và sử dụng rộng rãi là NS-2.1b2, phiên bản mới nhất, tính đến giữa năm 2008 là NS-2.34.
Ngày nay, cộng đồng sử dụng NS-2 gồm hàng nghìn trường đại học, viện nghiên cứu, công ty… và hàng vạn người trên thế giới. Các kết quả nghiên cứu bằng NS-2 là đáng tin cậy và được cộng đồng nghiên cứu về mạng thừa nhận.
Sự liên kết giữa C++ và OTCL
NS được xây dựng trên hai ngôn ngữ C++ và kịch bản OTcl. Để có được hiệu suất cao, NS tách biệt việc xử lý và điều khiển dữ liệu. Để giảm thời gian xử lý gói và các sự kiện (không phải thời gian mô phỏng), bộ lập lịch các sự kiện và các thành phần đối tượng mạng cơ bản trong phần dữ liệu được viết và biên dịch sử dụng trình biên dịch C++. Các đối tượng được biên dịch này có thể được sử dụng bằng trình thông dịch OTcl qua một mối liên kết OTCL, mối liên kết tạo lên sự phù hợp giữa đối tượng OTcl cho mỗi đối tượng C++ và tạo nên các chức năng, các tham số cấu hình bởi đối tượng C++ tương ứng với các hàm thành phần và các biến thành phần của đối tượng OTclL. Theo cách đó, các đối tượng điều khiển của C++ được trao cho OTcl. Nó cũng có thể thêm các hàm thành phần và các biến vào C++ đã được liên kết với đối tượng OTcl. Các đối tượng trong C++ không cần được điều khiển trong mô phỏng hoặc được sử dụng bên trong bởi đối tượng khác không được liên kết tới OTcl. Cũng như vậy, một đối tượng (không phải phần dữ liệu) có thể được triển khai hoàn toàn bằng OTcl.
Hình 16: C++ và OTcl, hai thành phần đối ngẫu
Hình trên mô tả một một ví dụ về phân cấp đối tượng trong C++ và OTcl. Một điều chú ý trong hình đó là các đối tượng trong C++ có sự liên kết với OTcl dựng lên một phân cấp, đó là một phân cấp đối tượng OTcl giống như của C++.
Hình 17: Kiến trúc của NS-2
Hình trên cho thấy kiến trúc tổng quát của NS. Trong hình này, một người dùng thông thường (không phải người phát triển) đứng ở vị trí góc dưới bên trái, thiết kế và chạy các mô phỏng trong Tcl sử dụng các đối tượng mô phỏng trong thư viện OTcl. Bộ lập lịch các sự kiện và hầu hết các thành phần mạng được triển khai trong C++ và có thể sử dụng qua OTcl, một sự liên kết OTcl được triển khai sử dụng tclcl. Toàn bộ các vần đề cùng NS chúng là một mở rộng thông dịch Tcl với các thư viện mô phỏng.
Các đặc điểm chính của NS2
Bộ mô phỏng NS2 có thể hỗ trợ người nghiên cứu mạng các đặc điểm nổi bật sau:
- Khả năng trừu tƣợng hóa: giúp nghiên cứu các giao thức mạng ở nhiều mức
khác nhau, từ hành vi đơn lẻ của một giao thức đến kết hợp của nhiều luồng dữ liệu và tương tác của nhiều giao thức. Điều này giúp người nghiên cứu có thể dễ dàng so sánh và phân tích các kết quả chi tiết với trừu tượng.
- Khả năng tƣơng tác với mạng thực: Cho phép chương trình mô phỏng đang
chạy tương tác với các nút mạng thực đang hoạt đông thông qua việc thiết lập lưu lượng cho các liên kết mạng.
- Khả năng tạo ngữ cảnh: Người nghiên cứu có thể tạo các hiện trạng mạng
phức tạp và các sự kiện động như lỗi liên kết một cách dễ dàng. Điều này giúp cho việc nghiên cứu, kiểm chứng các giao thức mạng trong các mô hình mạng khác nhau được đúng đắn hơn.
- Khả năng hiển thị hóa: Thông qua công cụ hiển thị NAM, người nghiên cứu
có thể quan sát trực quan hoạt động của các nút mạng, lưu lượng, tỷ lệ lỗi để từ đó dễ dàng hiểu được các hành vi phức tạp của đồ hình mạng mô phỏng.
- Khả năng mở rộng đƣợc: NS2 cho phép mở rộng các chức năng mới một cách dễ dàng như thay đổi các tham số, xây dựng lên một giao thức mới, thử nghiệm các kịch bản khác nhau...
Khả năng mô phỏng của NS
Với bộ mô phỏng NS2, người dùng có thể mô phỏng nhiều giao thức khác nhau tại nhiều tầng khác nhau như: tại tầng ứng dụng, FTP, HTTP; tại tầng giao vận như: UDP, TCP (reno, tahoe, vegas, sack…), tại tầng MAC như: MAC 802.3, MAC 802.11, MAC 802.15, ...trong các mô hình mạng có dây, mô hình mạng không dây và mô hình mạng hỗn hợp. Ngoài ra NS-2 còn có thể mô phỏng các thuật toán định tuyến trong mạng không dây, đặc biệt là mạng Ad-hoc: DSDV, DSR, AODV, TORA,… các vấn đề về định tuyến Unicast/Multicast, liên mạng sử dụng vệ tinh (Satellite network) và nhiều các vấn đề khác cụ thể như:
Đối với mạng có dây:
- Các đường truyền điểm - điểm đơn công, song công, mạng cục bộ LAN. - Các chính sách phục vụ hàng đợi.
- Các mô hình sinh lỗi.
- Vấn đề định tuyến Unicast/Multicast (Unicast/Multicast routing).
- Các giao thức tầng Giao vận: TCP/Tahoe/Reno/New-Reno/Sack/Vegas, UDP, điều khiển lưu lượng và điều khiển tắc nghẽn.
- Các giao thức tầng Ứng dụng, Web caching, truyền luồng dữ liệu đa phương tiện.
Đối với mạng không dây:
- Kênh truyền.
- Sự di chuyển của các nút mạng trong không gian hai chiều. - Mạng LAN không dây (WLAN) 802.11.
- Mobile IP.
- Các thuật toán định tuyến trong mạng không dây đặc biệt (Ad Hoc networks): DSDV, DSR, AODV, TORA...
- Liên mạng sử dụng vệ tinh (Satellite Networking).
Trong lĩnh vực mạng hỗn hợp có dây và không dây:
- Trạm cơ sở (Base station) đóng vai trò gateway giữa mạng có dây và mạng không dây.
- Snoop TCP.