Tải bản đầy đủ (.doc) (70 trang)

nghiên cứu chương trình mô phỏng mạng ns và các công cụ hỗ trợ, và cơ sở để áp dụng các bài toán ứng dụng trên ns để đánh giá tính khả thi và tối ưu của chúng trên mạng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (531.11 KB, 70 trang )

Cơ sở mạng thông tin – K4X
MỤC LỤC
Phần I 4
Chương trình mô phỏng mạng 4
Network Simulator (NS-2) 4
1/ :Tại sao phải cần chương trình mô phỏng mạng : 4
2.Phần mềm mô phỏng mạng Network Simulator : (NS) 5
2.1. Tổng quan về NS : 5
2.2. Làm việc với NS : 8
Ngôn ngữ Otcl : 8
Khái niệm tổng quan : 9
Lớp Tcl 9
Yêu cầu các thủ tục OTcl 9
Truyền kết quả tới/từ trình thông dịch 10
Lớp TclObject 10
Tạo và xoá đối tượng TclObject 10
Liên kết biến 11
Các phương thức command: định nghĩa và gọi 11
2.3 Các mô phỏng cơ sở 12
2.3.1 Lớp mô phỏng (class Simulator) 12
2.3.2 Node và truyền tải gói tin (packet forwarding) 13
2.3.3 Các liên kết : 18
2.3.4 Quản lý queue và lập lịch gói 21
Phần II.Công cụ hình ảnh hoá mô phỏng : NAM 31
1.Giới thiệu chung về NAM : 31
1.1. Tổng quan 31
1.2.Các lựa chọn dòng lệnh của NAM: 33
1.3. Giao diện người sử dụng: 33
1.3. Các câu lệnh bàn phím: 35
1.4. Tạo ra các hoạt động bên ngoài từ Nam : 35
1.5. Network Layout: 36


1.6. Các đối tượng hoạt động: 36
2. NAM TRACE 37
2.1.Định dạng Nam Trace: 37
2.2. Các sự kiện khởi tạo: 38
2.3. Nodes: 39
2.4. Links : 39
2.5. Queues: 40
2.6. Các gói tin: (Packets) 40
2.7. Đánh dấu Node : 41
2.8. Tìm vết Agent: (Agent Tracing ) 41
2.9. Tìm vết biến (Variable Tracing): 41
Phần III : Các bài toán mô phỏng 42
1. Mô phỏng các gói tin UDP/TCP 42
1.1 UDP Agent 42
Cyber Pro !!! :))
1
Cơ sở mạng thông tin – K4X
1.2. TCP Agents 43
2.Unicast Routing 50
2.1 The Interface to the Simulation Operator (The API) 50
2.2 Các cơ chế cấu hình khác cho Specialised Routing 51
2.3 Các tham số cấu hình đặc tả giao thức 52
2.4 Đặc tính và kiến trúc của Routing 53
2.5 Protocol Internals 57
2.6 Các đối tượng Unicast routing 58
2.7 Tỏng quan các lệnh 58
3.Multicast Routing 59
3.1 Multicast API 59
3.2 Internals of Multicast Routing 62
Bảng tra cứu định dạng File Nam trace: 68

Lời mở đầu
Cyber Pro !!! :))
2
Cơ sở mạng thông tin – K4X
Trong những năm gần đây mạng máy tính phát triển ngày càng mạnh mẽ tạo
nên một bước ngoặt quan trọng trong công nghệ thông tin. Mạng máy tính ngày
nay có mặt trong rất nhiều các hoạt động trong đời sống. Các công nghệ, các kỹ
thuật phục vụ cho môi trường mạng đã được xây dựng nhiều, và đang còn được
tiếp tục phát triển, cải tiến.
Muốn có một mạng thật để thử nghiệm các công nghệ mới thì thật tốn kém,
không phải cá nhân, tổ chức nào cũng có thể đáp ứng được.Hơn nữa các mạng cục
bộ này không những phải đảm bảo các tính năng của một mạng thông thường mà
còn phải thực hiện được những bài toán thử nghiệm cũng như giúp cho sinh viên
thấy được tính khả thi của chúng đối với các bài toán mới.Cách tốt nhất để giải
quyết những yêu cầu đặt ra đó là dùng một môi trường mạng ảo để xây dựng và thử
nghiệm các công nghệ mới. Giả lập mạng (network simulator) ra đời với mục đích
đó,trong đó tiêu biểu là chương trình NS, có thể dùng để thực hiện các kịch bản
mạng như áp dụng các mô hình UDP/TCP, các bài toán routing vào các tôpô thích
hợp.
Do đó đề tài thực tập tốt nghiệp của chúng em là : “Nghiên cứu chương trình
mô phỏng mạng NS và các công cụ hỗ trợ, và cơ sở để áp dụng các bài toán ứng
dụng trên NS để đánh giá tính khả thi và tối ưu của chúng trên mạng”.
Chúng em xin chân thành cảm ơn thầy giáo TS.Đặng Văn Chuyết, TS
Nguyễn Linh Giang và thầy Tạ Hải Tùng đã tận tình hướng dẫn chúng em định
hướng, thực hiện đề tài này .
Cyber Pro !!! :))
3
Cơ sở mạng thông tin – K4X
Phần I
Chương trình mô phỏng mạng

Network Simulator (NS-2)
1/ :Tại sao phải cần chương trình mô phỏng mạng :
Tốc độ phát triển của Internet đang phát triển rất nhanh , sự ra đời của các giao thức mới
và các thuật toán để phục vụ các đòi hỏi về bảo mật ,truyền thông đa phương tiện, mạng di
động ,các chính sách quản lý và sự hõ trợ của chất lượng dịch vụ (QoS) . Lý thuyết và ước lượng
của các công cụ này đòi hỏi phải trả lời rất nhiều các câu hỏi .
Bỏ qua những giá trị của chúng , các mô phỏng thông dụng, các thí điểm qui mô lớn và
các các đánh giá thí nghiệm qui mô nhỏ đều có mặt hạn chế của nó .Bởi vì sử dụng các mã
thực(real code) nên các cuộc thí nghiệm thực hiện trong các khu thí điểm hay các phòng thí
nghiệm tự động nắm bắt các nội dung ,chi tiết quan trọng có khi đã bị bỏ qua trong khi mô
phỏng . Tuy nhiên để xây dựng các khu thí điểm hay các phòng thí nghiệm quả thật rất tốn kém ,
tái cơ cấu và phân bổ chúng rất khó . Chúng cũng không được linh động lắm .Hơn nữa , việc mô
phỏng một vài hiện tượng của hoạt động mạng như nhiễu sóng vô tuyến có thể rất khó khăn ,
phức tạp trong việc so sánh hay ước lượng các mô hình giao thức .
Thiết kế giao thức bằng mô phỏng thường bắt đầu với các mô phỏng các chi tiết riêng lẻ
của giao thức của một nhà nghiên cứu độc lập thông qua các Topology cỡ nhỏ và các giả định
đơn giản thường là ở dạng tĩnh . Các chi phí ban đầu cao đã ngăn cản một nhóm độc lập có được
các điều kiện cần thiết để tạo ra một môi trường mô phỏng mạng hoàn thiện .Chính khó khăn này
là nguyên nhân dẫn đến các mô phỏng được xây dựng bởi các nhóm khác nhau không có được
chất lượng như mong muốn .
Công trình nghiên cứu về thí điểm mạng ảo ( Virtual Internerwork Testbed _ VINT) đã
cung cấp các công cụ mô phỏng tiên tiến cho các nhà nghiên cứu mạng sử dụng để thiết kế và
triển khai các giao thức Internet trên diện rộng . Công cụ tiêu biểu của VINT là : NS ( Network
Simulator ).
VINT cung cấp các điều kiện thực hành tiên tiến giúp mở rộng điều kiện cho các nhà
nghiên cứu trong việc ước lượng các giao thức :
1. Tính trừu tượng : Sự thay đổi trong việc mô phỏng dạng hạt cho phép các một mô
phỏng đơn có thể điều chỉnh khớp các chi tiết và các mô phỏng ở mức cao . Các nhà nghiên cứu
nghiên cứu giao thức mạng tại nhiều mức . Trải rộng từ các phần riêng biệt của một giao thức độc
lập đến sự tập hợp của các luồng đa dữ liệu và sự tương tác giữa các giao thức với nhau . Các cơ

chế trừu tượng hoá trong NS cho phép các nhà nghiên cứu kiểm tra được các giao thức mà không
cần có sự thay đổi trong mô phỏng và công nhận kết sự trừu tượng hoá thông qua việc so sánh
nhiều chi tiết và trừu tượng hoá các kết quả .
2. Tính mô phỏng : Hầu hết những thí nghiệm mô phỏng đều bị giới hạn trong một thế
giới mô phỏng nên chỉ có sự xuất hiện của các giao thức và các thuật toán trong chương trình mô
phỏng . Trái ngược với điều này , sự mô phỏng ở đây cho phép chạy chương trình mô phỏng có
sự tương tác giữa các nốt mạng với nhau .
3. Thực hiện các kịch bản : Việc kiểm tra các giao thức dưới các điều kiện mạng thích
hợp là vấn đề then chốt để giành được kết quả tốt . Chương trình sẽ tự động tạo ra các mẫu lưu
thông phức tạp , các Topology và các sự kiện động có thể giúp tạo ra các kịch bản .
Cyber Pro !!! :))
4
Cơ sở mạng thông tin – K4X
4. Tính trực quan : Các nhà nghiên cứu cần các công cụ có thể giúp họ hiểu được các hoạt
động phức tạp trong mạng . Tính trực quan sử dụng công cụ có hoạt ảnh : Nam cung cấp một sự
thể hiện động cho phép các nhà nghiên cứu phát triển tốt hơn khả năng trực giác đối với các giao
thức và giúp cho việc dò sửa lỗi trong các giao thức
5. Khả năng mở rộng : Chương trình mô phỏng phải dễ mở rộng nếu nó cần thiết phải
thêm vào các tác vụ cần thiết .
2.Phần mềm mô phỏng mạng Network Simulator : (NS)
2.1. Tổng quan về NS :
NS là hệ thống mô phỏng mạng, đặc biệt là các giao thức điều khiển hoạt động của mạng,
phát triển tại đại học Berkeley và viện công nghệ thông tin ISI (Information Science Institute), có
khả năng mô phỏng nhiều kiểu mạng IP khác nhau. Nó mô phỏng việc thực hiện các giao thức
mạng như TCP, UDP, các nguồn dữ liệu FTP, Telnet, Web, CBR và VBR, có cơ chế quản lí hàng
đợi router như DropTail, RED và CBR, với các giải thuật chọn đường như Dijkstra… ns cũng bổ
xung phần multicasting với một số giao thức tầng MAC để hỗ trợ việc mô phỏng mạng LAN.
Phiên bản hiện nay của ns (ver 2) được viết bằng C++ và Otcl (Otcl: là mở rộng của ngôn ngữ
Tcl có thêm phần hướng đối tượng, tương tự như C và C++). Dưới góc độ người dùng, một hệ
thống mô phỏng có sơ đồ như sau:

Sơ đồ 1: Mô hình ns đơn giản
Từ mô hình có thể thấy, ns sử dụng ngôn ngữ Otcl với thư viện bao gồm các đối tượng
Event Scheduler, các đối tượng Network Component, và các module Plumbing giúp cho việc cài
đặt mạng. Nói cách khác, để sử dụng ns, ta phải lập trình trên ngôn ngữ Otcl. Để cài đặt và chạy
chương trình mô phỏng mạng bằng ns, ta phải viết script trên ngôn ngữ Otcl, lập lịch cho các sự
kiện, thiết lập cấu hình mạng (topo mạng) bằng cách sử dụng các đối tượng Network Component,
triệu gọi các hàm thư viện, báo cho các nguồn dữ liệu biết khi nào thì bắt đầu và kết thúc việc
truyền gói tin trên mạng. Khi muốn tạo một đối tượng mạng mới, có thể viết mới một đối tượng
hoặc bằng cách liên kết các đối tượng mạng đã có sẵn trong thư viện. Việc gắn kết đối tượng tạo
nên đối tượng mới chính là điểm mạnh của ns.
Một bộ phận quan trọng khác của ns bên cạnh network object là event scheduler. Một sự
kiện trong ns là một ID của gói tin được lên lịch và một con trỏ trỏ tới đối tượng xử lí sự kiện đó.
Một event scheduler theo dõi lịch của tất cả các sự kiện và triệu gọi đối tượng thực hiện sự kiện
đó vào thời điểm thích hợp. Các đối tượng trong mạng trao đổi thông tin với nhau bằng cách gửi
Cyber Pro !!! :))
5
Cơ sở mạng thông tin – K4X
và nhận các gói tin. Với mỗi gói tin, các đối tượng đều phải mất một khoảng thời gian để xử lí
gói tin (độ trễ), các đối tựơng tạo độ trễ bằng cách sử dụng event scheduler. Một dạng thể hiện
khác của event scheduler là timer. Ví dụ TCP cần timer để theo dõi việc truyền gói tin nhằm phục
vụ cho việc truyền lại trong trường hợp mất gói tin (gói tin gửi lại vẫn có cùng số hiệu với gói tin
trước nhưng sẽ khác ở ns packet ID). Timer đo thời gian gắn với gói tin và thực hiện hành động
liên quan tới gói tin khi đến thời điểm thích hợp, và không mô phỏng độ trễ.
ns sử dụng cả ngôn ngữ C++ và ngôn ngữ Otcl. Ns hỗ trợ cấu trúc lớp kiểu phân cấp trong
C++ (được gọi là cấu trúc lớp biên dịch), và một cấu trúc lớp tương tự trong ngôn ngữ Otcl (gọi
là cấu trúc lớp thông dịch). Hai cấu trúc lớp phân cấp này có quan hệ chặt chẽ với nhau, dưới góc
độ người sử dụng (không phải người lập trình phát triển ns), có tương ứng 1-1 giữa lớp trong cấu
trúc lớp biên dịch và lớp trong cấu trúc lớp thông dịch Sơ đồ sau là ví dụ về sự phân cấp trong
C++ và Otcl.
Sơ đồ 2: Tương ứng C++ và Otcl

Lý do để ns sử dụng hai ngôn ngữ lập trình là do hệ mô phỏng phải thực hiện hai dạng
yêu cầu xử lý khác nhau. Một mặt, việc mô phỏng chi tiết các giao thức đòi hỏi một ngôn ngữ lập
trình hệ thống có khả năng thao tác hiệu quả với các byte, packet header, và thực hiện những giải
thuật với tập dữ liệu lớn. Với những công việc dạng này, tốc độ của thực hiện khi chạy rất quan
trọng, và thời gian xử lý quay vòng (chạy mô phỏng, tìm lỗi, gỡ lỗi, dịch lại, chạy lại) kém quan
trọng hơn. Mặt khác, khi nghiên cứu mạng, rất cần nhanh chóng thay đổi tham số hay cấu hình,
hoặc đưa ra nhiều kịch bản hoạt động khác nhau. Trong những trường hợp như vậy, thời gian
quay vòng (thay đổi mô hình và chạy lại) quan trọng hơn thời gian cấu hình ban đầu và thời gian
chạy. ns thoả mãn cả hai yêu cầu này với C++ và Otcl. C++ chạy nhanh nhưng lại chậm khi cần
có thay đổi, rất phù hợp cho việc triển khai chi tiết các giao thức. Otcl chạy chậm hơn nhiều, song
lại có khả năng thay đổi rất nhanh (và có tính tương tác tốt), có thể thoả mãn tốt nhu cầu cấu hình
hệ thống mô phỏng. ns sử dụng tclcl (tcl – c linkage) như một lớp keo gắn kết các đối tượng và
biến trong hai ngôn ngữ.
Mỗi ngôn ngữ được sử dụng với mục đích riêng. Otcl có thể được sử dụng:
- Trong việc cấu hình, cài đặt và các công việc thực hiện “một lần”
- Chỉnh sửa các đối tượng C++ đã có sẵn
Và sử dụng C++ cho:
- Khi làm các công việc đòi hỏi xử lý từng gói tin của luồng dữ liệu
- Khi phải thay đổi các hành vi của các lớp C++ đã tồn tại
Có thể hình dung tổ chức của ns qua sơ đồ sau:
Cyber Pro !!! :))
6
Cơ sở mạng thông tin – K4X
Sơ đồ 3: Kiến trúc của ns
Sơ đồ Kiến trúc của ns thể hiện kiến trúc ns, nói chung có thể coi người dùng như đang
đứng ở góc dưới bên trái, thiết kế và chạy hệ mô phỏng bằng ngôn ngữ Tcl và sử dụng các đối
tượng Otcl trong thư viện. Event Scheduler và hầu hết các đối tượng Network Component đều
được viết bằng C++, và có thể triệu gọi từ Otcl thông qua giao tiếp tclcl, cả hệ thống kết hợp lại
thành ns.
Sơ đồ Mô hình ns đơn giản cũng chỉ ra , khi kết thúc quá trình mô phỏng, ns có thể sinh

ra một hay nhiều text file chứa số liệu chi tiết phục vụ cho việc phân tích quá trình mô phỏng,
hoặc cũng có thể là đầu vào cho hệ mô phỏng bằng đồ hoạ (Network Animator : NAM).
Hình dươi đây sẽ mô tả sự hoạt động của NS thông cua 3 mức , như chúng ta thấy có mức
khung cảnh, mức Script và cuối cùng là ngôn ngữ C++ Tất cả những công việc của NS đều thông
cua các Script của NS để gọi các hàm của C++ ở mức dưới cùng.
Sơ đồ 4 : Sự hoạt động của NS
Cyber Pro !!! :))
7
Cơ sở mạng thông tin – K4X
2.2. Làm việc với NS :
2.2.1. Download và cài đặt :
Ta có thể cài NS bằng các gói riêng biệt (Tcl/Tk , Otcl … ) hoặc cũng có thể dùng một
gói bao gồm tất cả các gói riêng biệt “All-in-One” . Ở đây chúng em sử dụng gói “All-in-one” để
cài đặt bản 2.27 (Ns-allinone2.27) _ bản mới nhất hiện nay . Bản này đựơc chúng em cài đặt và
chạy trên Linux RedHat 8.0 chạy ổn định . Các File có trong NS 2.27 :
- Tkrelease 8.3.2
- Otclrelease 1.0a8
- TclCL release 1.0b13
- Tcl release 8.3.2
- Ns release 2.26
- Nam release 1.9
- Xgraph version 12
- CWebversion 3.4g
- SGB version 1.0
- Gt-itm gt-itm and sgb2ns 1.1
- Zlib version 1.1.4
Để cài đặt trên LINUX , ta phải COPY bản nén của NS (ns-allinone-2.27.tar.gz ) trên
LINUX và giải nén bằng công cụ của LINUX . Sau đó ta mở Terminal của LINUX , chuyển đến
thư mục có chứa File ns-allinone2.27 đã bung nén . Nếu dùng giao diện KDE ta có thể mở cửa sổ
Terminal ngay trên thanh công cụ của cửa sổ Window (Window -> Terminal ) . Sau đó gõ lệnh

sh install để chạy Script Install của NS . Sau khi đã Install xong ta Copy các Flie trong thư mục
Bin của NS vào thư mục Bin của Root hoặc User tuỳ cấp độ sử dụng .
Như vậy là ta đã có thể sử dụng chương trình mô phỏng mạng NS .
Ta còn có thể chạy được NS trên Window nhờ vào một chương trình giả lập môi trường LINUX
trên hệ điều hành Windows gọi là : Cygwin . Để chạy NAM ta còn phải cài đặt thêm
Xfree86Server . Tuy nhiên vì điều kiện chưa Down được Xfree86 cho nên chúng em chưa thử
nghiệm được NAM trên môi trường Windows , nhưng đã có thể cài đặt và chạy được NS trên
Window .
2.2.2 Lập trình bằng Otcl trong NS :
Ngôn ngữ Otcl :
ns là một chương trình mô phỏng hướng đối tượng, viết bởi C++, sử dụng một trình thông
dịch OTcl như một bộ giao tiếp trực tiếp với người dùng. Chương trình thông dịch hỗ trợ một lớp
phân cấp trong C++ (gọi là phân cấp biên dịch) và một lớp phân cấp tương ứng trong trình thông
dịch Otcl (gọi là phân cấp thông dịch). Có sự tương ứng một một giữa một lớp trong phân cấp
thông dịch và một lớp trong phân cấp biên dịch. Lớp gốc của phân cấp này là lớp TclObject.
Người dùng tạo ra các đối tượng giả lập mới thông qua trình biên dịch, những đối tượng
này được thể hiện trong trình thông dịch, và được phản xạ tỉ mỉ, bởi một đối tượng tương ứng
trong phân cấp biên dịch. Phân cấp lớp thông dịch được tự động đưa vào thông qua các phương
thức định nghĩa trong lớp TclObject.
Cyber Pro !!! :))
8
Cơ sở mạng thông tin – K4X
Khái niệm tổng quan :
Tại sao dùng 2 ngôn ngữ ? ns dùng hai ngôn ngữ bởi vì bộ mô phỏng có hai việc khác
nhau cần thực hiện
- Một mặt, các mô phỏng chi tiết của giao thức yêu cầu một ngôn ngữ lập trình hệ thống
mà hoạt động có hiệu quả tới các byte, packet header, các thuật toán chạy trên các bộ dữ liệu lớn.
Với những tác vụ này, tốc độ chạy thực (runtime speed) là quan trọng, còn thời gian thay đổi
(chạy giả lập, sửa lỗi, biên dịch lại, chạy lại) là không quan trọng.
- Mặt khác, phần lớn mạng nghiên cứu, bao gồm các thông số, cấu hình khác nhau, hoặc

thăm dò nhanh một số hoạt cảnh. Trong những trường hợp này, thời gian tương tác (chạy lại, thay
đổi chế độ) là quan trọng hơn còn cấu hình chạy một lần, thời gian chạy thực không quan trọng
bằng.
ns kết hợp tất cả các yêu cầu này với hai ngôn ngữ C++ và OTcl. C++ nhanh khi chạy,
nhưng chậm khi thay đổi, phù hợp với việc xử lý chi tiết giao thức. OTcl chạy chậm nhưng thay
đổi nhanh, là lý tưởng cho cấu hình giả lập. ns thông qua (tclcl) cung cấp “keo” để tạo các đối
tượng và các biến xuất hiện trên cả hai ngôn ngữ.
• OTcl dùng để :
o Cấu hình, setup và “one-time” stuff
o Làm các công việc mà có thể sử dụng các đối tượng C++ có sẵn.
• C++ dùng cho:
o Làm những công việc yêu cầu phải xử lý các gói tin trong luồng.
o Nếu đang cần phải thay đổi cách ứng xử của một lớp c++, sẵn có trong những
cách mà không biết trước.
Lớp Tcl
Lớp Tcl đóng gói thể hiện thực (actual instance) của trình thông dịch OTcl và cung cấp
các phương thức để truy cập và giao tiếp với các trình thông dịch này.
Một instance của lớp được mô tả trong ~/tclcl/tcl.cc như một biến thành phần tĩnh. Lập
trình viên phải đặt một tham chiếu đến instance này để truy cập tới các phương thức khác. Khai
báo:
Tcl & tcl = Tcl::instance();
Yêu cầu các thủ tục OTcl
Có 4 công cụ khác nhau để yêu cầu một lệnh OTcl thông qua instance Tcl. Chúng khác
nhau cơ bản về các thông số. Mỗi hàm truyền một xâu tới trình thông dịch sau đó định giá xâu
đó trong ngữ cảnh toàn cục. Các phương thức sẽ trả về nơi gọi nếu trình thông dịch trả về
TCL_OK. Ngược lại, nếu trình thông dịch trả vể TCL_ERROR, các phương thức đó sẽ gọi
tkerror{}. Người dùng có thể chèn thêm các phương thức này để có thông báo lỗi một cách chính
xác hơn.
- Tcl.eval(char *s) yêu cầu Tcl_GlobalEval() chạy s thông qua trình thông dịch
- Tcl.evalc(const char* s) bảo vệ tham số s. Nó copy s vào bộ đệm trong, nó sau đó yêu cầu

hàm eval(char *s) trên bộ đệm trong.
- Tcl.eval() giả định rằng lệnh đó đã được lưu trong đệm trong bp_ của lớp, nó trực tiếp yêu
cầu Tcl.eval( char* bp_ ). Một handle tới chính bộ đệm thông qua phương thức
tcl.buffer(void).
- Tcl.evalf(const char* s, ) gần tương đương Printf(3). Nó sử dụng vsprintf(3) nội tại để
tạo xâu vào.
Cyber Pro !!! :))
9
Cơ sở mạng thông tin – K4X
Truyền kết quả tới/từ trình thông dịch
Khi trình thông dịch yêu cầu một phương thức C++, nó tiếp nhận kết quả trả lại trong biến
thành phần private, tcl_->result. Hai phương thức có khả năng để đặt biến này:
- Tcl.result(const char* s) truyền xâu kết quả s lại trình thông dịch.
- Tcl.resultf(const char* fmt, )
- varargs(3) biến đổi trên để định dạng kết quả sử dụng vsprintf(3), truyền xâu kết quả
tới trình thông dịch.
if (strcmp(argv[1], "now") = = 0) {
tcl.resultf("%.17g", clock());
return TCL_OK;
}
tcl.result("Invalid operation specified");
return TCL_ERROR;
Khi một phương thức C++ yêu cầu một lệnh OTcl, trình thông dịch trả về kết quả trong
tcl_->result. tcl.result(void) phải được dùng để nhận kết quả. Chú ý rằng, kết quả là một xâu, nó
phải được chuyển tới một định dạng bên trong tương ứng với kiểu của kết quả.
tcl.evalc("Simulator set NumberInterfaces_");
char* ni = tcl.result();
if (atoi(ni) != 1)
tcl.evalc("Simulator set NumberInterfaces_ 1");
Lớp TclObject

Lớp TclObject là lớp cơ sở cho hầu hết các lớp khác trong phân cấp thông dịch và biên
dịch. Mỗi đối tượng trong lớp TclObject được tạo ra bởi người dùng từ trong trình thông dịch.
Một đối tượng bóng tương đương được tạo ra trong phân cấp biên dịch. Hai đối tượng này liên
kết mật thiết với nhau.
Ví dụ cấu hình của một TclObject , một tác tử SRM (lớp Agent/SRM/Adaptive)
set srm [new Agent/SRM/Adaptive]
$srm set packetSize_ 1024
$srm traffic-source $s0
Với quy ước trong ns, lớp Agent/SRM/Adaptor là lớp con của Agent/SRM, là lớp con của
lớp Agent, là lớp con của lớp TclObject. Phân cấp lớp biên dịch tương ứng là ASRMAgent, thừa
kế từ Agent, thừa kế từ TclObject tương ứng.
Tạo và xoá đối tượng TclObject
a,Tạo đối tượng TclObject:
Bằng cách dùng new{}, trình thông dịch sẽ chạy hàm khởi tạo cho đối tượng đó, init{},
truyền cho nó các tham số cung cấp bởi người dùng. Đối tượng bóng của nó được tạo ra bởi hàm
thiết lập lớp cơ sở TclObject. Do đó hàm khởi tạo cho đối tượng TclObject mới đầu tiên phải gọi
hàm khởi tạo của lớp cha. new{} trả về một handle tới đối tượng này.
Trình tự các hành động sau được thực hiện bởi trình thông dịch là một phần của việc khởi
tạo đối tượng TclObject mới.
- Lấy một handle của đối tượng mới từ không gian tên của TclObject.
- Gọi hàm khởi tạo cho đối tượng mới và các hàm khởi tạo của các đối tượng lớp trên.
Hàm khởi tạo của đối tượng gốc TclObject sẽ tạo đối tượng bóng và thực hiện các khởi tạo cho
nó.
Cyber Pro !!! :))
10
Cơ sở mạng thông tin – K4X
- Sau khi đối tượng bóng được tạo xong, hàm create_shadow(void) sẽ:
o Thêm đối tượng mới vào bảng băm của TclObjects
o Gắn cmd{} thành một thủ tục instance của đối tượng thông dịch mới. Thủ tục instance
này gọi phương thức command() của đối tượng biên dịch.

Các kỹ thuật tạo bóng ở trên chỉ được thực hiện khi người dùng tạo đối tượng TclObject
thông qua trình thông dịch.
b,Xoá đối tượng TclObject: Hành động xoá delete sẽ huỷ đối tượng thông dịch và đối
tượng bóng của nó. Giống như hàm thiết lập, hàm huỷ đối tượng phải gọi hàm huỷ cho lớp cha
một cách tường minh như các lệnh cuối của hàm huỷ. Hàm huỷ TclObject sẽ yêu cầu thủ tục thể
hiện delete-shadow, tiếp đó yêu cầu phương thức tương ứng trong trình biên dịch để huỷ đối
tượng bóng. Trình thông dịch tự nó sẽ huỷ đối tượng thông dịch.
Liên kết biến
Thông thường, việc truy xuất biến biên dịch hay biến thông dịch chỉ giới hạn trong mã
biên dịch hay mã thông dịch. Tuy nhiên ns có cơ chế cho phép liên kết giữa biến biên dịch và
biến thông dịch, sự thay đổi của biến này sẽ được phản ánh vào biến liên kết với nó.
Việc liên kết được thực hiện thông qua hàm khởi tạo của đối tượng biên dịch. ns hỗ trợ 5
kiểu dữ liệu khác nhau, biến giá trị băng thông, biến thời gian, nguyên, thực và biến logic.
Các phương thức command: định nghĩa và gọi
Mỗi TclObject được tạo, ns thiết lập một thủ tục instance, cmd{}, cho phép thực thi các
hàm thông qua các đối tượng biên dịch, cmd{} tự động gọi thủ tục command{} của đối tượng
biên dịch và truyền các tham số cần thiết.
Người dùng yêu cầu phương thức cmd{} theo một trong hai cách: gọi tường minh hoặc
không tường minh. Với cách tường minh, người dùng gọi thủ tục cmd{} và truyền tham số đầu
tiên là hành động cần thực hiện. Với cách không tường minh, nếu có một thủ tục instance có tên
giống như hành động cần thực hiện thì người dùng chỉ việc gọi thủ tục instance đó.
Lớp TclClass
Lớp biên dịch này (TclClass) là một lớp trừu tượng. Các lớp kế thừa từ lớp này cung cấp
hai chức năng: khởi tạo cây lớp thông dịch ánh xạ của cây lớp biên dịch và cung cấp các phương
thức để tạo các TclObject mới. Mỗi lớp kế thừa được liên kết với một lớp biên dịch trong cây lớp
biên dịch.
Lớp TclCommand
Lớp này chỉ cung cấp các kỹ thuật cho ns để xuất các lệnh đơn giản tới trình thông dịch,
mà sau đó được chạy trong phạm vi toàn cục bởi trình thông dịch.
Lớp InstVar

Lớp này định nghĩa các phương thức và các kỹ thuật để liên kết một biến thành viên C++
trong đối tượng bóng với một biến instance trong đối tượng thông dịch tương ứng. Giá trị của
biến có thể truy xuất bởi mã biên dịch hay mã thông dịch tại bất kỳ thời điểm nào.
Có 5 lớp tương ứng với 5 loại biến của Ns: lớp InstVarReal, lớp InstVarTime,
InstVarBandwidth, lớp InstVarInt, lớp InstVarBool, tương ứng liên kết với biến thực, thời gian,
băng thông, số nguyên, và biến logic.
Cyber Pro !!! :))
11
Cơ sở mạng thông tin – K4X
2.3 Các mô phỏng cơ sở
2.3.1 Lớp mô phỏng (class Simulator)
Hệ thống mô phỏng được thực hiện bởi lớp Tcl Simulator. Lớp này cung cấp các giao tiếp
cho phép cấu hình quá trình mô phỏng và lựa chọn loại lịch sự kiện (event scheduler). Các script
mô phỏng thường bắt đầu bằng việc tạo một instance của lớp Simulator. Tiếp theo nó gọi các
hàm để tạo các nút mạng, cấu hình topo và các thuộc tính khác của mạng. Trong ns version 2 có
một lớp thừa kế từ lớp Simulator gọi là OldSim nhằm cung cấp khả năng tuơng thích ngược với
ns version 1
2.3.1.1 Khởi tạo mô phỏng
Khi một đối tượng giả lập mới được tạo trong tcl, thủ tục khởi tạo thực hiện các hành
động sau:
• Khởi tạo định dạng gói
• Tạo một bộ lập lịch
• Tạo một “null agent”
Khởi tạo định dạng gói thiét lập các trường offset trong các gói sử dụng bởi toàn bộ trình
mô phỏng. Bộ lập lịch (scheduler) chạy theo kiểu điều khiển sự kiện.Null agent được tạo ra với
lời gọi sau:
set nullAgent_ [new Agent/Null]
NullAgent thường được dùng để làm sink cho các gói muốn loại hay làm đích các gói
không nhận dạng được chuyển tới.
2.3.1.2 Các bộ lập lịch và các sự kiện.

Trình mô phỏng hoạt động theo kiểu hướng sự kiện. Có bốn bộ lập lịch, mỗi bộ sử dụng
các cấu trúc dữ liệu khác nhau: danh sách liên kết đơn linked-list, heap, calendar queue (ngầm
định) và kiểu một đặc biệt được gọi là “real time”. Bộ lập lịch thực hiện chọn sự kiện tiếp theo
gần nhất, hoàn thành nó và sau đó xử lý sự kiện tiếp theo. Đơn vị sử dụng cho lập lịch là giây.
Hiện tại, trình mô phỏng chạy đơn tuyến , chỉ một sự kiện được chạy ở một thời điểm. Nếu có
nhiều hơn một sự kiện được lập lịch để chạy đồng thời thì việc chạy chúng được thực hiện trên
cơ sở sự kiện nào được lập lịch trước sẽ được chạy trước. Các sự kiện mô phỏng không bao giờ
được sắp xếp lại bởi bộ lập lịch. Một sự kiện thường bao gồm một “firing time” và một hàm quản
lý (handler function).
Hai kiểu đối tượng được thừa kế từ lớp cơ sở Event là packets và “at-events”. Một at-
event là một thủ tục được lập lịch chạy ở một thời điểm xác định. Đó là một chuỗi được sử dụng
trong các script mô phỏng.
Bộ lập lịch kiểu danh sách (List Scheduler): sử dụng một cấu trúc danh sách liên kết đơn.
Danh sách này tổ chức theo trật tự thời gian, theo đó việc chèn và xoá sự kiện yêu cầu phải quét
danh sách để tìm điểm vào thích hợp. Khi chọn sự kiện tiếp theo để chạy cần cắt điểm đầu của
danh sách khỏi danh sách. Cách thực hiện này đảm bảo thực hiện các sự kiện trong dãy FIFO của
dòng các sự kiện.
Cyber Pro !!! :))
12
Cơ sở mạng thông tin – K4X
Bộ lập lịch kiểu vun đống (heap scheduler): thực hiện lập lịch theo cấu trúc vun đống. Cấu trúc
này cao cấp hơn so với cấu trúc danh sách cho một số lượng lớn các sự kiện, thời gian chèn và
xoá n sự kiện là O(log n).
Bộ lập lịch kiểu (calendar queue): sử dụng cấu trúc dữ liệu giống lịch năm để bàn, ở đó các sự
kiện cùng tháng/ngày của nhiều năm có thể được ghi cùng một ngày.
Bộ lập lịch thời gian thực: đồng bộ việc thực hiện các sự kiện với thời gian thực. Nó hiện tại
vẫn được đang phát triển.
2.3.2 Node và truyền tải gói tin (packet forwarding)
2.3.2.1 Các cơ sở node (Node basics)
Cơ sở nguyên thuỷ để tạo node là:

set ns [new Simulator]
$ns node
Thủ tục instance node xây dựng một node bên ngoài các đối tượng phân lớp đơn giản. Node tự
bản thân nó là một lớp đơn chuẩn trong OTcl. Mặc dù vậy hầu hết các bộ phận của node đều là
các TclObject. Cấu trúc tiêu biểu của một node (unicast) như sau:
Hình 1: Cấu trúc unicast node trong ns
Cấu trúc đơn giản này bao gồm 2 TclObject: một phân lớp địa chỉ (classifier_) và một
phân lớp cổng (dmux_). Chức năng của các phân lớp này là để phân loại các gói tin đến chính
xác các agent hoặc liên kết ra.Hầu hết các node chứa ít nhất các bộ phận sau:
• Một địa chỉ hoặc id_, tự động tăng đều thêm 1 (bắt đầu từ 0) trong không gian tên mô
phỏng mỗi khi một node được tạo ra.
• Danh sách các node lân cận (neighbor_).
• Một danh sách các agent(agent_).
• Bộ định kiểu node (nodetype_)
• Một module rounting
Ngầm định, các node trong ns được xây dựng để mô phỏng unicast. Để có khả năng mô
phỏng multicast, trình mô phỏng phải được tạo với tuỳ chọn “multicast on”. Ví dụ :
Cyber Pro !!! :))
13
Cơ sở mạng thông tin – K4X
set ns [new Simulator –multicast on]
Khi một trình mô phỏng sử dụng rounting multicast, bit cao nhất trong địa chỉ cho biết địa
chỉ đó là địa chỉ multicast hay địa chỉ unicast. Nếu bit này là 0 thì địa chỉ là unicast, ngược lại địa
chỉ đó là multicast.
Cấu trúc trong của một node multicast.
Hình 2: Cấu trúc multicast node trong ns
2.3.2.2 Các phương thức node: cấu hình node
Thủ tục để cấu hình mỗi node được phân lớp trong
• Các hàm điều khiển
• Quản lý số hiệu cổng và địa chỉ, chức năng unicast routing

• Quản lý agent
• Thêm các hàng xóm
Các hàm điều khiển
• $node entry trả về điểm vào cho mỗi node. Đây là phần tử đầu tiên sẽ quản lý các gói tin
đến node. Biến instance node, entry_, lưu tham chiếu phần tử này. Với node unicast, đấy
là phân lớp (classfier_) địa chỉ mà nhìn ở các bit cao trong địa chỉ đích. Biến instance
classfier_ chứa tham chiếu tới phân lớp này. Tuy nhiên, với các node multicast, điểm vào
là switch_ nó nhìn ở bít đầu tiên để chỉ ra nó sẽ truyền gói tới phân lớp unicast, hay phân
lớp multicast tương ứng.
• $node reset sẽ reset tất cả các tác tử tại node.
Quản lý số hiệu cổng và địa chỉ
Thủ tục $node id trả về số hiệu node. Số này tự động tăng và gắn tới mỗi node lúc khởi
tạo bởi phương thức lớp Simulator, $ns node. Lớp Simulator cũng lưu một mảng biến instance,
node_, được đánh số bởi node id, và chứa một tham chiếu tới node với id đó.
Thủ tục $node agent (port) trả về handle của agent tại port xác định. Nếu không có agent
nào tại số hiệu cổng chỉ định sẵn sàng, thủ tục trả về một xâu rỗng.
Thủ tục alloc-port trả về số hiệu cổng tiếp theo có thể được sử dụng. Nó dùng một biến
instance, np_, để đánh dấu số hiệu cổng chưa được xác định.
Cyber Pro !!! :))
14
Cơ sở mạng thông tin – K4X
Thủ tục add-route và add-routes, dùng bởi unicast routing để thêm các đường đi vào
classifier_. Cú pháp được dùng là:
$node add-route <destination id> <TclObject> .
$node add-routes <destination id> <TclObjects> được dùng để thêm nhiều router tới
cùng một đích.
Ngược lại với thủ tục add-routes{} là delete-routes{}.
Quản lý agent
Với một <agent>, thủ tục attach{} sẽ thêm agent vào danh sách của agents_ của nó, gắn
số hiệu cổng với agent và đặt địa nguồn cho nó, đặt đích của agent ở entry{} của nó, thêm một

con trỏ tới bộ giải tích hợp cổng tại node (dmux_) vào agent tại slot tương ứng trong phân lớp
dmux_
Ngược lại, detach{} sẽ xoá tác tử từ danh sách agents_, và bỏ điểm đích của agent, điểm
vào trong dumx_ của node vào nullagent.
Xác định các node lân cận
Mỗi node giữ một danh sách các node gần nó trong biến instance, neighbor_. Thủ tục
add-neighbor{} thêm một node hàng xóm vào danh sách. Thủ tục neighbors{} trả về danh sách
này.
2.3.2.3 Giao diện cấu hình node
Simulator::node-config{} điều tiết tính linh hoạt và cấu trúc module của các node khác
nhau định nghĩa trong cùng lớp Node cơ sở.
Giao diện cấu hình node bao gồm hai phần. Phần đầu làm việc với cấu hình node, phần
hai tạo node với kiểu được định sẵn.
Cấu hình node về bản chất là định nghĩa các đặc tính khác nhau của node trước khi tạo
chúng. Chúng có thể gồm kiểu của cấu trúc địa chỉ sử dụng trong mô phỏng, định nghĩa các bộ
phận của mạng cho mobilenode, bật hoặc tắt tuỳ chọn dấu ở các mức Agent/Router/MAC, chọn
kiểu của giao thức router cho các node không dây hoặc hạn chế chế độ hoạt động.
2.3.2.4 Phân lớp ( Classifier )
Chức năng của một node khi nó nhận một gói là kiểm tra các trường của gói, thường là
địa chỉ đích, và có thể là địa chỉ nguồn. Nó có thể ánh xạ giá trị tới một đối tượng giao diện ra đó
là nơi nhận tiếp theo của gói này.
Trong ns công việc này được thực hiện bởi đối tượng classifier đơn.Mỗi đối tượng
classifier sẽ được đặt tại một vị trí xác định để kiểm tra việc truyền tải gói tin khi vận chuyển qua
node. Một node trong ns dùng nhiều kiểu đối tượng classifier khác nhau của phân lớp cho các
mục đích khác nhau.
Phân lớp địa chỉ
Phân lớp địa chỉ trợ giúp chuyển gói unicast. Nó áp đặt một phép dịch bit và thực hiện
gắn mặt nạ tới địa chỉ đích của gói để tạo một số hiệu slot. Số hiệu slot này được trả về từ phương
thức classify().
Phân lớp Multicast.

Cyber Pro !!! :))
15
Cơ sở mạng thông tin – K4X
Phân lớp multicast phân lớp các gói theo cả (nhóm) địa chỉ đích và nguồn. Nó duy trì một
bảng ánh xạ cặp nguồn/nhóm tói các số hiệu slot. Khi một gói đến chứa một cặp nguồn/nhóm
chưa xác định tới phân lớp, nó yêu cầu một thủ tục OTcl là Node::new-group{} để thêm một
điểm vào trong bảng của nó.
Phân lớp đa đường (MultiPath)
Đối tượng này được tạo ra để trợ giúp truyền trên nhiều đường có chi phí (cost) bằng
nhau, ở đây node sẽ có nhiều đường chi phí bằng nhau tới cùng một đích, và dùng tất cả chúng
đồng thời. Đối tượng này không kiểm soát bất kỳ một trường nào trong gói. Với mỗi gói thành
công, nó đơn giản trả về trường slot tiếp trong chế độ làm tròn robin.
Phân lớp băm
Đối tượng này được dùng để phân lớp một gói như các thành phần của một luồng. Đúng
như tên của nó chỉ ra, phân lớp băm sử dụng bảng băm để gắn các gói với các luồng. Các gói có
thể được gắn tới các luồng dựa vào định danh luông (flow ID), địa chỉ đích, địa chỉ nguồn/đích,
hoặc sự kết hợp địa chỉ nguồn /đích cộng với định danh luồng.
Phân lớp băm được tạo ra với một tham số nguyên chỉ định kích thước khởi tạo của bảng
băm. Kích thước hiện tại của bảng băm có thể thay đổi với phương thức resize. Khi đã tạo, một
biến instance shift_ và mask_ được khởi tạo với giá trị NodeShift và NodeMask hiện tại tương
ứng của trình mô phỏng. Những giá trị này nhận được từ đối tượng AddrParams khi một phân lớp
băm được khởi tạo. Phân lớp băm sẽ thất bại nếu cấu trúc AddrParams không được khởi tạo.
Phân lớp băm nhận các gói, phân lớp theo các điều kiện luồng của chúng, và nhận các
phân lớp slot chỉ định node tiếp theo có thể nhận gói đó.
Replicator
Replicator khác với các phân lớp khác, nó không dùng chức năng phân lớp. Nó đơn giản
chỉ dùng các phân lớp như một bảng có n slot, nó sử dụng phương thức resv() để tạo n bản copy
của gói rồi phát tới n đối tượng được tham chiếu trong bảng.
Để hỗ trợ truyền gói multicast, một phân lớp nhận một gói multicast từ nguồn S cho nhóm
G tính một hàm băm h(S,G) cho một số hiệu slot trong bảng đối tượng phân lớp.

2.3.2.5 Module routing và tổ chức phân lớp
Node trong ns thực sự là một tập các phân lớp. Node đơn giản nhất chứa chỉ một phân lớp
địa chỉ và một phân lớp cổng. Khi muốn mở rộng chức năng một node, nhiều phân lớp được
thêm vào node cơ sở.
Phương thức để quản lý trường hợp này là thông qua lớp thừa kế. Ví dụ, nếu một node
muốn trợ giúp phân lớp routing, một cách đơn giản là thừa kế một node Node/Hier từ node cơ sở
và chèn các phương thức đặt phân lớp để chèn các phân cấp. Phương thức này hoạt động tốt khi
các khối chức năng mới là độc lập và không bị “xáo trộn”(arbitrarily) tuỳ ý. Ví dụ cả kiến trúc
routing và adhoc routing dùng tập phân cấp của của chúng. Thừa kế yêu cầu có Node/Hier hỗ trợ
trước, và Node/Mobile sau. Sẽ có vấn đề khi muốn node adhoc routing hỗ trợ hierarchical
routing. Trong trường hợp này, phải sử dụng đa thừa kế để giải quyết, nhưng nó trở nên không
khả thi khi số khối chức năng tăng lên.
Phương thức duy nhất để giải quyết vấn đề này là phép hợp đối tượng. Node cơ sở cần
định nghĩa một tập các giao diện cho các phân lớp truy nhập và tổ chức. Những giao diện này có
thể là:
Cyber Pro !!! :))
16
Cơ sở mạng thông tin – K4X
• Cho phép các module routing đơn thực thi các phân lớp của chúng để chèn các phân lớp
của chúng vào node.
• Cho phép các khối tính toán đường đưa các thông tin định tuyến tới các phân lớp trong tất
cả các module routing cần thông tin này.
• Cung cấp một điểm đơn quản lý các module routing đã tồn tại.
Ngoài ra, nên định nghĩa một giao diện đồng nhất cho các module routing để nối tới các
giao diện node, cũng như cung cấp một hướng tiếp cận để mở rộng chức năng node.
Module routing
Mỗi module routing trong ns bao gồm 3 khối chức năng:
• Routing agent chuyển đổi gói routing với các hàng xóm.
• Route logic sử dụng thông tin thu lượm bởi routing agent để thực hiện tính toán đường
thực.

• Các phân lớp nằm trong node. Chúng dùng bảng routing đã được tính để thực hiện chuyển
gói.
Khi tính toán một giao thức routing mới, không cần thực hiện tất cả các khối đó.
Khi một giao thức routing mới gộp nhiều hơn một khối chức năng, đặc biệt khi nó chứa
phân cấp của chính nó, nó muốn có một đối tượng khác, mà gọi là routing module, quản lý tất cả
các khối chức năng đó và giao tiếp với node để tổ chức các phân lớp của nó.
Hình sau mô tả mối liên quan chức năng giữa các đối tượng này:
Hình 3: Mudule routing
Các module routing có thể có quan hệ trực tiếp với các khối tính toán đường, route logic
và/hoặc routing agent. Mặc dù vậy, khối tính toán đường có thể không được cài trực tiếp các
đường của chúng thông qua module routing, bởi vì có thể tồn tại các module khác chú tâm tìm
các đường mới.
Một module routing bao gồm 3 chức năng lớn:
• Khởi tạo các liên kết của nó tới một node thông qua register{}, và loại bỏ liên kết qua
unregister{}. Thường trong register{}, một module routing
(1) nói cho node biết liệu nó có muốn biết các cập nhật đường và gắn kết các agent
vận chuyển.
Cyber Pro !!! :))
17
Cơ sở mạng thông tin – K4X
(2) tạo các phân lớp của nó và cài chúng trong node. Trong unregister{} một
module routing thực hiện công việc ngược lại: xoá các phân lớp và bỏ các kết nối
của nó tới bộ cập nhật đường của node.
• Nếu module routing muốn biết các cập nhật đường, node sẽ thông tin cho module thông
qua RtModule::add-route{dst,target} và RtModule::delete-route{dst, nullagent}
• Nếu module routing muốn thức hiện gắn kết và huỷ bỏ gắn kết các agent vận chuyển
trong node, node sẽ thông tin cho module thông qua: RtModule::attach{agent, port} và
RtModule::detach{agent, nullagent}
Giao diện node
Để liên kết với các giao diện của module routing, node cung cấp các giao diện tương ứng:

* Để biết module nào đăng ký khi khởi tạo, lớp Node giữ một danh sách các module như một
biến lớp. Giá trị ngầm định của danh sách này chứa chỉ module routing cơ sở. Lớp Node cung
cấp hai proc sau để xử lý danh sách module này:
Node::enable-module{[name]} Nếu module RtModule/[name] tồn tại, proc này đặt
[name] vào danh sách module.
Node::disable-module{[name]} Nếu [name] là trong danh sách module, xoá nó khỏi danh
sách đó.
Khi một node được tạo, có thể dùng các thủ tục sau để liệt kê các module đã đăng ký,
hoặc nhận một thẻ của module có tên chỉ định:
• Node::list-modules{}
• Node::get-module{[name]}
* Để cho các module routing muốn cập nhật routing, một đối tưọng node cung cấp các hàm:
• Node::rouite-notify{module} Thêm module vào danh sách cập nhật module.
• Node::unreg-route-notify{module} xoá module khỏi danh sách cập nhật routing.
Các thủ tục sau cung cấp các móc nối trên liên kết của các agent vận chuyển:
• Node::port-notify{module} Thêm module vào danh sách thông báo kết nối agent.
• Node::unreg-port-notify{module} Xoá module từ danh sách liên kết agent.
* Node cung cấp các thủ tục sau để xử lý phân cấp địa chỉ và cổng của nó:
Node::insert-entry{module, clsfr, hook} chèn phân lớp clsfr vào điểm vào của node. Nó
cũng liên kết phân lớp mới với module do đó nếu phân lớp này bị loại sau đó, module sẽ bị huỷ
bỏ đăng ký. Nếu hook được chỉ ra là một số, phân cấp đã tồn tại sẽ được chèn vào slot hook của
phân lớp mới.
Node::install-entry{module, clsfr, hook} khác với Node::insert-entry ở chỗ nó xoá phân
lớp đã tồn tại ở điểm vào của node, bỏ đăng ký mọi module routing tương ứng, cài đặt phân lớp
mới tại điểm vào. Nếu hook được cung cấp, phân lớp cũ được nối vào chuỗi phân lớp, nó sẽ nối
chuỗi này vào slot hook của phân lớp mới. Như trên, nếu hook bằng target, clsfr sẽ được đánh
dấu như một đối tượng được thừa kế từ Connector thay cho một phân lớp.
Node::install-demux{demux, port} đặt phân cấp demux được cung cấp như một giải đa
hợp ngầm định. Nếu port được cung cấp nó đặt bộ giải đa hợp sẵn có vào slot port của node mới.
Chú ý, trong trường hợp này, không xoá bộ giải đa hợp đã tồn tại.

2.3.3 Các liên kết :
Các liên kết đơn
Cyber Pro !!! :))
18
Cơ sở mạng thông tin – K4X
Phần này sẽ mô tả cách tạo các liên kết để kết nối các node và hoàn thiện topology của
mạng trong giới hạn mô tả các liên kết điểm-điểm đơn giản. Cũng như node được cấu tạo từ các
phân lớp, một liên kết đơn được xây dựng từ một chuỗi các bộ kết nối (connector).
Lớp Link là một lớp trong OTcl, cung cấp một vài primitive (hàm nguyên thuỷ) đơn giản.
Lớp SimpleLink cung cấp khả năng để kết nối hai node bằng liên kết điểm-điểm. ns cung cấp thủ
tục simplex-link{} để xây dựng các liên kết đơn hướng từ một node tới một node khác. Cú pháp
mô tả như sau:
set ns [new Simulator]
$ns simplex-link (node0)( node1)(bandwidth)(delay)(queue_type)
Lệnh này tạo một liên kết từ node0 tới node1 với băng thông bandwidth và độ trễ delay. Liên kết
này dùng một queue các kiểu queue_type.
Cấu trúc của một liên kết đơn giản:
Hình 4: Cấu trúc Link trong ns
• head_ là điểm vào của liên kết, nó chỉ tới đối tượng đầu tiên của liên kết.
• queue_tham chiếu tới hàng đợi chính các phần tử của liên kết.
• link_ tham chiếu tới phần tử thực sự làm mô hình cho liên kết này, về đặc tính trễ và
băng thông của liên kết.
• ttl_tham chiếu tới phần tử xử lý thời gian sống của mỗi gói
• drophead_ tham chiếu tới một đối tượng là đầu của hàng đợi các thành phần bị bỏ qua bởi
xử lý liên kết.
• enqT_ tham chiếu tới phân tử đánh dấu các gói đang vào queue_
• deqT_ tham chiếu tới phần tử đánh dấu các gói đang rời khỏi queue_
• drpT_ tham chiếu tơi phần tử đánh dấu các gói đã bị bỏ từ queue_
• rcvT_ tham chiếu tới phần tử đánh dấu các gói đã nhận được bởi node tiếp theo.
Thủ tục duplex-link{} xây dựng một liên kết hai hướng từ hai liên kết đơn giản.

2.3.3.1 Các thủ tục xây dựng các liên kết và các liên kết đơn
Link procedures: lớp Link được thực thi hoàn toàn trong Otcl. Lớp OTcl SimpleLink dùng lớp
C++ LinkDelay để mô phỏng độ trễ trong phân phát các gói tin. Các thủ tục trong lớp Link là:
• head{} trả về handle của head_.
• queue{} trả về handle của queue_.
• link{} trả về handle cho phần tử trễ, link_.
• up{} đặt liên kết trạng thái là “up” trong dynamics_ element.
Cyber Pro !!! :))
19
Cơ sở mạng thông tin – K4X
• down{} ngược của up{}.
• up?{} trả về trạng thái liên kết. Trạng thái là g “up” hay “down”; là “up” nếu
liên kết động được cho phép
• all-connectors{} áp đặt mọi hành động chỉ định lên mọi connector trên liên kết.
• cost{} đặt giá cho liên kết
• cost?{}trả về giá của liên kết.
SimpleLink Procedures: Lớp (Otcl) SimpleLink thực hiện một liên kết điểm-điểm đơn giản với
một độ trễ và một queue_ tương ứng. Nó được yêu cầu từ lớp (Otcl cơ sở) Link 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]


set ttl_ [new TTLChecker]
$ttl_ target [$link_ target]
$link_ target $ttl_
}
2.3.3.2 Các bộ kết nối (connector)
Các connector không giống các phân lớp (classifier), nó chỉ tạo dữ liệu cho một bên nhận;
hoặc là gói dữ liệu được chuyển cho hàng xóm target_, hoặc là huỷ (gửi đến drop-target_)
Một connector sẽ nhận một gói, thực hiện vài chức năng, và phát gói đó tới hàng xóm của
nó, hoặc loại bỏ gói. Có nhiều loại connector trong ns, mỗi loại thực hiện một chức năng khác
nhau:
• Networkinterface : dán nhãn các gói với định danh giao diện đến - nó được dùng bởi các
giao thức định tuyến multicast
• DynaLink : đối tượng mà gate traffic phụ thuộc vào link là up hay down
• DelayLink : đối tượng mà mô hình hoá tính chất độ trễ và băng thông của liên kết
• Queues : kiểu output buffer gắn vào link trong một “real” router trong một mạng
• TTLChecker : giảm ttl của mỗi gói tin khi nó được nhận.
2.3.3.3 Phân cấp đối tượng
Lớp cơ sở dùng đẻ mô tả liên kết gọi là Link.
SimpleLink Object : dùng để thể hiện một liên kết đơn hướng . Không có biến trạng thái hay
tham số cấu hình gắn với đối tượng này.
DelayLink Object : xác định tổng thời gian yêu cầu cho một packet băng qua một link. Nó được
xác định bởi size/bw + delay với size là kích thước gói tin, bw là bandwidth của link và delay là
độ trễ khi truyền của link.
Cyber Pro !!! :))
20
Cơ sở mạng thông tin – K4X
2.3.4 Quản lý queue và lập lịch gói
Queue biểu diễn các vị trí là nơi mà có thể lưu các gói hay drop. Packet scheduling đề cập
tới các quyết định phục vụ hay là drop gói tin. Hiện tại có các kiểu drop-detail queueing (FIFO),
quản lí bộ đệm RED, CBQ và một vài loại Fair Queueing như Fair Queueing (FQ), Stochastic

Fair Queueing (SFQ) hay Deficit Round-Robin (DRR).
2.3.4.1 Lớp Queue C++
Lớp queue được thừa kế từ lớp cơ sở Connector. Nó cung cấp một lớp cơ sở được dùng
bởi các các lớp queue, như hàm gọi ngược để thực hiện khối hoá.
Enque và deque là các hàm ảo thuần tuý, cho thấy lớp Queue được sử dụng như lớp cơ sở,
đặc biệt các queue được thừa kế từ Queue và thực hiện hai chức này nếu cần thiết. Các queue
thường không chồng hàm recv bởi vì nó yêu cầu các enque, deque đặc biệt.
Lớp Queue không chứa trạng thái trong. Thường chúng là các đối tượng theo dõi đặc biệt.
Thành phần qlim_ được xây dựng để điều khiển giới hạn trên của queue, nhưng nó không được
tự đặt bởi lớp Queue; nó phải được dùng bởi các lớp queue con, nếu chúng cần giá trị này. Thành
phần bocked_ là một biến logic, xác định liệu queue có khả năng để gửi một gói ngay lập tức tới
hàng xóm của nó hay không. Khi một queue bị block, nó có thể enqueue các gói nhưng nó không
thể gửi chúng.
2.3.4.2 Queue Blocking
Một queue có thể bị block hoặc unblock bất kỳ lúc nào. Thường một queue bị block khi
một packet đi qua giữa nó và hàng xóm của nó. Một blocked queue sẽ còn bị block nếu như
downstream link vẫn bận và queue đang có ít nhất một packet được gửi. Một queue chỉ được
unblock khi hàm resume của nó được gọi, thông thưòng đó là khi không có packet nào vào queue.
Khi một đối tượng Queue được tạo, nó sẽ bao gồm một đối tượng QueueHandler (qh_)
được khởi tạo để chứa một tham chiếu tới đối tượng Queue mới. Khi một Queue nhận một
packet, nó gọi phiên bản lớp con của hàm enque với packet đó. Nếu queue không bị block nó sẽ
gửi packet và gọi hàm deque chỉ định để kết thúc packet được truyền, block queue và gửi packet
tới hàng xóm.
2.3.4.3 Lớp PacketQueue
Lớp Queue có thể thực hiện quản lý bộ đệm và lập lịch nhưng không thực hiện các công
việc mức thấp trên một queue xác định.
Lớp PacketQueue duy trì một linked-list của các packet, và thường được dùng bởi các
chiến lược điều độ riêng biệt và quản lý bộ đệm một cách kỷ luật để giữ trật tự các packet. Chiến
lược điều độ riêng biệt hoặc quản lý bộ đệm có thể sử dụng một vài đối tượng PacketQueue. Lớp
PacketQueue duy trì số lượng hiện tại các packet được lưu trong queue, nó được phương thức

length() trả về. Hàm enque đặt packet chỉ định ở cuối queue và cập nhật biến thành phần len_.
Hàm deque trả về packet ở đỉnh queue và xoá nó khỏi queue, hoặc trả về NULL nếu queue rỗng.
Hàm lookup trả về packet thứ r từ đỉnh queue, hoặc NULL nếu không có. Hàm remove xoá gói ở
địa chỉ đã cho trong queue. Nó sẽ khiến chương trình kết thúc bất thường nếu gói đó không tồn
tại.
2.3.4.4 Các loại đối tượng queue.
Một đối tượng queue là một lớp thông thường của đối tượng có khả năng giữ và đánh dấu
hoặc bỏ qua các packet khi chúng đi qua topology được mô phỏng.
Cyber Pro !!! :))
21
Cơ sở mạng thông tin – K4X
Các tham số cấu hình được dùng cho đối tưọng queue là:
• Limit_ kích thước queue trong các packet.
• Blocked_ ngầm định là false, nó là true nếu queue bị block.
• unblock_on_resume_ đặt ngầm định là true, chỉ ra một queue nên tự unblock ở thời
điểm gói cuối cùng đã gửi xong.
2.3.5 Các trễ và các liên kết
Các trễ thể hiện thời gian mỗi gói qua một liên kết. Một dạng cụ thể của đối tượng này
(“dynamic link”) cũng hiển thị khả năng hỏng của một liên kết. Tổng thời gian yêu cầu cho một
gói vượt qua một liên kết được định nghĩa theo: s/b+d trong đó s là kích thước gói, b là tốc độ
của liên kết (bits/s), d là trễ liên kết (s). Sự thực hiện các trễ liên kết được gắn chặt chẽ với thủ
tục khối hoá queue.
Đối tượng này trợ giúp một insproc-like, $object dynamic, để đặt các biến của nó,
dynamic_. Biến này xác định liệu liên kết có là liên kết động hay không.
Với các liên kết không động, phương thức này thực hiện bởi việc nhận một gói p và lập
lịch hai sự kiện. Giả sử hai sự kiện này gọi là E1 và E2, và sự kiện E1 được lập lịch xảy ra sau
E2. E1 được lập lịch để xảy ra khi có packet gửi tới node với độ trễ để hoàn tất việc gửi packet
hiện tại. E1 thường gắn với đối tượng Queue, do đó nó sẽ được unblock. E2 thể hiện sự kiện
packet được chuyển đến nút lân cận tiếp theo. Sự kiện E2 xảy ra một số giây sau E1 là trễ liên
kết.

Khi liên kết là động, và nhận một packet p, thì nó sẽ lập lịch cho E1 để có thể unblock
queue tại thời điểm thích hợp. Tuy nhiên, E2 được lập lịch chỉ khi p là gói duy nhất hiện đang
được truyền. Nếu không, phải có ít nhất một gói đang được truyền trên liên kết mà phải được
nhận trước p tại E2. Do đó gói p được giữ trong Transit queue , itq_. Khi gói ngay trước p được
node lân cận nhận, đối tương DelayLink sẽ lập lịch một sự kiện cho chính nó để tác động tới E2.
Tại thời điểm thích hợp, phương thức handle() của nó sẽ trực tiếp gửi p đến đích của nó. Phương
thức nội tại schedule_next() sẽ điều độ các sự kiện cho các gói khi truyền tại thời điểm thích hợp.
II.3.6 Agent:
Agent là các điểm cuối (endpoint) nơi các gói của tầng mạng được tạo ra hoặc sử dụng,
agent còn được dùng để cài đặt các giao thức của các tầng khác nhau. Lớp Agent có một phần
được cài đặt bằng OTcl và một phần được cài đặt bằng C++.
2.3.6.1 Trạng thái agent
Lớp Agent C++ chứa đầy đủ các trạng thái nội tại để gắn với các trường khác nhau của
các gói tin mô phỏng được gửi đi. Bao gồm:
• addr_ Địa chỉ của node (địa chỉ nguồn trong các gói dữ liệu)
• dst_ Địa chỉ đích mà gói sẽ được gửi tới
• size_ packet kích thước (bytes), thường đặt trong header của gói.
• type_ type kiểu gói (trong header gói)
• fid_ định danh luồng
• prio_ the trường mức ưu tiên IP
• flags_ packet các cờ
• defttl_ default giá trị thời gian sống ngầm định IP ttl
Cyber Pro !!! :))
22
Cơ sở mạng thông tin – K4X
Các giá trị này có thể được thay đổi trong các lớp dẫn xuất của Agent, tuy nhiên không phải tất cả
chúng đều cần thiết trong một agent cụ thể nào đó.
2.3.6.2 Các phương thức của agent.
Lớp agent hỗ trợ việc sinh và nhận gói. Các hàm thành phần sau được thực hiện bởi lớp
Agent trong C++, và các lớp dẫn xuất thường không override các phương thức này.

• Packet* allocpkt() cấp phát một gói mới và gán các trường của nó.
• Packet* allocpkt(int) cấp phát gói mới với một tải dữ liệu n byte và gán các trường của nó
Các hàm thành viên sau của lớp Agent thường được override bởi lớp dẫn xuất:
• void timeout(timeout number) lớp con chỉ định phương thức timeout
• void recv(Packet*, Handler*) agent nhận receiving nhận đường dẫn.
2.3.6.3 Các Agent giao thức:
Trong ns có cung cấp các agent sau: (tên trong OTcl)
TCP a “Tahoe” TCP sender (cwnd = 1 on any loss)
TCP/Reno a “Reno” TCP sender (with fast recovery)
TCP/Newreno a modified Reno TCP sender (changes fast recovery)
TCP/Sack1 a SACK TCP sender
TCP/Fack a “forward” SACK sender TCP
TCP/FullTcp a more full-functioned TCP with 2-way traffic
TCP/Vegas a “Vegas” TCP sender
TCP/Vegas/RBP a Vegas TCP with “rate based pacing”
TCP/Vegas/RBP a Reno TCP with “rate based pacing”
TCP/Asym an experimental Tahoe TCP for asymmetric links
TCP/Reno/Asym an experimental Reno TCP for asymmetric links
TCP/Newreno/Asym an experimental Newreno TCP for asymmetric links
TCPSink a Reno or Tahoe TCP receiver (not used for FullTcp)
TCPSink/DelAck a TCP delayed-ACK receiver
TCPSink/Asym an experimental TCP sink for asymmetric links
TCPSink/Sack1 a SACK TCP receiver
TCPSink/Sack1/DelAck a delayed-ACK SACK TCP receiver
UDP a basic UDP agent
RTP an RTP sender and receiver
RTCP an RTCP sender and receiver
LossMonitor a packet sink which checks for losses
IVS/Source an IVS source
IVS/Receiver an IVS receiver

CtrMcast/Encap a “centralised multicast” encapsulator
CtrMcast/Decap a “centralised multicast” de-encapsulator
Message a protocol to carry textual messages
Message/Prune processes multicast routing prune messages
SRM an SRM agent with non-adaptive timers
SRM/Adaptive an SRM agent with adaptive timers
Tap interfaces the simulator to a live network
Null a degenerate agent which discards packets
rtProto/DV distance-vector routing protocol agent
Cyber Pro !!! :))
23
Cơ sở mạng thông tin – K4X
2.3.6.4 Các ví dụ: các Agent TCP, TCPSINK
Lớp TCP biểu diễn một TCP sender đơn giản. Nó gửi dữ liệu tới một agent TCPSink và
xử lý các tín hiệu báo nhận (acknowledgments) của nó. Nó có một đối tượng riêng biệt được kết
hợp với nó mà biểu diễn yêu cầu của một ứng dụng.
Tạo một agent
Đoạn mã OTcl sau đây tạo ra một agent TCP và cấu hình nó:
set tcp [new Agent/TCP] ; # tạo agent gửi
$tcp set fid_ 2 ; # thiết lập ID luồng tầng IP
set sink [new Agent/TCPSink] ; # tạo agent nhận
$ns attach-agent $n0 $tcp ; # đặt sender lên nút $n0
$ns attach-agent $n3 $sink ; # đặt receiver lên nút $n3
$ns connect $tcp $sink ; # thiết lập kết nối TCP
set ftp [new Application/FTP] ; # tạo một ứng dụng nguồn FTP
$ftp attach-agent $tcp ; # kết hợp FTP với TCP sender
$ns at 1.2 "$ftp start" ; # sắp xếp để FTP bắt đầu vào thời điểm 1.2 giây

Bắt đầu một agent
Agent TcpAgent trong ví dụ được bắt đầu khi nguồn sinh FTP của nó nhận lệnh start ở

thời điểm 1.2 giây. Thao tác start là một thủ tục instance được định nghĩa trong lớp
Application/FTP. Nó được định nghĩa trong ~ns/tcl/lib/ns-source.tcl như sau:
Application/FTP instproc start {} {
[$self agent] send -1
}
Trong trường hợp này, agent tham chiếu đến agent TCP đơn giản của chúng ta và send –1
tương tự như gửi một file lớn tùy ý.
Lời gọi đến send cuối cùng dẫn đến việc TCP sender tạo ra các gói.
Xử lý đầu vào tại nơi nhận
Nhiều TCP agent có thể được sử dụng cùng với lớp TCPSink. Lớp này định nghĩa các
phương thức recv() và ack().
Phương thức recv() chèn lên phương thức Agent::recv() (chỉ đơn thuần là hủy bỏ gói nhận
được). Nó cập nhật trạng thái bên trong với số thứ tự của gói nhận được (và do đó yêu cầu biến
off_tcp_ được khởi tạo đúng). Sau đó, nó tạo ra một tín hiệu báo nhận (acknowledgment) cho gói
nhận được.
Phương thức ack() cho phép truy nhập đầy đủ tới các trường header của gói bao gồm sự
truy nhạp riêng biệt tới TCP header, IP header, Flags header và các header chung. Lời gọi tới
send() dẫn ra phương thức Connector::send().
Xử lý các phản hồi tại nơi gửi
Một khi phía bên kia của TCP đơn giản nhận được dữ liệu và tạo ra một ACK, nơi gửi
thường phải xử lý ACK. Trong agent TcpAgent, điều này được làm như sau:
/*
* main reception path - should only see acks, otherwise the
* network connections are misconfigured
*/
Cyber Pro !!! :))
24
Cơ sở mạng thông tin – K4X
void TcpAgent::recv(Packet *pkt, Handler*)
{

hdr_tcp *tcph = (hdr_tcp*)pkt->access(off_tcp_);
hdr_ip* iph = (hdr_ip*)pkt->access(off_ip_);

if (((hdr_flags*)pkt->access(off_flags_))->ecn_)
quench(1);
if (tcph->seqno() > last_ack_) {
newack(pkt);
opencwnd();
} else if (tcph->seqno() == last_ack_) {
if (++dupacks_ == NUMDUPACKS) {

}
}
Packet::free(pkt);
send(0, 0, maxburst_);
}
Đoạn mã này được thực thi khi một gói ACK tới nơi gửi. Trong trường hợp này, một khi
thông tin trong ACK được xử lý (bởi newack), gói này không còn được cần nữa và được trả về
cho bộ cấp phát bộ nhớ gói (packet memory allocator). Hơn nữa, việc nhận ACK chỉ ra khả năng
gửi dữ liệu thêm, vì vậy phương thức TcpSimpleAgent::send()được gọi để cố gắng gửi thêm dữ
liệu nếu cửa sổ TCP cho phép.
Cài đặt các Timer
Như sẽ được trình bày trong chương tiếp theo, các lớp timer cụ thể phải được kế thừa từ
lớp cơ sở trừu tượng TimerHandler được định nghĩa trong ~ns/timer-handler. Các instance của
những lớp con này sau đó có thể được sử dụng như những timer của các agent khác nhau. Các
agent có thể muốn override phương thức Agent::timeout() (phương thức này không làm gì cả).
Trong trường hợp Tahoe TCP agent, hai timer được sử dụng: một timer gửi trễ delsnd_timer_ và
một timer phát lại rtx_timer_.
2.3.6.5 Tạo một Agent mới
Để tạo một agent mới, phải làm những việc sau đây:

1. Quyết định cấu trúc kế thừa của nó, và tạo ra các định nghĩa lớp phù hợp.
2. Định nghĩa các phương thức recv() và timeout().
3. Định nghĩa những lớp timer cần thiết nào đó.
4. Định nghĩa các hàm liên kết OTcl.
5. Viết mã OTcl cần thiết để truy nhập agent (Phần 10.6.4).
2.3.7 Timer:
Các bộ định thời được cài đặt cả trong C++ và trong OTcl. Nó thường được dùng trong
các agent.
Cyber Pro !!! :))
25

×