Bài tiểu luận môn học IP ứng dụng và bảo mật giới thiệu công cụ NS
Trang 11.1 Tổng quan 4
1.2 Bộ định trình sự kiện 6
1.3 Các thành phần mạng 8
1.4 Gói dữ liệu 11
2 Giao tiếp với bộ thông dịch: Liên kết OTcl 11
2.1 Các khái niệm 12
2.2 Tổng quan về mã lệnh 13
2.3 Lớp Tcl 13
2.3.1 Lấy tham chiếu tới instance của lớp Tcl 13
2.3.2 Gọi các hàm OTcl 13
2.3.3 Gửi và nhận kết quả từ bộ thông dịch 14
2.3.4 Thông báo lỗi và thoát 14
2.3.5 Các hàm băm trong bộ thông dịch 14
2.4 Lớp TclObject 14
2.4.1 Tạo và hủy đối tượng TclObject 14
2.4.2 Kết hợp biến 15
2.4.3 Theo dõi giá trị biến 15
2.4.4 Hàm command: định nghĩa và cách gọi 16
2.5 Lớp TclClass 16
2.5.1 Kết hợp các biến thành viên tĩnh của lớp C++ 17
2.6 Lớp TclCommand 17
2.7 Lớp EmbeddedTcl 17
2.8 Lớp InstVar 18
3 Lớp Simlator 18
3.1 Khởi tạo bộ mô phỏng 18
3.2 Bộ định trình và sự kiện 19
3.2.1 Bộ định trình danh sách 20
3.2.2 Bộ định trình xếp đống 20
3.2.3 Bộ định trình xếp hàng theo lịch 20
3.2.4 Bộ định trình thời gian thực 20
3.3 Các phương thức khác 20
3.4 Lướt qua về các lệnh 21
4 Các nút và chuyển gói 22
4.1 Các cách thức của bộ mô phỏng: Tạo kiến trúc mạng 22
4.2 Các cách thức của nút: đặt cấu hình nút 24
4.3 Cấu hình nút về mặt chức năng 26
4.3.1 Giao diện cấu hình nút 26
4.4 Bộ phân lớp 27
4.4.1 Bộ phân lớp địa chỉ 30
KHOA QUAN HỆ QUỐC TẾ VÀ ĐÀO TẠO SAU ĐẠI HỌC
TIỂU LUẬN MÔN HỌC
IP – ỨNG DỤNG VÀ BẢO MẬT
Thầy hướng dẫn: Hoàng Đăng Hải
Học Viên: Lê Đăng Phong [1-22]
Vũ Anh Tuấn [23-44]
Nguyễn Việt Thắng [45-66]
Đinh Hải Đăng [67-hết]
HỌC VIỆN CÔNG NGHỆ VIỄN THÔNG
KHOA QUAN HỆ QUỐC TẾ VÀ ĐÀO TẠO SAU ĐẠI HỌC
TIỂU LUẬN MÔN HỌC
IP – ỨNG DỤNG VÀ BẢO MẬT
Hà Nội
Trang 24.4.3 Bộ phân lớp đa đường 31
4.4.4 Bộ phân lớp băm 32
4.4.5 Bộ tạo bản sao 33
4.5 Module định tuyến và sự tổ chức bộ phân lớp 34
4.5.1 Module định tuyến 35
4.5.2 Giao diện nút 37
4.6 Xem qua một vài lệnh 38
5 Các liên kết: Các liên kết đơn 40
5.1 Thủ tục cho Links và SimpleLinks 41
5.2 Các Connector 43
5.3 Phân cấp đối tượng 44
6 Quản lý hàng đợi và định trình gói 45
6.1 Lớp Queue trong C++ 45
6.1.1 Khóa hàng đợi 46
6.1.2 Lớp PacketQueue 48
6.2 Ví dụ: Loại bỏ phần cuối (Drop Tail) 49
6.3 Các kiểu khác nhau của đối tượng Queue 50
7 Trễ và các tuyến liên kết 56
7.1 Lớp LinkDelay 56
8.Các dịch vụ trong ns 58
8.1 Tổng quan 59
8.2 Sự thi hành (Implementation) 59
8.2.1 Hàng đợi RED cho Diffserv 59
8.3 Cấu hình 61
9 Agents 62
9.1 Trạng thái Agent 62
9.2 Các phương thức của Agent 63
9.3 Protocol Agents 63
9.4 Liên kết trong OTcl 64
9.4.1 Tạo và sửa đổi các Agent 65
9.4.2 Các giá trị mặc định 65
9.4.3 Các phương thức trong OTcl 65
9.5 Ví dụ: Các agent Tcp, TCPSink 65
9.5.1 Tạo Agent 66
9.5.2 Khởi động Agent 67
9.5.3 Xử lý đầu vào ở bộ thu 68
9.5.4 Xử lý đáp ứng ở bên gửi 69
9.5.5 Các bộ định thời 70
9.6 Tạo một agent mới 70
Trang 39.6.2 Các phương thức recv() và timeout() 71
9.6.3 Liên kết agent “ping” với OTcl 72
9.6.4 Sử dụng agent nhờ OTcl 73
9.7 Agent API 74
9.8 Các đối tượng agent khác 74
9.9 Các lệnh cơ bản 74
10 Các bộ định thời 75
10.1 Lớp cơ sở trong C++ TimerHandler 75
10.1.1 Định nghĩa một bộ định thời mới 76
10.1.2 Ví dụ: Bộ định thời truyền lại TCP 77
10.2 Lớp định thời trong OTcl 80
10.3 Một số lệnh cơ bản 80
11 Header gói và các định dạng 81
11.1 Header gói cho một giao thức cụ thể 81
11.1.1 Thêm một kiểu header gói mới 83
11.1.2 Lựa chọn các header gói trong bộ mô phỏng 84
11.2 Các lớp gói 84
11.2.1 Lớp Packet 85
11.2.2 Lớp p_info 87
11.2.3 Lớp hdr_cmn 88
11.2.4 Lớp PacketHeaderManager 89
11.3 Các lệnh cơ bản 91
Trang 41 Giới thiệu về công cụ mô phỏng mạng NS
1.1 Tổng quan
NS là bộ công cụ mô phỏng mạng điều khiển theo các sự kiện rời rạc, được xâydựng và phát triển bởi trường đại học Berkeley – Mỹ, cho phép mô phỏng nhiều kiểumạng IP khác nhau, mô phỏng các giao thức mạng: TCP, UDP cũng như các dạngnguồn lưu lượng: FTP, Telnet, Web, CBR, VBR, mô phỏng các hàng đợi trong các bộđịnh tuyến: DropTail, RED, CBQ, mô phỏng các giải thuật định tuyến Ngoài ra NScòn cho phép thực hiện việc phát đa luồng và một số giao thức lớp MAC đối với môphỏng LAN
NS được xây dựng bằng ngôn ngữ lập trình hệ thống C++ và ngôn ngữ môphỏng OTcl Otcl là dạng ngôn ngữ kịch bản Tcl được mở rộng theo mô hình hướngđối tượng
Otcl: Bộ thông dịch Tcl với
phần mở rộng hướng đối tượng
Thư viện mô phỏng NS
Các đối tượng định trình sự
Hình 1: NS theo quan điểm người dùngTheo quan điểm người dùng thuần túy, NS là một bộ thông dịch các kịch bảnTcl hướng đối tượng NS gồm có các bộ định trình các sự kiện mô phỏng, các thư việnđối tượng thành phần mạng, thư viện các môdule tạo lập mạng (thực tế việc kết nối cácmodule được thực hiện bằng các hàm thành viên của các đối tượng mô phỏng cơ bản)
Khi sử dụng NS, người dùng phải lập trình bằng ngôn ngữ kịch bản Tcl Để tạolập và triển khai một mạng mô phỏng, người dùng viết một kịch bản Tcl để khởi tạomột bộ định trình sự kiện, thiết lập topo mạng thông qua việc sử dụng các đối tượngthành phần mạng và các hành liên kết trong các thư viện của NS Việc thiết lập mộtmạng là ghép nối các đường dữ liệu giữa các đối tượng mạng bằng cách đặt con trỏcủa một đối tượng này tới địa chỉ của một đối tượng khác tương ứng Khi muốn tạomột đối tượng mạng mới, thì người dùng có thể tạo ra đối tượng đó bằng cách xâydựng một đối tượng mới hoặc tổ hợp các đối tượng có sẵn trong các thư viện đối tượngcủa NS và tạo ra các đường liên kết dữ liệu giữa chúng
Một thành phần quan trọng của NS (bên cạnh các đối tượng mạng) là bộ địnhtrình sự kiện Một sự kiện trong NS là một mã nhận dạng gói, mã này là duy nhất đốivới một gói, sự kiện được định thời và gắn với một con trỏ trỏ đến đối tượng sẽ xử lýsự kiện đó Trong NS, bộ định trình sự kiện giám sát toàn bộ thời gian mô phỏng, quản
lý và kích hoạt các sự kiện theo một hàng đợi Khi một sự kiện được kích hoạt, bộ địnhtrình sẽ gọi tới thành phần đối tượng mạng xử lý tương ứng (thường cũng là đối tượng
Trang 5tạo ra sự kiện đó), cho phép đối tượng này thực hiện các tác vụ thích hợp lên gói gắnvới sự kiện Các thành phần đối tượng mạng truyền thông với nhau bằng cách trao đổicác gói Về nguyên tắc, tất cả các thành phần mạng luôn cần phải có một khoảng thờigian nhất định để xử lý gói (trễ) Trễ này được thể hiện thông qua việc sử dụng các bộđịnh trình sự kiện: gửi đi một sự kiện gắn với gói và chờ sự kiện đó được kích hoạt trởlại trước khi xử lý các gói tiếp theo Ví dụ: một thành phần mạng mô phỏng một thiếtbị chuyển mạch gói với 20 ms trễ, nó sẽ gửi đi một sự kiện trễ 20 ms gắn với gói cầnphải chuyển mạch tới bộ định trình sự kiện, bộ định trình sau 20 ms sẽ đưa sự kiện đó
ra khỏi hàng đội và kích hoạt nó trở lại thành phần mạng chuyển mạch, thành phầnchuyển mạch sẽ thực hiện việc chuyển gói tương ứng tới đối tượng liên kết đầu ra củanó
Một ứng dụng nữa của bộ định trình sự kiện là tạo ra các bộ định thời VD: giaothức TCP cần bộ định thời để giám sát thời gian chờ khi phát đi một gói nhằm thựchiện việc phát lại gói Khi đó, bộ định thời sử dụng bộ định trình tương tự như trongtrường hợp giả lập trễ, sự khác biệt duy nhất là bộ định thời đo giá trị thời gian gắn vớimột gói, thực hiện các tác vụ liên quan đến gói đó sau một khoảng thời gian nhất địnhtrôi qua mà không thực hiện việc mô phỏng trễ
NS được viết bằng hai ngôn ngữ OTcl và C++ Để đảm bảo tính hiệu quả NSphân chia đường dữ liệu và đường điều khiển riêng biệt Để giảm thời gian chươngtrình xử lý các sự kiện và gói (thời gian này không phải thời gian mô phỏng),thì bộđịnh trình sự kiện và các đối tượng mạng cơ bản trong đường dữ liệu được viết và biêndịch bằng ngôn ngữ C++ Các đối tượng sau biên dịch vẫn có thể được sử dụng bởi bộthông dịch Otcl thông qua các liên kết Otcl, các liên kết này tạo ra đối tượng OTcltương ứng cho mỗi đối tượng C++, cũng như tạo ra các hàm và các biến thành viêntrong đối tượng Otcl tương ứng với các biến và hàm thành viên trong đối tượng C++.Bằng cách này việc điều khiển các đối tượng C++ có thể được thực hiện thông quanOTcl, ngoài ra ta cũng có thể thêm các biến và hàm thành viên khác vào đối tượngOTcl Các đối tượng được viết bằng C++ mà không cần thiết phải điều khiển trực tiếptrong quá trình mô phỏng cũng không cần phải liên kết sang OTcl
Mặt khác một đối tượng không nằm trên đường số liệu có thể được xây dựnghoàn toàn bằng OTcl Hình 2 minh họa một cây phân cấp đối tượng trong C++ vàOTcl
Hình 2: Sự tương đồng giữa C++ và OTcl
C++
OTcl
Trang 6Bộ định trình sự kiện
tctcl otcl
mở rộng hướng đối tượng và một tập các thư viện đối tượng mô phỏng mạng
Các kết quả đạt được sau khi kết thúc quá trình mô phỏng, như trong hình vẽ 1,là tập một hoặc nhiều file kết quả đầu ra dưới dạng văn bản text, chứa các dữ liệu môphỏng chi tiết Các số liệu này có để được dùng để phân tích mô phỏng hoặc dùng làmđầu vào cho các công cụ trình diễn mô phỏng mạng dạng đồ họa: Nam, Xgraph
Nam (Network Animator) có dạng giao diện tương tự như một công cụ chơi
CD, cho phép hiển thị thông tin dạng đồ hoạc như: thông lượng, số gói bị loại bỏ trênmỗi link
1.2 Bộ định trình sự kiện
Như đã đề cập đến ở phần trên, đối tượng sử dụng chính của các bộ định trìnhsự kiện là các thành phần mạng, mô phỏng việc xử lý gói hoặc có sử dụng các bộ địnhthời Hình 4 mô tả các đối tượng mạng sử dụng bộ định trình sự kiện Cần lưu ý rằng:một đối tượng gửi đi một sự kiện nào đó cũng chính là đối tượng xử lý sự kiện đó tạimột thời điểm định sẵn và đường dữ liệu giữa các đối tượng khác với đường điềukhiển (đường sự kiện) Thực tế, việc đưa các gói từ một đối tượng mạng này đến mộtđối tượng mạng khác được thực hiện bằng cách sử dụng hàm send(Packet *p){target_-> recv(p)} của đối tượng gửi và hàm recv(Packet *,Handler * h =0) của đối tượng nhận
Trang 7Hình 4: Bộ định trình sự kiện rời rạc
NS có hai kiểu định trình sự kiện khác nhau: định trình thời gian thực và địnhtrình không theo thời gian thực Định trình không theo thời gian thực bao gồm 3 loại:List, Heap và Calendar Bộ định trình Calendar được sử dụng mặc địnhtrong NS Các bộ định trình thời gian thực được sử dụng để thực hiện việc mô phỏngtương tác với mạng thực tế
Ví dụ: việc lựa chọn một bộ định trình sự kiện cụ thể được thực hiện như sau:
set ns [new Simulator]
$ns use-scheduler Heap
Một ứng dụng nữa của các bộ định trình sự kiện là tạo ra các bộ định thời sựkiện mô phỏng như: khi nào thì bắt đầu một ứng dụng FTP, khi nào thì kết thúc môphỏng, hoặc để tạo ra các kịch bản mô phỏng trước khi thực hiện mô phỏng
Một đối tượng định trình sự kiện , bản thân nó có các hàm thành viên định thời
mô phỏng, ví dụ như hàm at time "string" thực hiện phát đi sự kiện AtEvent tại một thời điểm mô phỏng định sẵn: time Sự kiện AtEvent đối tượng lớp con
của lớp Event, có một biến để chứa giá trị chuỗi string đã cho Tuy nhiên sự kiệnAtEvent vẫn được xử lý bình thường như các sự kiện liên quan đến việc xử lý góikhác trong bộ định trình sự kiện
Khi một quá trình mô phỏng bắt đầu, và khi đến thời điểm định sẵn đối với sựkiện AtEvent, sự kiện AtEvent được chuyển tới bộ xử lý sự kiện AtEvent, vàcâu lệnh OTcl nằm trong chuỗi string của sự kiện AtEvent sẽ được thực thi Ví dụ:
set ns [new Simulator]
Trang 8tiếp người sử dụng, nên thực ra nó sẽ gọi đến các hàm thành viên của các đối tượngmạng hoặc các đối tượng định trình để thực sự thực hiện công việc đó.
1.3 Các thành phần mạng
Trong NS, hầu hết các thành phần mạng là các đối tượng phức hợp Hình 5 chỉ
ra một phần của cây phân cấp theo lớp OTcl
Hình 5: Một phần của cây phân cấp theo lớpGốc của cây phân cấp này là lớp TclObject Lớp TclObject là lớp cơ sởcủa mọi đối tượng trong thư viện OTcl (định trình sự kiện, thành phần mạng, địnhthời, và các đối tượng khác) Lớp NsObject là lớp cơ sở của mọi đối tượng thànhphần mạng cơ bản xử lý gói, các thành phần này kết hợp với nhau tạo thành các đốitượng phức hợp, như các đối tượng nodes hoặc links chẳng hạn Các thành phầnmạng cơ bản lại được chia thành hai phân lớp con, Connector và Classifier,dựa trên số lượng đường dữ liệu đầu ra có thể Các đối tượng mạng cơ sở chỉ có mộtđường dữ liệu đầu ra duy nhất sẽ thuộc vào lớp Connector, các đối tượng chuyểnmạch có thể có nhiều đường dữ liệu đầu ra thuộc vào lớp Classifier
Nút và định tuyến
Nút là một đối tượng phức hợp, được hợp thành bởi các đối tượng đầu vào nútvà các bộ phân loại classifier Có hai loại nút trong NS Nút đơn hướng chỉ cómột đối tượng phân loại địa chỉ thực hiện định tuyến đơn đường và một đối tượngphân loại cổng Nút đa hướng, ngoài hai đối tượng phân loại địa chỉ và phân loại cổngnhư trong nút đơn hướng, còn có thêm một đối tượng phân loại gói đa hướng và mộtđối tượng phân loại thực hiện định tuyến đa luồng
Trang 9Hình 6 Nút (đơn hướng và đa hướng)Trong NS, các nút đơn hướng được sử dụng mặc định Để tạo ra nút đa hướng,người sử dụng phải khai báo tường minh trong kịch bản OTcl, ngay sau khi tạo ra đốitượng định trình sự kiện, khi đó mọi nút được tạo ra sẽ là nút đa hướng Sau khi chỉ rakiểu nút sử dụng, người sử dụng cũng có thể lựa chọn kiểu giao thức định tuyến xácđịnh thay vì sử dụng giao thức ngầm định.
Đường kết nối
Đường kết nối cũng là một đối tượng phức hợp chính khác trong NS, đối tượngLink Khi người sử dụng tạo ra một đường kết nối bằng cách sử dụng hàm thành viênduplex-link của đối tượng Simulator, hai kết nối đơn trên hai hướng sẽ được tạo ranhư trong hình vẽ 7
Hình 7: Đường kết nốiCần lưu ý rằng hàng đợi đầu ra của một nút, thực ra là một phần của đối tượngLink đơn Các gói khi ra khỏi một hàng đợi Queue, sẽ được chuyển tới đối tượngDelay, đối tượng này mô phỏng trễ của link, còn các gói bị loại bỏ khỏi hàng đợi
được gửi tới đối tượng Null Agent và được hủy tại đó Cuối cùng, đối tượng TTL
tính toán tham số Time To Live đối với mỗi gói nhận được và thay đổi giá trịtrường TTL của gói
Theo dõi giám sát
Trong NS, các tác vụ mạng được theo dõi trên mỗi đường kết nối đơn Nếu đốitượng mô phỏng được chỉ thị theo dõi các tác vụ mạng ( sử dụng lệnh $ns trace-all file hoặc $ns trace-nam file), thì sau đó các đường kết nối được tạo rasẽ được thêm vào các đối tượng theo dõi như trong hình vẽ 8 Người sử dụng có thểtạo ra đối tượng theo dõi thuộc một dạng nào đó giữa nút nguồn và nút đích bằng lệnhcreate-trace {type file src dst}
Hình 8 Các đối tượng theo dõi được thêm vào
Khi mỗi đối tượng theo dõi nhận được một gói, nó sẽ ghi các thông số liên quanđến gói ra file theo dõi mà không ảnh hưởng đến thời gian mô phỏng, và chuyển cácgói này tới đối tượng mạng tiếp theo
Giám sát hàng đợi
Về cơ bản, các đối tượng theo dõi được thiết kế để ghi lại thời gian đến của góidữ liệu Mặc dù người dùng có đủ các thông tin từ file theo dõi, nhưng có thể họ vẫn
Trang 10quan tâm đến những gì xảy ra bên trong một hàng đợi nào đó Ví dụ: một người dùngquan tâm đến cách thức xử lý một hàng đợi RED chẳng hạn, anh ta có thể muốn đo sựthay đổi độ dài trung bình của hàng đợi và độ dài hiện thời của hàng đợi RED, điều đócó nghĩa là cần phải giám sát hàng đợi đó.
Việc giám sát hàng đợi được thực hiện bằng cách sử dụng các đối tượng giámsát hàng đợi và các đối tượng gián điệp như trong hình 10
Hình 9: Giám sát hàng đợiKhi một gói đến, đối tượng gián điệp sẽ thông báo cho đối tượng giám sát hàngđợi và những thông tin này được sử dụng để giám sát hàng đợi
1.4 Gói dữ liệu
Một gói trong NS được hình thành bởi một chồng các mào đầu, và một khônggian dữ liệu như hình 10
Hình 10: Khuôn dạng gói trong NSKhuôn dạng mào đầu gói được tạo ra ngay khi đối tượng Simulator được khởitạo, bao gồm một tập tất cả các mào đầu đã đăng ký, chẳng hạn các mào đầu thườngđược sử dụng: IP, TCP, RTP và các mào đầu theo dõi Điều này có nghĩa là cho dùmột mào đầu cụ thể nào đó có được sử dụng hay không, thì một chồng gồm tất cả cácmào đầu đã đăng ký vẫn được tạo ra khi một gói được cấp phát bởi một đối tượngAgent, và các đối tượng mạng có thể can thiệp tới bất kỳ mào đầu nào của gói
Thường thì một gói chỉ có duy nhất một chồng mào đầu (và con trỏ không giandữ liệu được để bằng null) Mặc dù một gói có thể mang dữ liệu thực tế (từ một ứngdụng nào đó) bằng việc cấp phát không gian dữ liệu, nhưng lại có rất ít ứng dụng và
Agent hỗ trợ việc này, bởi vì việc tải dữ liệu thực trong môi trường mô phỏng là điều
vô nghĩa Tuy nhiên, nếu bạn muốn thực hiện một ứng dụng giao tiếp với một ứngdụng khác qua mạng, thì có thể bạn muốn sử dụng đặc tính này với một chút sửa đổiđối tượng Agent cơ sở
Trang 112 Giao tiếp với bộ thông dịch: Liên kết OTcl
NS là một công cụ mô phỏng hướng đối tượng, bao gồm bản thân NS là mộtđối tượng được viết bằng C++ và một bộ thông dịch OTcl NS hỗ trợ kiến trúc câyphân cấp theo lớp trong C++ (cây phân cấp biên dịch) và kiến trúc cây phân cấp theolớp tương tự trong bộ thông dịch OTcl(cây phân cấp thông dịch) Hai cây phân cấp nàycó quan hệ chặt chẽ với nhau Từ góc nhìn của người dùng, tồn tại mối quan hệ 1-1giữa một lớp trong cây phân cấp thông dịch và một lớp trong cây phân cấp biên dịch.Gốc của cả hai cây phân cấp này là lớp TclObject Người dùng sẽ tạo ra các đối tượng
mô phỏng thông qua bộ thông dịch, những đối tượng này, thuộc vào cây phân cấpthông dịch, được khởi tạo trong bộ thông dịch và sẽ được ánh xạ sang một đối tượngtương ứng trong cây phân cấp biên dịch
Cây phân cấp thông dịch được tự động thiết lập thông qua các hàm được địnhnghĩa trong lớp TclClass Các đối tượng tạo bởi người dùng được ánh xạ thông quacác hàm được định nghĩa trong lớp TclObject Ngoài ra vẫn có các cây phân cấp kháctrong C++ và OTcl, đó là những cây thực sự không có quan hệ với nhau
2.1 Các khái niệm
Trước hết ta tìm hiểu tại sao NS lại sử dụng hai ngôn ngữ C++ và OTcl Đó làbởi vì, trong quá trình thực hiện mô phỏng có hai việc khác nhau cần phải thực hiện:
Một mặt, việc mô phỏng chi tiết cề các giao thức đòi hỏi phải sử dụng một ngônngữ lập trình hệ thống, nhằm xử lý hiệu quả với các dữ liệu dạng byte, các mào đầugói hay thực hiện các giải thuật tính toán trên một số lượng lớn dữ liệu Đối với nhữngcông việc như vậy thì tốc độ thực thi là rất quan trọng, còn thời gian thay đổi, nâng cấp(quá trình chạy mô phỏng, tìm lỗi, sửa lỗi, biên dịch và chạy lại) sẽ ít quan trọng hơn
Mặt khác, một phần lớn các công việc nghiên cứu mạng lại liên quan đến nhữngthay đổi nhỏ các tham số đầu vào, thay đổi cấu hình hay việc tìm hiểu nhanh chóngmột số mô hình mạng nào đó Trong trường hợp này, thời gian lặp lại (thay đổi thamsố, cấu hình và chạy lại) lại trở nên quan trọng, còn thời gian thực thi sẽ ít quan trọnghơn
NS đáp ứng cả hai yêu cầu trên bằng cách sử dụng hai ngôn ngữ C++ và OTcl.C++ có thời gian thực thi nhanh, nhưng chậm trong việc thay đổi nâng cấp, phù hợpvới việc triển khai chi tiết các giao thức hay xử lý gói OTcl chạy chậm hơn nhưng lạidễ dang thay đổi nhanh, phù hợp với việc thiết lập cấu hình mô phỏng NS (thông quatclcl) đưa ra cơ chế cho phép sử dụng các đối tượng và biến trong môi trường cả haingôn ngữ C++ và OTcl
Mục đích sử dụng OTcl để:
- Thực hiện thiết lập cấu hình mô phỏng và những công việc chỉ thực hiện mộtlần
- Thực hiện những việc có thể giải quyết bằng cách tổ hợp các các đối tượng C++và sử dụng C++ để:
- Thực hiện những công việc yêu cầu xử lý trên mỗi gói của luồng dữ liệu
- Sửa đổi những lớp C++ có sẵn
Ví dụ: links là những đối tượng OTcl, được lắp ráp từ các đối tượng C++: trễ,xếp hàng, mất gói Đối với những công việc yêu cầu xử lý chi tiết, cụ thể hơn(nguyên lý hàng đợi hay một mô hình trễ đặc thù nào đó chẳng hạn) thì chúng ta sẽ cầnphải xây dựng một đối tượng C++ mới
Trang 122.2 Tổng quan về mã lệnh
Chúng ta sử dụng thuật ngữ "bộ thông dịch" để nói đến thông dịch OTcl Mã
giao tiếp với bộ thông dịch được đặt trong thư mục /tclcl và toàn bộ phần còn lại mã
mô phỏng được đặt trong thư mục NS-2
Có một số lớp được định nghĩa trong thư mục /tclcl cho giao tiếp với bộ thông
dịch OTcl, chúng ta chỉ xem xét 6 lớp trong số đó được sử dụng trong NS:
- Lớp Tcl: chứa các hàm cho phép mã C++ truy nhập tới bộ thông dịch
- Lớp TclObject: là lớp cơ sở của tất cả các đối tượng mô phỏng
- Lớp TclClass: định nghĩa cây phân cấp thông dịch và các hàm cho phépngười dùng khởi tạo các đối tượng TclObject
- Lớp TclCommand: định nghĩa các câu lệnh thông dịch đơn giản
- Lớp EmbeddedTcl: định nghĩa các hàm để nạp các câu lệnh có sẵn ở múccao hơn, cho phép thiết lập câu hình mô phỏng dễ dàng hơn
- Lớp InstVar: định nghĩa các hàm cho phép truy nhập tới các biến thành viênC++
2.3 Lớp Tcl
Lớp Tcl bao bọc toàn bộ instancethực sự của bộ thông dịch OTcl và đưa racác hàm giao tiếp với bộ thông dịch đó Các hàm này cho phép thực hiện
- Lấy tham chiếu tới Tcl instance
- Gọi các hàm OTcl qua bộ thông dịch
- Nhận và trả lại kết quả cho bộ thông dịch
- Thông báo các tình huống lỗi và thoát
- Lưu tham chiếu và tìm các đối tượng TclObject
- Truy nhập trực tiếp tới bộ thông dịch
2.3.1 Lấy tham chiếu tới instance của lớp Tcl
Luôn tồn tại một instance duy nhất của lớp Tcl được khai báo như là một biếnthành viễn tĩnh, người lập trình có thể lấy được tham chiếu tới instance này qua câulệnh
2.3.3 Gửi và nhận kết quả từ bộ thông dịch
Khi bộ thông dịch gọi các hàm C++, nó mong muốn kết quả được trả về trong
biến thành viên riêng tcl_->result Có hai hàm để trả kết quả vào biến này là
Trang 13Khi một hàm C++ thực hiện một câu lệnh OTcl, bộ thông dịch cũng sẽ trả kết
quả về trong biến thành viên riêng tcl_->result Và để lấy được kết quả này sử dụng hàm string tcl.result(void), hàm này trả về kết quả dưới dạng chuỗi.
2.3.4 Thông báo lỗi và thoát.
Hàm tcl.error(const char * s) được sử dụng để thông báo lỗi trong mã biên dịch, nó thực hiện việc ghi chuỗi thông báo lỗi s cùng kết quả trả về tclresult ra luồng stdout và thoát ra với mã lỗi bằng 1.
2.3.5 Các hàm băm trong bộ thông dịch
NS lưu tham chiếu của tất cả các đối tượng TclObject của cây biên dịch trongmột bảng băm NS sử dụng tên của các đối tượng này để thêm vào, tìm kiếm hay xóatham chiếu của đối tượng trong bảng băm Có 3 hàm để làm điều này
- tcl.enter (TclObject * o)
- tcl.lookup(char * s)
- tcl.remove(TclObject *o)
Các hàm trên được sử dụng trong nội tại các lớp TclObject và TclClass để quản
lý các đối tượng
2.4 Lớp TclObject
TclObject là lớp cơ sở của phần lớn các lớp còn lại trong cây biên dịch vàthông dịch Mỗi đối tượng thuộc lớp TclObject được tạo bởi người sử dụng thôngqua bộ thông dịch, và sẽ có một đối tượng ánh xạ tương ứng được tạo ra trong cây biêndịch Hai đối tượng này có quan hệ chặt chẽ với nhau Lớp TclClass (được mô tả ởphần sau) chứa các cơ chế cho phép thực hiện việc ánh xạ này
2.4.1 Tạo và hủy đối tượng TclObject
Khi người dùng muốn khởi tạo hay xóa bỏ một đối tượng TclObject, hai hàm
new{} và delete{} sẽ được sử dụng để tạo và hủy các đối tượng này Hai hàm new{} và delete{} được sử dụng để tạo và hủy các đối tượng của tất cả các lớp
dẫn xuất từ lớp TclObject
Tạo đối tượng TclObject: bằng cách dùng hàm new{}, người dùng sẽ tạo ra
một đối tượng TclObject thông dịch, bộ thông dịch thực hiện việc khởi tạo đốitượng đó thông qua việc gọi hàm dựng init{} với các tham số nhận được từ ngườidùng Sau đó NS sẽ tự động tạo ra một đối tượng biên dịch tương ứng, đối tượng ánhxạ này được tạo ra bởi hàm dựng của lớp TclObject cơ sở Vì vậy để khởi tạo một đốitượng TclObject, trước tiên cần phải gọi hàm dựng của lớp cha trước khi thực hiện cáckhởi tạo đối tượng của lớp con Hàm new{} trả về thẻ bài trỏ tới đối tượng được tạora
Hủy các đối tượng TclObject: việc này nhằm xóa bỏ đối tượng thông dịch vàđối tượng biên dịch ánh xạ tương ứng Cũng giống như việc tạo đối tượng, khi hủy đốitượng phải gọi hàm hủy của lớp cha một cách tường minh ở câu lệnh cuối cùng tronghàm hủy của lớp con Hàm hủy của đối tượng TclObject sẽ thực hiện gọi hàmdelete_shadow{} để xóa bỏ đối tượng biên dịch tương ứng Cuối cùng bộ thôngdịch sẽ xóa bỏ đối tượng thông dịch
Trang 142.4.2 Kết hợp biến
Trong phần lớn các trường hợp, chúng ta không thể can thiệp trực tiếp vào cácbiến thành viên biên dịch và việc can thiệp tới các biến thông dịch qua mã thong dịchcũng rất hạn chế Tuy nhiên, chúng ta có thể thiết lập nên sự kết hợp hai chiều: cả haibiến thành viên biên dịch và thông dịch cùng truy nhập tới một dữ liệu duy nhất, sựthay đổi giá trị của một trong hai biến thành viên sẽ làm thay đổi giá trị của biến thànhviên còn lại Cơ chế kết hợp này thiết lập bởi hàm dựng biên dịch khi đối tượng đượckhởi tạo
NS hỗ trợ 5 loại dữ liệu khác nhau: kiểu thực, kiểu nguyên, kiểu logic, kiểu thờigian và kiểu dữ liệu giá trị băng thông (Kb, Mb ) Cú pháp để thực hiện việc gán dữliệu cho các biến như sau
$object set realvar 1.2e3
$object set intvar 123
$object set bwvar 1.5mb
$object set timevar 1500m
$object set boolvar true
2.4.3 Theo dõi giá trị biến
Ngoài cơ chế kết hợp biến, TclObject còn hỗ trợ theo dõi giá trị của cả biến C++ và Tcl Một biến khi được tạo ra trong C++ hoặc trong Tcl đều có thể thiết lập việctheo dõi giá trị của nó Để theo dõi giá trị một biến ở mức Tcl, thì biến đó phải xuấthiện trong Tcl, điều đó có nghĩa là nó phải là một biến Tcl thuần túy hoặc là một biếnkết hợp C++/Tcl Ngoài ra, một đối tượng có biến thành viên được theo dõi giá trị
cũng có thể yêu cầu việc theo dõi sử dụng hàm trace{} của đối tượng
TclObject.Hàm trace{} có hai tham số đầu vào, tham số vào đầu tiên là tên củabiến, tham số tùy chọn thứ hai chỉ ra đối tượng chịu trách nhiệm theo dõi giá trị củabiến cần theo dõi, nếu đối tượng theo dõi này không được chỉ ra, thì đối tượng sở hữubiến sẽ chịu trách nhiệm theo dõi giá trị của biến
Để một đối tượng TclObject có thể theo dõi được giá trị biến, nó phải mở rộnghàm C++ trace(), đây là một hàm ảo đã được định nghĩa trong lớp TclObject
2.4.4 Hàm command: định nghĩa và cách gọi
Đối với mỗi đối tượng TclObject được tạo ra, NS thiết lập một hàm mẫucmd{}, đóng vai trò như một giao tiếp để thực hiện các hàm của đối tượng biên dịchánh xạ Hàm cmd{} tự động gọi hàm command() của đối tượng biên dịch, và cáctham số đầu vào của hàm cmd{} cho hàm command()
Người sử dụng có thể gọi hàm cmd{} theo hai cách: hoặc là gọi tường minhhàm và chỉ ra tác vụ mong muốn ở biến đầu vào thứ nhất, hoặc gọi theo cách ngầmđịnh nếu tồn tại một hàm mẫu trùng tên với tác vụ mong muốn Đa phần các kịch bản
mô phỏng đều sử dụng cách gọi thứ hai,
2.5 Lớp TclClass
Lớp biên dịch TclClass là một lớp ảo thuần túy Các lớp được dẫn xuất từ lớp
cơ sở này có hai chức năng: xây dựng cây phân cấp theo lớp thông dịch để ánh xạ sangcây phân cấp theo lớp biên dịch, và đưa ra các hàm để khởi khảo các đối tượngTclObjects mới Mỗi lớp dẫn xuất như vậy được gắn với một lớp biên dịch xác định
Trang 15trong cây phân cấp biên dịch, và có thể khởi tạo các đối tượng mới của lớp biên dịchtương ứng.
Ví dụ: chúng ta xem xét lớp RenoTcpClass, được dẫn xuất từ lớp TclClass, vàđược gắn với lớp biên dịch RenoTcpAgent Lớp RenoTcpClass sẽ khởi tạo các đốitượng mới của lớp RenoTcpAgent Lớp biên dịch RenoTcpAgent là lớp được dẫn xuấttừ lớp TcpAgent, bản thân lớp TcpAgent được dẫn xuất từ lớp Agent, và cuối cùng lớpAgent lại được dẫn xuất từ lớp TclObject
Lớp RenoTcpClass được định nghĩa như sau:
static class RenoTcpClass: public TclClass {
2.5.1 Kết hợp các biến thành viên tĩnh của lớp C++
Ở phần trước, chúng ta đã đề cập đến cách thức để nhìn thấy các biến thànhviên của các đối tượng trọng C++ trong môi trường OTcl, tuy nhiên cơ chế này lạikhông thể áp dụng cho các biến thành viên tĩnh của các lớp C++ Đương nhiên là,chúng ta vẫn có thể tạo ra một biến trong OTcl tương ứng với biến thành viên tĩnh củamỗi đối tượng C++, tuy nhiên điều này lại hoàn toàn phá hỏng đi ý nghĩa của biếnthành viên tĩnh
Chúng ta không thể giải quyết vấn đề kết hợp biến này theo các giải pháp tươngtự như việc kết hợp biến trong TclObject, bởi vì cơ chế kết hợp biến trong TclObjectdựa trên lớp InstVar mà lớp này trong TclCl lại đòi hỏi sự hiện diện của một đối tượngTclObject cụ thể Tuy nhiên, chúng ta có thể tạo ra một hàm thuộc lớp TclClass tươngứng và thực hiện việc truy xuất tới biến thành viên tĩnh của lớp C++ thông qua hàmnày Các bước để thực hiện việc này như sau có thể tham khảo trong tài liệu hướngdẫn NS, trang 30
2.6 Lớp TclCommand
Lớp TclCommand đưa ra cơ chế cho phép NS chuyển các câu lệnh đơn giản tớibộ thông dịch, và các câu lênh này có thể được thực hiện bởi bộ thông dịch trong môitrường chung
Có hai hàm: ns-random và ns-version thường được sử dụng trong môi trường chung, cả hai hàm này được khởi tạo bởi hàm init_misc(void), và hàm init_misc được gọi bởi hàm Tcl_AppInit(void) trong quá trình NS được nạp
vào bộ nhớ
Lớp VersionCommand, định nghĩa hàm ns-version, hàm này không cótham số đầu vào, và trả về phiên bản NS hiện thời dạng chuỗi
Lớp RandomCommand, định nghĩa hàm ns-random, không tham số đầu vào,trả về một giá trị nguyên ngẫu nhiên nằm trong khoảng [0, 231-1]
Ví dụ:
% ns-version 2.0a12
% ns-random 12334556
Trang 16Cách đơn giản nhất để mở rộng NS là thêm các mã OTcl hoặc là vào file
tcl-object.tcl hoặc vào các kịch bản trong thư mục ~ns/tcl/lib/ Cần lưu ý rằng, đối với trường hợp thứ hai, NS nạp file ~ns/tcl/lib/ns-lib.tcl một cách tự động, vì vậy người
lập trình phải thêm vào file này hai dòng để đảm bảo kịch bản của mình được tự động
nạp vào lúc NS khởi động Ví dụ để thêm vào kịch bản tcl/mcast/srm.tcl định nghĩa
các thủ tục cho phép chạy SRM, trong file ns-lib.tcl xuất hiện dòng lệnh
source tcl/mcast/srm.tcl
Có ba điểm cần lưu ý đối với mã EmbeddedTcl là: thứ nhất nếu trong quá trìnhkiểm tra mã bị lỗi thì ns sẽ không chạy, thứ hai người sử dụng có thể ghi đè lên bất kỳđoạn mã nào trong thư viện mã, cụ thể là chúng có thể được thay đổi Cuối dùng, saukhi thêm các kịch bản vào ns-lib.tcl, cũng như mỗi lần sửa đổi sau đó, người sử dụngphải biên dịch lại ns để những thay đổi đó có hiệu lực
2.8 Lớp InstVar
Lớp InstVar định nghĩa các hàm và đưa ra các cơ chế để kết hợp một biếnC++ trong đối tượng biên dịch với một biến OTcl xác định trong đối tượng thông dịchtương ứng Việc kết hợp này cho phép giá trị của biến có thể được thay đổi trong cảhai môi trường: thông dịch và biên dịch ở mọi thời điểm
InstVarBandwidth, InstVarInt và InstVarBool, được sử dụng để kếthợp 5 kiểu biến: thực, nguyên, thời gian, logic và băng thông tương ứng
3 Lớp Simlator
Tất cả bộ mô phỏng được mô tả bởi lớp Tcl của bộ mô phỏng Nó cung cấp mộttập các giao diện cho việc đặt cấu hình mô phỏng và lựa chọn kiểu của bộ định trình sựkiện sử dụng để điều khiển việc mô phỏng Một kịch bản mô phỏng nói chung bắt đầubởi việc tạo ra một lớp cụ thể và gọi các phương thức khác nhau để tạo các nút, cáccấu trúc liên kết mạng và cấu hình các khía cạnh khác của sự mô phỏng
3.1 Khởi tạo bộ mô phỏng
Khi một đối tượng mô phỏng được tạo ra trong tcl, thủ tục khởi tạo được thựchiện theo các thao tác:
- Khởi tạo định dạng gói (gọi hàm create_packetformat)
- Tạo bộ định trình (mặc định là bộ định trình lịch)
- Tạo một "tác tử rỗng"(null agent - nơi để hủy gói trong ở các ví trí khácnhau)
Sự khởi tạo định dạng gói thiết lập các trường dư với các gói được sử dụngtrong suốt quá trình mô phỏng Bộ định trình thực hiện mô phỏng theo cách điều khiểnsự kiện và có thể được thay thế bởi bộ định trình luân phiên mà ở đó cung cấp một vàingữ nghĩa khác nhau (xem các phần dưới đây để có thêm chi tiết)
tác tử rỗng được tạo ra theo lời gọi:
set nullAgent_ [new Agent/Null]
Trang 17Tác tử này nói chung là hữu ích như là một nơi để hủy gói hoặc như là một cái đích cho các gói không được đếm hoặc được ghi lại.
3.2 Bộ định trình và sự kiện
Một bộ mô phỏng là một bộ mô phỏng điều khiển sự kiện, có 4 bộ định trìnhhiện tại có trong bộ mô phỏng, chúng được thực hiện sử dụng cấu trúc dữ liệu khácnhau: danh sách kết nối đơn, chất đống, hàng chờ lịch (mặc định) và một kiểu đặc biệtđược gọi là "thời gian thực" Mỗi chúng được mô tả dưới dây Bộ định trình hoạt độngbởi việc lựa chọn sự kiện sớm nhất tiếp theo, thực hiện chúng cho tới khi hoàn thànhsau đó quay trở lại thực hiện các sự kiện tiếp theo Đơn vị thời gian được tính bởi bộđịnh trình là giây Hiện tại, bộ mô phỏng là tuyến đoạn đơn và chỉ một sự kiện đượcthực hiện trong suốt thời gian Nếu có hơn một sự kiện được định trình thực hiện ởcùng một thời gian, sự hoạt động của chúng là được thực hiện theo cách định trình đầutiên được giải quyết đầu tiên, Những sự kiện đồng thời không được sắp xếp lại bởi bộđịnh trình (như trong những phiên bản trước) và tất cả bộ định trình nên cung cấp cùngmôt thứ tự giải quyết được đưa ra cho cung loại đầu vào
Việc thực hiện từng phần các sự kiện hoặc các công việc được ưu tiên sẽ khôngđược hỗ trợ
Một sự kiện nói chung gồm có "thời gian đốt cháy" (firing time) và một hàmtrình xử lý Định nghĩa thật sự của một sự kiện như sau:
class Event {
public:
Event* next_; /* event list */
Handler* handler_; /* handler to call when event ready */
double time_; /* time at which event is ready */
int uid_; /* unique ID */
Event() : time_(0), uid_(0) {}
};
/*
* The base class for all event handlers When an event’s scheduled
* time arrives, it is passed to handle which must consume it.
* i.e., if it needs to be freed it, it must be freed by the handler.
Trang 183.2.1 Bộ định trình danh sách
Bộ định trình danh sách thực thi bộ định trình sử dụng cấu trúc danh sách liênkết đơn Danh sách giữ theo trật tự thời gian (sớm nhất đến muộn nhất) những sự kiệnchèn thêm vào và xóa đi yêu cầu quét danh sách để tìm ra mục thích hợp Lựa chọn sựkiện tiếp theo để thực hiện yêu cầu cắt mục đầu tiên ra khỏi đầu danh sách Sự thực thinày giữ cho việc thực hiện sự kiện theo cách FIFO cho các sự kiện đồng thời
3.2.2 Bộ định trình xếp đống
Bộ định trình xếp đống thực thi bộ định trình sử dụng cấu trúc xếp đống Cấutrúc này là cao cấp hơn cấu trúc danh sách với số lượng lớn các sự kiện, như là thờigian xóa và chèn thêm là O (log n) cho n sự kiện Sự thực thi này trong ns v2 được lấytừ bộ mô phỏng MaRS-2.0 bản thân MaRS lại được mượn mã từ bộ NetSim cho dùdòng này
3.2.3 Bộ định trình xếp hàng theo lịch
Bộ định trình xếp hàng theo lịch sử dụng cấu trúc dữ liệu tương tự như lịch đểbàn 1 năm, ở đó các sự kiện cùng ngày tháng của các năm có thể được ghi trong mộtngày Sự thực thi của xếp hàng theo lịch trong ns v2 được đóng góp bởi DavidWetherall
3.2.4 Bộ định trình thời gian thực
Bộ định trình thời gian thực cố gắng đồng bộ sự thi hành của các sự kiện vớithời gian thực Nó thực thi như là một lớp con của bộ định trình danh sách Khả năngvề thời gian thực trong ns là đang được phát triển, những đã được sử dụng đưa ra một
ns mô phỏng mạng trong kiến trúc thế giới thực được thực nghiệm với kiến trúc mạngđơn giản, lưu lượng chéo, Nó chỉ hoạt động với tốc độ dữ liệu lưu lượng mạngchậm, như một bộ mô phỏng cần phải có thể theo được với tốc độ đến của gói trongthế giới thực, và sự đồng bộ này hiện tại là không có hiệu lực
3.3 Các phương thức khác
Các lớp của bộ mô phỏng cung cấp một lượng các phương pháp sử dụng thiếtlập sự mô phỏng Nói chung chúng được chia thành 3 loại:
Các phương pháp tạo, quản lý kiến trúc và quản lý các liên kết, các phươngpháp thực hiện việc theo vết, và trình giúp đỡ thực hiện chức năng xử lý với bộ địnhtrình Theo đây là danh sách các phương pháp không có liên quan đến kiến trúc mạngcủa bộ mô phỏng:
Simulator instproc now ;# return scheduler’s notion of current time Simulator instproc at args ;# schedule execution of code at specified time
Simulator instproc cancel args ;# cancel event
Simulator instproc run args ;# start scheduler
Simulator instproc halt ;# stop (pause) the scheduler
Simulator instproc flush-trace ;# flush all trace object write buffers Simulator instproc create-trace type files src dst ;# create trace object
Simulator instproc create_packetformat ;# set up the simulator’s packet format
Trang 193.4 Lướt qua về các lệnh
Synopsis:
ns <otclfile> <arg> <arg>
Mô tả: Lệnh cơ bản để chay một kịch bản mô phỏng trong ns Bộ mô phỏng nsgọi thông qua bộ thông dịch ns, một sự mở rộng của lệnh vanilla otclsh Sự mô phỏngđược định nghĩa bởi một kịch bản Otcl (tệp tin) Vài ví dụ về kịch bản Otcl có thể thấytrong thư mục ns/tcl/ex
Dưới đây là danh sách chung nhất các lệnh của bộ mô phỏng được sử dụngtrong mô phỏng
scripts:
set ns_ [new Simulator]
lệnh này tạo ra một đối tượng cụ thể của bộ mô phỏng
set now [$ns_ now]
Bộ định trình giữ vết thời gian mô phỏng nó trả về thông báo của bộ định trình về thời gian hiện tại
$ns_ create-trace <type> <file> <src> <dst> <optional arg: op>
tạo một đối tượng giám sát kiểu <type> giữa đối tượng <src> và <dst>
và gán đối tượng giám sát này vào một tệp tin <file> để ghi lại kết quả giám sát Nếu op được định nghĩa là “nam”, nó tạo ra tệp tin giám sát nam; nếu
op không được định nghĩa các tệp tin giám sát ns được tạo ra một cách tự động
$ns_ at-now <args>
có hiệu quả như lệnh "$ns_ at $now $args" Chú ý rằng chức năng này
có thể không hoạt động vì độ phân giải số ký tự của tcl
$ns_ use-scheduler <type>
Sử dụng để chỉ ra kiểu của bộ định trình được sử dụng khi mô phỏng Kiểu của bộ định trình có thể là List, Calendar, Heap và RealTime, hiện tại
bộ định trình Calendar được sử dụng là mặc định.
$ns_ after <delay> <event>
định trình một sự kiện sẽ được thực hiện sau một khoảng thời gian trễ.
Trang 20$ns_ dumpq
lệnh cho việc kết xuất các sự kiện được xếp hàng trong bộ định trình trong khi bộ định trình treo
$ns_ create_packetformat
Thiết lập định dạng gói tin của bộ mô phỏng
4 Các nút và chuyển gói
Chương này mô tả một khía cánh của việc tạo kiến trúc mạng trong ns như làtạo các nút Chương tiếp theo sẽ mô tả khía cạnh thứ hai của việc tạo kiến trúc mạngnhư là kết nối các nút thành các liên kết Chương này ko mô tả chi tiết tổ chức bêntrong của một nút (cho dù một vài lược đồ được đưa ra), hoặc là tương tác giữa mộtnút và module định tuyến của nó
Nhắc lại rằng mỗi mô phỏng yêu cầu lớp của bộ mô phỏng cụ thể để điều khiểnvà thao tác mô phỏng này Lớp này cung cấp các thủ tục cụ thể để tạo và quản lý kiếntrúc mạng và lưu trữ bên trong các tham chiếu tới mỗi phần tử của kiến trúc mạng.Chúng ta bắt đầu mô tả các thủ tục trong lớp Bộ mô phỏng (phần 4.1) sau đó mô tả cácthủ tục cụ thể trong lớp Node (phần 4.2) để truy cập và thao tác trên nút riêng biệt.Chúng ta kết thúc với các mô tả chi tiết của Bộ phân lớp (phần 4.4) từ đó các đốitượng nút phức hợp hơn được hình thành
4.1 Các cách thức của bộ mô phỏng: Tạo kiến trúc mạng
Nguyên tố cơ bản có được một nút là:
set ns [new Simulator]
$ns node
Thủ tục cụ thể node dựng nên một nút từ các đối tượng phân lớp đơn giản hơn.Bản thân Node là một lớp đứng độc lập trong OTcl Hơn nữa, hầu hết các thành phầncủa nút là trong đối tượng Tcl Cấu trúc điển hình của một nút được chỉ ra trong hình5.1
Trước ns phiên bản 2.1b6 địa chỉ của một tác tử trong một nút là rộng 16bit:8bit cao được định nghĩa là node id_, 8 bit thấp nhận dạng tác tử riêng biệt trong nút.Giới hạn số nút trong một lần mô phỏng là 256 nút Nếu người sử dụng cần tạo mộtkiến trúc mạng lớn hơn 256 nút thì đầu tiên cần phải mở rộng không gian địa chỉ trướckhi tạo bất cứ nút nào
như là:
$ns set-address-format expanded
Trang 21Hình 4.1: Cấu trúc của một nút đơn hướng, chú ý rằng entry_ là một biến sônhãn đơn thay vì một đối tượng thật ví dụ như là classifier_
Mở rộng không gian địa chỉ tới 30 bit, 22 bít cao được sử dụng gán cho số nút Chú ý: Từ bản 2.1b6, trên đó thì không cần thiết dài hơn, ns sử dụng số nguyên
32 bit cho cả địa chỉ và cổng, còn trước đó, giới hạn trên 256 nút là không thể dùngđược
Theo mặc định, các nút trong ns được dựng cho mô phỏng đơn hướng Để môphỏng đa hướng, sự mô phỏng này có thể được tạo ra với lựa chọn "-multicast on", vídụ:
set ns [new Simulator -multicast on]
Cấu trúc bên trong của nút đa hướng được chỉ ra trong hình 5.2
Khi một mô phỏng sử dụng định tuyến đa hướng, bit cao nhất của địa chỉ chỉ thịrằng phần địa chỉ là địa chỉ đa hướng hay địa chỉ đơn hướng Nếu bit đó là 0, địa chỉđại diện là đại chỉ đơn hướng, ngược lại là địa chỉ đa hướng Nó ngụ ý rằng, theo mặcđịnh, mô phỏng đa hưởng được giới hạn trong 128 nút
Trang 22Hình 4.2 Cấu trúc bên trong của nút đa hướng
4.2 Các cách thức của nút: đặt cấu hình nút
Các thủ tục để cấu hình mỗi nút riêng biệt có thể được chia thành:
- Các chức năng điều khiển
- Quản lý số địa chỉ và số cổng, các chức năng định tuyến đơn hướng
- Quản lý tác tử
- Thêm lân cận
Chúng ta mô tả các chức năng như sau:
Các chức năng điều khiển:
$node entry trả về điểm đầu vào cho nút, đây là phần tử đầu tiên sẽ xử lý cácgói đến trong nút này
Biến số cụ thể của Node, entry_, lưu tham chiếu phần tử này Với nút đơnhướng, đây là bộ phân lớp địa chỉ nhằm vào bit cao của địa chỉ đích Biến sốclassifier_ chứa tham chiếu tới bộ phân lớp này Tuy nhiên, với các nút đa hướng,điểm vào là biến switch_ nhằm vào bit đầu tiên để quyết hoặc là chuyển gói tới bộphân lớp đơn hướng hoặc là bộ phân lớp đa hướng cho phù hợp
$node_reset sẽ xác lập lại toàn bộ tác tử của nút
Quản lý địa chỉ và số cổng.
Thủ tục $node id trả về số id của nút, số này là tự động tăng và gán tới mỗi núttại lúc tạo nút bởi phương thức của bộ mô phỏng lớp, $ns node Bộ mô phỏng lớp luônlưu trữ một mảng các biến cụ thể, Node_, được đánh chỉ mục bởi id của nút, chứatham chiếu tới nút bằng id này
Thủ tục $node agent (port) trả về việc xử lý của tác tử tại cổng chỉ định, nếukhông có tác tử nào ở số cổng chỉ định là hợp lệ, thủ tục trả về chuỗi rỗng
Thủ tục alloc-port trả về số cổng hợp lệ tiếp theo, nó sử dụng biến np_, để theodõi số cổng chưa được cấp phát kế tiếp
Thủ tục add-route and add-routes, được sử dụng bở định tuyến đơn hướng vàcộng thêm các tuyến vào classifier_, cú pháp sử dụng là $node add-route (destination
Trang 23id) (TclObject) TclObject là đầu vào của dmux_, bộ giải ghép cổng của nút, nếu idđích giống với id của nút này, nó thường là đoạn đầu của liên kết gửi gói cho điểmđích, nhưng cũng có thể là đầu vào cho các bộ phân lớp khác hoặc kiểu của bộ phânlớp.
$node add-routes (destination id) (TclObjects) được sử dụng để thêm vào nhiềutuyến tới cùng một địa chỉ đích mà phải sử dụng đồng thời việc trải độ rộng băngthông theo cách quay tròn để đạt tới điểm đích từ bên này tới bên kia của tất cả cácliên kết một cách tương đương Nó được sử dụng chỉ nếu biến số multiPath_ được gánbằng 1, và chiến lược định tuyến động chi tiết là hiệu quả, cũng như yêu cầu sự sửdụng của bộ phân lớp đa đường
Đối lại với add-routes{} là delete-routes{} Nó lấy id, trong danh sách củaTclObjects và có tham chiếu tới nullagent của bộ mô phỏng Nó xóa TclObjects trongdanh sách từ các tuyến đã cài đặt trong bộ phân lớp đa đường Nếu đầu vào của tuyếntrong bộ phân lớp không trỏ đến bộ phân lớp đa đường, thường lệ chỉ là xóa đầu vào từclassifier_ và cài đặt nullagent vào chỗ đó
Định tuyến động chi tiết cũng sử dụng 2 phương thức cộng thêm vào: thủ tục cụthể init-routing{} thiết lập biến số multiPath_ sẽ tương đương với biến số lớp cùng tên,nó cũng cộng một tham chiếu tới đối tượng bộ điều khiển tuyến của nút trong biến sốnày, rtObject_ Thủ tục rtObject{} trả về xử lý cho đối tượng tuyến của nút,
Cuối cùng, thủ tục intf-changed{} là được gọi lên bởi mã động trên mạng nếumột liên kết rơi vào nút thay đổi trạng thái
Quản lý tác tử
Một tác tử đã cho, thủ tục attach{} sẽ cộng thêm tác tử đó vào danh sáchagents_, gán số cổng của tác tử và đặt địa chỉ nguồn, đặt đích của tác tử cho nó vàcộng vào một con trỏ tới bộ giải ghép cổng của nút (dmux_) cho tác tử tại khe tươngứng trong bộ phân lớp dmux_
Ngược lại, detach{} sẽ xóa tác tử từ agent_, và chỉ đến đích của tác tử và đầuvào nút dmux_ bằng nullagent
Theo dõi nút lân cận (tracking Neighbors) Mỗi một nút giữ một danh sách cácnút lân cận nó trong biến neighbor_ Thủ tục add-neighbor{} cộng thêm một nút lâncận vào danh sách Thủ tục neighbors{} trả về danh sách này
4.3 Cấu hình nút về mặt chức năng
4.3.1 Giao diện cấu hình nút
Giao diện cấu hình nút gồm có 2 phần Phần thứ nhất giải quyết cấu hình nút,phần thứ 2 thực sự tạo ra nút theo kiểu cụ thể Cấu hình nút gồm có định nghĩa các đặctính khác nhau của nút trước khi tạo ra chúng, có thể gồm có kiểu cấu trúc đánh địa chỉtrong việc mô phỏng, định nghĩa các thành phần mạng cho các nút di đông, bật hoặctắt các lựa chọn theo dõi ở mức tác tử, bộ định tuyến hoặc MAC, lựa chọn kiểu các thủtục định tuyến thay đổi cho các nút không dây hoặc định nghĩa mô hình năng lượngcủa chúng Toàn bộ API cấu hình nút như sau:
OPTION_TYPE AVAILABLE OPTION_VALUES
-
-$ns_ node-config -addressingType flat or hierarchical or expanded
-adhocRouting DSDV or DSR or TORA or AODV
-llType LL
-macType Mac/802_11
Trang 24-để thiết lập lại toàn bộ tham số cấu hình nút mang giá trị mặc định của chúng
Cấu hình nút cho nút không dây, di động chạy AODV như là giao thức địnhtuyến adhoc trong cấu trúc mạng phân cấp được chỉ ra dưới đây, chúng ta quyết địnhbật theo dõi chỉ ở mức tác tử và mức bộ định tuyến Hơn nữa chúng ta giả sử rằng sơđồ kiến trúc mạng đã được tạo ra với lệnh "set topo [new Topography]" Lệnh cấu hìnhnút như sau:
$ns_ node-config -addressingType hierarchical
Chú ý rằng lệnh cấu hình có thể ngắt thành những dòng riêng biệt như:
$ns_ node-config -addressingType hier
$ns_ node-config -macTrace ON
Các lựa chọn cần phải thay đổi chỉ thay đổi khi được gọi đến, ví dụ sau khi cấuhình cho các nút di động AODV như trên, chúng ta có thể cấu hình cho các nút trạmgốc AODV theo cách sau:
$ns_ node-config -wiredRouting ON
Trong khi tất cả các đặc tính khác của các nút trạm gốc và các nút di động làgiống nhau, các nút trạm gốc có khả năng định tuyến hữu tuyến, trong khi các nút diđộng thì không có khả năng này Trong trường hợp này chúng ta cần phải thay đổi cấuhình nút chỉ khi nó là bắt buộc
Trang 25Tất cả các nút cụ thể được tạo ra sau lệnh cấu hình nút đã cho có cùng thuộctính trừ khi một phần hoặc tất cả lệnh cấu hình nút được thực hiện với các giá trị thamsố khác nhau Nhưng sau khi tạo ra các nút di động và nút trạm gốc AODV, nếu chúng
ta muốn tạo ra các nút đơn, chúng ta sẽ sử dụng lệnh cấu hình nút sau:
Trong ns, nhiệm vụ này được thực hiện bởi đối tượng classifier đơn, Các đốitượng trong bộ đa phân lớp, xem xét việc phân chia cụ thể của việc chuyển gói tin quanút Một nút trong ns sử dụng nhiều kiểu khác nhau của bộ phân lớp cho nhiều mụcđính khác nhau Trong phần này xem xét một vài đối tượng phân lớp chung hơn, đơngiản hơn trong ns
Chúng ta bắt đầu mô tả lớp cơ sở trong phần này Đoạn tiếp theo sẽ mô tả bộphân lớp địa chỉ (4.4.1), bộ phân lớp đa hướng (4.4.2), bộ phân lớp đa đường (4.4.3)và cuối cùng bộ tái tạo (bản sao)(4.4.5)
Bộ phân lớp cung cấp cách đối xử với một gói tin dựa vào vài điều kiện logicvà lấy tham chiếu tới đối tượng mô phỏng khác dựa trên kết quả tính toán Mỗi bộphân lớp gồm có một bảng các đối tượng mô phỏng được đánh chỉ mục bằng số khe(slot number) Công việc của một bộ phân lớp là xác định số khe kết hợp với gói tinnhận được và chuyển gói tin này tới đối tượng được tham chiếu bởi khe liên quan LớpClassifier cung cấp một lớp cơ sở từ đó các bộ phân lớp khác được dẫn xuất từ lớpnày
class Classifier : public NsObject {
void install(int slot, NsObject*);
void clear(int slot);
virtual int command(int argc, const char*const* argv);
virtual int classify(Packet *const) = 0;
/*
* objects only ever see "packet" events, which come either
Trang 26* from an incoming link or a local agent (i.e., packet source).
if (cl < 0 || cl >= nslot_ || (node = slot_[cl]) == 0) {
Tcl::instance().evalf("%s no-slot %d", name(), cl);
Packet::free(p);
return;
} node->recv(p);
* $classifier installNext $node
int slot = atoi(argv[2]);
if ((slot >= 0) || (slot < nslot_)) { tcl.resultf("%s", slot_[slot]->name());
return TCL_OK;
} tcl.resultf("Classifier: no object at slot %d", slot); return (TCL_ERROR);
} } else if (argc == 4) { /*
* $classifier install $slot $node
*/
if (strcmp(argv[1], "install") == 0) {
int slot = atoi(argv[2]);
NsObject* node = (NsObject*)TclObject::lookup(argv[3]); install(slot, node);
return (TCL_OK);
} }
return (NsObject::command(argc, argv));
}
Trang 27Khi bộ phân lớp recv() nhận một gói tin nó gọi phương thức classify(), khuônmẫu thông thường là phương thức này xác định và trả về chỉ mục của khe trong bảngvề số các khe Nếu chỉ mục là hợp lệ, và chỉ tới TclObject hợp lệ, bộ phân lớp sẽ xử lýgói tin này tới các đối tượng sử dụng phương thức recv() của đối tượng Nếu chỉ mụcnày là không hợp lệ, bộ phân lớp sẽ gọi đến một thủ tục no-slot{} để cố gắng đưa đếnmột bảng phù hợp Tuy vậy trong lớp gốc Classifier::no-slot{} in ra thông báo lỗi vàngắt sự thực hiện
Phương thức command() cung cấp theo các thủ tục tương tự tới bộ thông dịch:clear{(slot)} xóa điểm vào trong một khe riêng biệt
installNext {(object)} cài đặt đối tượng trong khe khả dụng tiếp theo và trả vềsố khe
slot {(index)} trả về đối tượng được lưu trữ trong một khe nào đó
install {(index), (object)} cài đặt một đối tượng nào đó trong một khe
Chú ý rằng các thủ tục tương tự cũng là được nạp chồng bởi một thủ tục cụ thểcó cùng tên mà nó lưu trữ một tham chiếu tới đối tượng được lưu trữ
4.4.1 Bộ phân lớp địa chỉ
Một bộ phân lớp địa chỉ được sử dụng hỗ trợ chuyển gói tin đơn hướng Nó ápdụng một bit trạng thái shift và mask thao tác địa chỉ đích của gói tin đưa ra số khe, sốkhe này được trả về từ phương thức classify() Lớp AddressClassifier được định nghĩanhư sau:
class AddressClassifier : public Classifier {
4.4.2 Bộ phân lớp đa hướng
Bộ phân lớp đa hướng phân loại các gói tin theo cả hai địa chỉ nguồn và đích(nhóm địa chỉ) Nó duy trì bảng ánh xạ cặp địa chỉ nguồn/ nhóm và các số khe Khi màmột gói tin chứa địa chỉ nguồn/nhóm không rõ đến bộ phân lớp, nó gọi đến một thủ tụcOtcl Node::new-group{} để thêm một điểm vào cho bảng này Thủ tục OTcl này cóthể sử dụng phương thức set-hash để thêm 3 phần (nguồn, nhóm, khe) vào bảng của bộphân lớp Bộ phân lớp đa hướng được định nghĩa như sau:
static class MCastClassifierClass : public TclClass {
public:
Trang 28int command(int argc, const char*const* argv);
int classify(Packet *const p);
int findslot();
void set_hash(nsaddr_t src, nsaddr_t dst, int slot);
int hash(nsaddr_t src, nsaddr_t dst) const {
* Didn’t find an entry.
* Call tcl exactly once to install one.
* If tcl doesn’t come through then fail.
} return (p->slot);
}
Lớp MCastClassifier thực thi một bảng băm theo chuỗi và sử dụng hàm băm trong cả nguồn gói tin và địa chỉ đích Hàm băm trả về số khe đánh chỉ mục trong bảng slot_ tại đối tượng ưu tiên Một điểm băm thiếu ngụ ý gói tin được giao tới nhóm không biết rõ trước đó, OTcl sẽ được gọi để xử lý tình huống này Mã OTcl mong muốn chèn một điểm vào thích ứng trong bảng băm
4.4.3 Bộ phân lớp đa đường
Trang 29Đối tượng này được nghĩ ra để hỗ trợ chuyển đa đường tương giá, khi mà nútcó nhiều định tuyến tương giá tới cùng một địa chỉ, và muốn sử dụng tất cả chúng mộtcách đồng thời Đối tượng này không xem xét mọi trường trong gói tin Với mỗi góitin nối tiếp nhau, nó dễ dàng trả về khe được điền kế tiếp theo kiểu quay tròn Địnhnghĩa cho lớp này được chỉ ra như sau:
class MultiPathForwarder : public Classifier {
int ns_; /* next slot to be used Probably a misnomer? */
};
4.4.4 Bộ phân lớp băm
Đối tượng này được sử dụng để phân lớp gói tin như là một thành viên của mộtluồng riêng biệt, bộ phân lớp băm sử dụng bảng băm bên trong để gán các gói tin vàocác luồng Các đối tượng này được sử dụng khi thông tin mức luồng được cần đến (vídụ, trong các nguyên tắc hàng đợi đặc trưng của luồng và sự thu thập thông tin thốngkê), các gói được gán vào luồng dựa trên ID của luồng, địa chỉ đích, địa chỉnguồn/đích hoặc tổ hợp của địa chỉ nguồn/đích cộng với ID của luồng Những trườngđược truy nhập bởi bộ phân lớp băm được giới hạn ở ip header: src(),dst(), flowid() (trong ip.h).
Bộ phân lớp băm được tạo ra với đối số nguyên chỉ định kích thước khởi tạocủa bảng băm Kích cỡ bảng băm hiện tại có thể được sửa chữa sau đó với phươngthức resize (xem bên dưới) Khi tạo ra, biến shift_ và mask_ được khởi tạo với các giátrị của NodeShift và NodeMask hiện tại của bộ mô phỏng Các giá trị này được lấy từđối tượng AddrParams khi bộ phân lớp băm được gọi đến, bộ phân lớp băm sẽ khônghoạt động nếu cấu trúc AddrParams không được khởi tạo, các bộ dựng dưới đây đượcsử dụng cho nhiều bộ phân lớp băm
Trang 30$hashcl set-hash buck src dst fid slot
$hashcl lookup buck src dst fid
$hashcl del-hash src dst fid
$hashcl resize nbuck
Phương thức set-hash()chèn thêm một mục từ mới vào bảng băm với bộ phânlớp băm Đối số buck chỉ rõ số thùng bảng băm được sử dụng cho việc chen thêm mụctừ này Khi số thùng là không rõ ràng, buck có thể được chỉ ra là auto, Đối số src, dstvà fid chỉ rõ nguồn IP, đích, và ID của luồng trở thành phù hợp cho sự phân loại luồng.Các trường không được sử dụng bởi bộ phân lớp riêng biệt là được bỏ qua, đối số slotchỉ thị chỉ mục trong bảng khe ưu tiên trong đối tượng Classifier gốc từ đó bộ phân lớpbăm được dẫn xuất ra Chức năng lookup trả về tên của đối tượng được kết hợp vớibuck/src/dst/fid, đối số buck có thể auto, như là cho set-hash hàm del-hash xóa mục từtheo danh nghĩa từ bảng băm Hiện tại việc này được thực hiện chỉ là đánh dấu mục từnhư là không hoạt động, tuy nhiên nó vẫn ở trong bảng băm với các mục từ khôngdùng đến
Chức năng resize giảm kích thước bảng băm bao gồm số các thùng được chỉ rõbởi đối số nbuck
4.4.5 Bộ tạo bản sao
Bản sao là bộ phân lớp khác với những bộ phân lớp chúng ta đã mô tả trước đó,nó không sử dụng chức năng phân loại, đúng hơn là, nó chỉ sử dụng bộ phân lớp nhưlà một bảng các khe, nó nạp chồng phương thức recv() sinh ra n bản sao của gói tin,mà được đưa đến tất cả n các đối tượng tham chiếu trong bảng Để hỗ trợ chuyển góitin đa hướng, bộ phân lớp nhận gói tin đa hướng từ nguồn S định trước cho nhóm Gtính toán bằng hàm băm h(S,G) đưa ra số khe trong bảng đối tượng của bộ phân lớp.Trong việc phân phối đa hướng, gói tin phải được sao chép một cho mỗi liên kết dẫnđến các nút đã đăng ký trừ đi 1 Sự sản sinh thêm ra bản sao của gói tin được thực hiệnbởi lớp Replicator được định nghĩa trong replicator.cc:
/*
* A replicator is not really a packet classifier but
* we simply find convenience in leveraging its slot table.
* (this object used to implement fan-out on a multicast
* router as well as broadcast LANs)
*/
class Replicator : public Classifier {
public:
Replicator();
void recv(Packet*, Handler* h = 0);
virtual int classify(Packet* const) {};
Trang 31for (int i = 0; i < maxslot_; ++i) { NsObject* o = slot_[i];
if (o != 0) o->recv(p->copy());
4.5 Module định tuyến và sự tổ chức bộ phân lớp
Như đã thấy, một nút ns là sự thu thập cần thiết của các bộ phân lớp, một nútđơn giải nhất (đơn hướng) chứa chỉ một bộ phân lớp địa chỉ và một bộ phân lớp cổngnhư trong hình 5.1 Khi mở rộng chức năng của nút, nhiều bộ phân lớp hơn được htêmvào nút cơ sở, ví dụ nút đa hướng trong hình 5.2 Nhiều khối chức năng hơn đượcthêm vào và mỗi khối đó yêu cầu cho nó một hoặc nhiều bộ phân lớp, nó trở thànhđiều quan trọng cho nút cung cấp một giao diện đồng bộ để tổ chức các bộ phân lớpnày và nối chúng với các khối tính toán tuyến Phương pháp cơ bản xử lý trường hợpnày là thông qua lớp kế thừa, ví dụ, nếu một muốn nút hỗ trợ phân cấp định tuyến, mộtdẫn xuất Node/Hier từ nút cơ sở và xếp chồng các phương thức thiết lập bộ phân lớpvà chèn bộ phân lớp phân cấp Phương thức này hoạt động tốt khi các khối chức năngmới là độc lập và không thể tùy ý pha trộn
Hình 4.3 Tương tác giữa nút, module định tuyến, và định tuyến Đường gạch ngangchỉ ra chi tiết của một module định tuyến
Chỉ một phương pháp giải quyết vấn đề này đó là kết cấu đối tượng Nút cơ sởcần định nghĩa một tập các giao diện cho việc truy nhập và tổ chức bộ phân lớp Cácgiao diện có thể là:
Cho phép các module định tuyến riêng biệt thực thi các bộ phân lớp của chúngvà đưa các bộ phân lớp này vào nút
Cho phép các khối tính toán tuyến đưa các tuyến tới bộ phân lớp trong tất cảcác module định tuyến cần các thông tin này
Cung cấp một điểm quản lý đơn cho các module định tuyến đã có
Trang 32Thêm nữa, chúng ta cũng định nghĩa một giao diện đồng bộ cho các moduleđịnh tuyến kết nối với các giao diện của nút Trong phần này chúng ta sẽ mô tả thiết kếcủa module định tuyến cũng như các giao diện nút tương ứng.
4.5.1 Module định tuyến
Nói chung, mỗi một sự thực thi định tuyến trong ns gồm có 3 khối chức năng:
- Tác tử định tuyến chuyển gói tin định tuyến tới phần tử bên cạnh
- Logic tuyến sử dụng thông tin thu nhặt bởi tác tử định tuyến (hoặc từ cở sở dữliệu kiến trúc mạng chung trong trường hợp định tuyến tĩnh) thực hiện tính toán tuyếnthực tế
- Bộ phân lớp bên trong một Nút Chúng sử dụng bảng định tuyến đã được tínhtoán thực hiện việc chuyển gói tin đi
Chú ý rằng khi thực thi một giao thức định tuyến mới, không cần nhất thiết phảithực thi cả 3 khối trên Ví dụ, khi thực thi một giao thức định tuyến theo trạng thái củakết nối, sự thực thi đơn giản là một tác tử định tuyến theo cách chuyển thông tin vềtrạng thái của kết nối, và một logic tuyến như là thuật toán tìm đường Dijkstra dựa trênkết quả cơ sở dữ liệu kiến trúc mạng Nó có thể sau đó sử dụng cùng bộ phân lớp nhưcác giao thức định tuyến đơn hướng khác
Khi một giao thức định tuyến mới được thực thi gồm có nhiều hơn một khốichức năng, đặc biệt khi nó chứa bộ phân lớp, nó yêu cầu có đối tượng khác, gọi làmodule định tuyến, mà quản lý tất các các khối chức năng và giao diện với nút để tổchức các bộ phân lớp của nó Hình 5.3 chỉ ra sự liên quan về chức năng của các đốitượng này Chú ý rằng các module định tuyến có thể có quan hệ trực tiếp với các khốitính toán tuyến ví dụ logic tuyến và/hoặc tác tử định tuyến Tuy nhiên tính toán tuyếncó thể không cài đặt các tuyến của nó một cách trực tiếp qua module định tuyến, bởi vìcó thể tồn tại những module khác tự học về những nút mới Điều này là không bắtbuộc, tuy nhiên bởi vì có thể rằng sự tính toán một vài tuyến được chỉ rõ tới mộtmodule định tuyến cụ thể nào đó Ví dụ, sự cài đặt nhãn trong module MPLS
Một module định tuyến chứa 3 chức năng chính:
- Module định tuyến khởi tạo sự kết nối của nó tới một nút thông quaregister{}, và hủy bỏ thông qua unregister{} Thông thường, trong register{} Mộtmodule định tuyến nói với nút nó quan tâm đến sự cập nhật tuyến mới biết và sự thamgia của tác tử truyền tải hay không, và tạo ra bộ phân lớp và cài đặt chúng trong nút.trong unregister{}, một module định tuyến thực hiện ngược lại: nó xóa các bộ phânlớp của nó và bỏ móc cập nhật định tuyến trong nút đó
- Nếu một module định tuyến quan tâm đến sự cập nhật tuyến mới biết, nút nàysẽ thông báo cho module qua RtModule::add-route{dst, target} và RtModule::delete-route{dst, nullagent}
- Nếu một module định tuyến quan tâm đến sự gán vào của tác tử truyền tải vàsự tách ra trong một nút, nút này sẽ thông báo cho module quaRtModule::attach{agent, port} và RtModule::detach{agent, nullagent}
Có 2 bước để viết riêng module định tuyến:
- Cần phải khai báo phần C++ trong module định tuyến của bạn, cho nhiềumodule điều này chỉ có ý nghĩa khai báo một phương thức ảo name(), nó trả về bộ môtả chuỗi của module Tuy nhiên, bạn tự do thực hiện nhiều chức năng như bạn muốntrong C++, nếu cần thiết bạn có thể sau đó chuyển về mặt chức năng từ OTcl vào C++cho có hiệu quả hơn
Trang 33- Bạn cần nhìn các giao diện phía trên được thực thi trong module định tuyến cơ
sở và quyết định cái nào bạn sẽ kế thừa, cái nào bạn sẽ viết chồng và đưa chúng vàocác giao diện OTcl của module của bạn
Có một vài module định tuyến dẫn xuất, nó được dùng như là các mẫu chomodule của bạn, có 6 module định tuyến được thực thi trong ns:
RtModule/Base Giao diện cho các giao thức định tuyến đơn hướng, cung
cấp chức năng cơ sở cho thêm/xóa tuyến và gán/ tách cáctác tử
RtModule/Mcast Giao diện cho các giao thức định tuyến đa hướng, Nó chỉ
có mục đính là thiết lập các bộ phân lớp đa hướng Cácchức năng đa hướng khác được thực thi như là các thủtục cụ thể của nút
RtModule/Hier Định tuyến phân cấp, nó là bộ bọc cho quản lý các bộ
phân lớp phân cấp và sự cài đặt tuyến có thể được kếthợp với các giao thức định tuyến khác, như định tuyếnadhoc
RtModule/Manual Định tuyến nhân công
RtModule/VC Sử dụng các bộ phân lớp ảo
RtModule/MPLS Thực thi các chức năng MPLS
Node::enable-module{[name]} Nếu module RtModule/[name] tồn tạithì thủ tục này đưa [name] vào trong danh sách module
Node::disable-module{[name]} Nếu module [name] trong danhsách, xóa nó khỏi danh sách đó
Khi một nút được tạo ra, nó đi qua danh sách module của lớp Nút, tạo tất cả cácmodule chứa trong danh sách và đăng ký những module này với nút đó
Sau khi nút được tạo ra, chúng có thể sử dụng những thủ tục dưới đây để liệt kênhững module đã đăng ký với nút đó, hoặc gọi đến xử lý module:
Node::list-modules{} trả về danh sách điều khiển của tất cả các moduleđã được đăng ký
Node::get-module{[name]} trả về điều khiển của module đã đăng kývới tên module đã cho Chú ý rằng tất cả các module định tuyến chỉ có một đăng kýđơn trong tất cả các nút
Cho phép các module định tuyến đăng ký sự cập nhật tuyến chúng quan tâm,đối tượng nút cung cấp các thủ tục dưới đây:
Trang 34Node::route-notify{module} thêm module vào danh sách thông báocập nhật tuyến.
Node::unreg-route-notify{module} xóa module khỏi danh sáchthông báo cập nhật tuyến
Tương tự, thủ tục dưới đây móc vào sự tham gia của các tác tử truyền tải
Node::port-notify{module} thêm module vào danh sách thông báotham gia của tác tử
Node::unreg-port-notify{module} bỏ module ra khỏi danh sáchthông báo sự tham gia của tác tử
Nút cung cấp các thủ tục dưới đây để điều khiển bộ phân lớp địa chỉ và cổng:Node::insert-entry{module, clsfr, hook}
Chèn bộ phân lớp clsfr vào điểm mục của nút Nó cũng được kết hợp với bộphân lớp mới này với module để mà nếu bộ phân lớp này sau đó bị loại bỏ thì modulecũng sẽ không được đăng ký nữa Nếu hook được chỉ rõ như là một số, bộ phân lớp đãcó sẽ chèn vào khe hook của bộ phân lớp mới Theo cách này, có thể thiết lập một
"dãy" các bộ phân lớp, xem hình 5.2 là một ví dụ Chú ý: clsfr không cần phải là mộtbộ phân lớp Trong vài trường hợp, có thể muốn đưa vào một tác tử, hoặc nhiều lớpdẫn xuất từ Đầu nối, tại điểm mục của một nút Trong trường hợp như vậy, cung cấpmột cách đơn giản target cho tham số hook
- Node::install-entry{module, clsfr, hook}
khác với Node::insert-entry{module, clsfr, hook}là nó xóa bộ phân lớpđã có tại điểm mục của nút đó, bỏ đăng ký tất cả kết hợp module định tuyến, và cài đặtbộ phân lớp mới tại điểm này Nếu hook được chuo, và bộ phân lớp cũ được kết nốiđến một chuỗi bộ phân lớp, nó sẽ kết nối chuỗi này vào khe hook của bộ phân lớp mới.Như trên, nếu hook tương đương target, clsfr sẽ được xem như một đối tượng dẫn xuấttừ Đầu nối thay vì một bộ phân lớp
- Node::install-demux{demux, port} đặt bộ phân lớp demux đã cho nhưlà bộ giải ghép mặc định Nếu port đã cho, nó cắm bộ giải ghép đã có này vào khe portcủa một bộ mới Chú ý rằng trong trường hợp này hay trường hợp kia nó không xóa bộgiải ghép đã có
4.6 Xem qua một vài lệnh
$ns_ node [<hier_addr>]
Lệnh này tạo ra và trả về một nút Nếu <hier_addr> đã cho, gán địa chỉ nútthành <hier_addr> Chú ý rằng <hier_addr> chỉ được sử dụng khi cho phép đánh địachỉ phân cấp thông qua hoặc set-address-format
hierarchical{}
$ns_ node-config -<config-parameter> <optional-val>
Lệnh này được sử dụng để cấu hình các nút Các tham số cấu hình khác nhau làkiểu đánh địa chỉ, kiểu của các thành phần ngăn xếp mạng, dù việc giám sát được bậtlên hay không, cờ mobileIP được bật hay không, mô hình năng lượng sẽ được sử dụnghay không, Lựa chọn - reset có thể được dùng để thiết lập cấu hình nút về trạng tháimặc định Giá trị mặc định được thiết lập cho cấu hình nút nếu không có giá trị nàođược chỉ rõ
$node id
Trang 35trả về số id của nút.
$node node-addr
trả về địa chỉ của một nút Trong trường hợp đánh địa chỉ phẳng địa chỉ nútgiống với node-id Trong trường hợp đánh địa chỉ phân cấp, địa chỉ nút theo khuôndạng một chuỗi (ví dụ "1.4.3") được trả về
$node reset
Thiết lập lại toàn bộ các tác tử gán kèm cùng nút
$node agent <port_num>
Trả về điều khiển của tác tử tại cổng nào đó Nếu không có tác tử nào được tìmthấy tại cổng đã cho, một chuỗi rỗng được trả về
$node entry
Trả về điểm vào của nút, Đây là đối tượng đầu tiên điều khiển nhận gói tin tạinút này
$node attach <agent> <optional:port_num>
Gán <agent> vào nút, trong trường hợp nếu không chỉ rõ số cổng, nút sẽ định vịsố cổng và đóng tác tử vào cổng này Như thế một tác tử được gán vào, nó nhận cácgói tin định trước cho cổng và nút này
$node detach <agent> <null_agent>
Ngược với attach được mô tả trên, nó gỡ bỏ tác tử từ nút này và cài đặt một táctử rỗng vào cổng mà tác tử này được gán đến, kết thúc xử lý các gói tin chuyển tiếp tớitác tử đã gỡ bỏ Những gói tin đang trên đường đến sau đó đưa vào tác tử rỗng
$node neighbors
trả về danh sách của các nút xung quanh
$node add-neighbor <neighbor_node>
Đây là lệnh thêm <neighbor_node> vào danh sách các nút xung quanhduy trì bởi nút
Dưới đây là danh sách các phương thức bên trong nút:
$node add-route <destination_id> <target>
Lệnh này sử dụng trong định tuyến đơn hướng ở bộ phân lớp target là một đốitượng Tcl, nó có thể là điểm mục của dmux_(bộ giải ghép cổng trong nút) trongtrường hợp <destination_id> là giống với node-id Mặt khác nó là đầu của liên kết đến,nó cũng là điểm mục cho các bộ phân lớp khác
$node alloc-port <null_agent>
trả về số cổng khả dụng tiếp theo
những phương thức khác có thể thấy trong node.tcl and
~ns/tcl/lib/ns-mobilenode.tcl
Trang 365 Các liên kết: Các liên kết đơn
Đây là vấn đề thứ hai trong việc xác định cấu trúc mạng Mục 5 chúng ta đã môtả cách tạo ra một node trong cấu trúc ns, mục này chúng ta sẽ mô tả cách tạo ra cácliên kết để liên kết các node và hoàn thiện cấu trúc mạng trong ns Ở đây chúng ta sẽhạn chế chỉ mô tả liên kết điểm điểm đơn ns hỗ trợ nhiều môi trường khác nhau, baogồm mô phỏng đa truy nhập LAN sử dụng các liên kết đơn hình lưới, các mô phỏngthực tế của môi trường truyền thông không dây và truyền thông quảng bá khác Chúngsẽ được mô tả trong các mục riêng biệt Liên kết CBQlink được hình thành từ các liênkết đơn và là dạng liên kết phức tạp hơn nhiều và cũng không được mô tả trong mụcnày
Chúng ta bắt đầu bằng cách mô tả các lệnh để thiết lập một liên kết Với nodebao gồm các bộ phân loại, một liên kết đơn được dựng lên từ một chuỗi các bộconnector Chúng ta sẽ mô tả một cách sơ lược các connector trong một liên kết đơn,sau đó sẽ mô tả các thủ tục hoạt động dựa trên các thành phần khác nhau của cácconnector, đối tượng connector, bao gồm cả mô tả tóm tắt về các connector liên kếtthông dụng
Lớp Link là lớp đứng độc lập trong OTcl, nó cung cấp một vài nguyên tố banđầu đơn giản Lớp SimpleLink cho phép nối 2 node bằng một liên kết điểm - điểm nscung cấp thủ tục simplex-link{} để tạo nên liên kết đơn hướng từ một node này tớimột node khác Liên kết này nằm trong lớp SimpleLink Dòng lệnh dưới đây mô tả cúpháp của một liên kết một chiều:
set ns [new Simulator]
$ns simplex-link <node0> <node1> < bandwidth> <delay>
<queue_type>
Lệnh để tạo liên kết từ <node0> đến <node1>, với đặc tính <bandwidth> và
<delay> cụ thể Liên kết sử dụng một loại hàng đợi <queue_type> Thủ tục này cũngthêm vào liên kết bộ kiểm tra TTL 5 biến số định nghĩa cho một liên kết bao gồm:
head_ điểm bắt đầu liên kết, trỏ đến đối tượng đầu tiên trong liên kết
queue_ tham chiếu tới phần tử hàng đợi chính của liên kết Các liên kếtđơn thường có một hàng đợi trên liên kết Các loại liên kết phức tạp hơn có thể cónhiều phần tử hàng đợi trên liên kết
link_ tham chiếu đến phần tử thực sự hình thành nên liên kết, xét trên các khíacạnh của các đặc tính trễ và băng thông của liên kết
ttl_ tham chiếu đến phần tử điều khiển ttl trong tất cả mỗi gói
drophead_ tham chiếu đến một đối tượng đứng đầu hàng đợi của các phần tửthực hiện xử lý loại bỏ liên kết
Hình 6.1: Các thành phần cấu trúc của tuyến liên kết một hướng:
Thêm vào đó, nếu nếu biến $traceAllFile của bộ mô phỏng được định nghĩa, thủtục sẽ đưa thêm phần tử tìm dấu thực hiện việc tìm dấu vết khi một gói được xếp vàohàng đợi và loại bỏ khỏi hàng đợi từ queue_ Hơn nữa, việc tìm vết đặt một phần tửtìm vết sau drophead_ Các biến sau cho các cách tìm vết trong các phần tử tìm vết:
enqT_ Tham chiếu đến phần tử tìm vết các gói đi vào queue_
deqT_ Tham chiếu đến phần tử tìm vết các gói rời khỏi queue_
drpT_ Tham chiếu đến phần tử tìm vết các gói được loại bỏ khỏi queue_
rcvT_ Thám chiếu đến phần tử tìm vết các gói được nhận bởi node tiếp theo
Trang 37Lưu ý rằng, nếu người sử dụng cho phép tìm dấu nhiều lần trên liên kết, cácbiến này sẽ chỉ lưu giữ một tham chiếu đến phần tử cuối cùng được chèn vào.
Các cấu hình khác có thể đưa thêm các thành phần vào một liên kết đơn là cácgiao tiếp mạng (được sử dụng trong định tuyến đa đường), các mô hình tuyến liên kếtđộng, lần vết và giám sát
Thủ tục duplex-link{} tạo ra liên kết hai chiều từ hai liên kết một chiều
5.1 Thủ tục cho Links và SimpleLinks
Các thủ tục Link: Lớp Link được thực hiện hoàn toàn trong OTcl LớpSimpleLink trong OTcl sử dụng lớp C++ LinkDelay để mô phỏng trễ chuyển phát gói.Các thủ tục trong lớp Link là:
head{} trả về kênh điều khiển cho head_
queue{} trả về kênh điều khiển cho queue_
link{} trả kênh điều khiển cho phần tử trễ, link_
up{} thiết lập trạng thái “up” trong phần tử dynamics_ Đồng thời ghi lại dấuvết vào mỗi file riêng biệt thông qua thủ tục trace-dynamics{}
down{} Giống như up{}, thiết lập trạng thái “down” trong phần tửdynamics_ Đồng thời ghi dấu vết cho mỗi file riêng biệt thông qua thủ tục trace-dynamics{}
up?{} trả về trạng thái của liên kết Trạng thái của liên kết là “up” hoặc
“down”, trạng thái là “up” nếu tuyến liên kết động không được kích hoạt
all-connectors{} Áp dụng hoạt động cụ thể cho tất cả các connector trên liênkết Ví dụ về áp dụng là all-connectors reset
cost{} Thiết lập chi phí cho tuyến kết nối với một giá trị nhất định.cost?{} Trả về giá trị chi phí của tuyến liên kết Mặc định giá trị chi phícủa tuyến liên kết là 1 nếu không có giá trị cụ thể được thiết lập trước đó
Các thủ tục SimpleLink Lớp SimpleLink của Otcl thực hiện một liên kết đơnđiểm-điểm với hàng đợi và trễ có liên quan Lớp này được thừa kế từ lớp cơ sở Linkcủa Otcl như sau:
Class SimpleLink -superclass Link
SimpleLink instproc init { src dst bw delay q { lltype "DelayLink" } } {
$self next $src $dst
$self instvar link_ queue_ head_ toNode_ ttl_
set queue_ $q
set link_ [new Delay/Link]
$link_ set bandwidth_ $bw
$link_ set delay_ $delay
$queue_ target $link_
$link_ target [$toNode_ entry]
# XXX
# put the ttl checker after the delay
# so we don’t have to worry about accounting
# for ttl-drops within the trace and/or monitor
# fabric
#
Trang 38set ttl_ [new TTLChecker]
$ttl_ target [$link_ target]
$link_ target $ttl_
}
Chú ý rằng khi một đối tượng SimpleLink được tạo lập, các đối tượngDelay/Link và TTLChecker mới cũng được tạo lập Cũng cần phải lưu ý rằng đốitượng Queue phải đã được tạo lập
Có 2 phương pháp bổ sung khác được thực hiện (trong OTcl) như là một phầncủa lớp SimpleLink: trace và init-monitor
networkinterface: dán nhãn các gói với việc định dạng giao tiếp tới, nó được sửdụng trong một số giao thức định tuyến nhiều đường Lớp có thể thay đổi “mô phỏngsố đầu giao tiếp -1” chỉ ra rằng ns chèn giao tiếp này, và sau đó nó được chèn phần cònlại trong luyến liên kết đơn
Đối tượng DynaLink: tạo cổng lưu lượng phụ thuộc việc liên kết là up haydown Chúng ta mong muốn đặt đối tượng này ở đầu của liên kết và được chèn vàoliên kết trước khi bắt đầu mô phỏng Biến status_ điều khiển trạng thái của liên kết là
up hoặc down Đối tượng DelayLink: Lập mô hình cho các đặc tính băng thông và trễcủa tuyến liên kết Nếu tuyến liên kết không phải là liên kết động, thì đối tượng này sẽđịnh trình một cách đơn giản các sự kiện nhận gói cho đối tượng luồng xuống với mỗigói nó nhận được ở thới điểm tương ứng của gói đó Tuy nhiên, nếu là liên kết độngthì đối tượng xếp các gói vào hàng đợi bên trong nó và tự định trình một sự kiện nhậngói cho gói phải được phát đi kế tiếp Bởi vậy nếu tuyến liên kết có trạng thái down tạimột số điểm, phương thức reset() của đối tượng được thực hiện, và đối tượng sẽ loạibỏ tất cả các gói đang truyền dẫn trong lúc tuyến liên kết có sự cố
Các Queue: lập mô hình của bộ đệm đầu ra được gắn vào liên kết trong một bộđịnh tuyến “thực” trong mạng Trong ns, chúng ta gắn vào và được xem như một phầncủa liên kết
TTLChecker: sẽ giảm giá trị của ttl trong mỗi gói mà nó nhận được Nếu ttl sauđó có giá trị dương, gói sẽ được chuyển tiếp tới phần tử tiếp theo trên liên kết Trongcác liên kết đơn, TTLChecker được tự động thêm vào và vị trí của chúng là phần tửcuối cùng trong tuyến liên kết, giữa phần tử trễ và điểm vào cho node kế tiếp
5.3 Phân cấp đối tượng.
Lớp cơ sở được sử dụng để thể hiện các tuyến liên kết được gọi là Link Cácphương thức của lớp này được liệt kê trong phần kế tiếp Các đối tượng liên kết khácđược dẫn xuất từ lớp cơ sở bao gồm:
- Đối tượng SimpleLink: được sử dụng để thể hiện một tuyến liên kết mộtchiều Không có biến trạng thái hoặc tham số cấu hình nào có liên quan đến đối tượngnày Các phương thức cho lớp này là:
$simplelink enable-mcast <src> <dst>