1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

77 895 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 77
Dung lượng 4,06 MB

Nội dung

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 1

1.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 2

4.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 3

9.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 4

1 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 5

tạ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 6

Bộ đị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 7

Hì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 8

tiế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 9

Hì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 10

quan 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 11

2 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 12

2.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 13

Khi 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 14

2.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 15

trong 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 16

Cá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 17

Tá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 18

3.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 19

3.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 21

Hì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 22

Hì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 23

id) (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 25

Tấ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 27

Khi 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 28

int 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 31

for (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 32

Thê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 34

Node::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 35

trả 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 36

5 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 37

Lư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 38

set 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>

Ngày đăng: 24/02/2016, 11:12

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w