1. Giới thiê uê về côngHỌC
cụ môVIÊô
phỏng
mạng NS..................................................................4
N CÔNG
NGHÊô VIỄN THÔNG
1.1 Tổng
quan....................................................................................................4
HỌC
VIÊô
N
CÔNG
NGHÊô
VIỄNSAU
THÔNG
KHOA QUAN HÊê QUỐC TẾ VÀ
ĐÀO TẠO
ĐẠI HỌC
QUAN
HÊê
QUỐC
TẾ
VÀ
ĐÀO
TẠO
SAU
ĐẠI HỌC
1.2. Bô KHOA
đị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
IP – ỨNG DỤNG VÀ BẢO MÂôT
2.4.2 Kết hợp
IPbiến.......................................................................................15
– ỨNG DỤNG VÀ BẢO MÂôT
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
Thầy hướng dẫn:
Hoàng Đăng Hải
3.2.2. Bộ định trình xếp đống......................................................................20
Học Viên:
Lê Đăng Phong [1-22]
3.2.3 Bộ định trình xếp hàng theo lịch........................................................20
Vũ Anh Tuấn [23-44]
3.2.4 Bộ định trình thời gian thực...............................................................20
Nguyễn Viêtê Thắng [45-66]
Đinh Hải Đăng [67-hết]
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
Hà Nô ôi
4.4 Bộ phân lớp................................................................................................27
4.4.1 Bộ phân lớp địa chỉ.............................................................................30
TIỂU
NNMÔN
TIỂULUÂô
LUÂô
MÔNHỌC
HỌC
i
4.4.2 Bộ phân lớp đa hướng........................................................................30
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
ii
9.6.1. Vídụ: Yêu cầu “ping” (Cấu trúc kế thừa)..........................................70
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
iii
Giới thiê êu công cụ NS
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ây dựng và phát triển bởi trường đại học Berkeley – Mỹ, cho phép mô phỏng nhiều
kiểu mạng IP khác nhau, mô phỏng các giao thức mạng: TCP, UDP cũng như các dạng
nguồ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 NS
cò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ô nê g theo mô hình hướng
đối tượng.
Hình 1: NS theo quan điểm người dùng
Theo 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ản
Tcl 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ác module đượ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ạo
lâ ê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ạo
mô 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ượng
thà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ô êt
mạ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ạo
mô 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ây
dự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ượng củ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ô ê định
trì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 đối
vớ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ài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
4
Giới thiê êu công cụ NS
bô ê định trì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 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ắn vớ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 đổi cá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ời gian 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ết bị 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ần phả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ần chuyể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ủa nó.
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:
giao thứ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ực hiê 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ư
trong trườ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ới mô ê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 định trô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ả NS
phân chia đường dữ liê uê và đường điều khiển riêng biê êt. Để giảm thời gian chương
trì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ên dị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
OTcl tươ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ên trong đố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
quan OTcl, 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ượng OTcl. 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ếp trong 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ựng
hoà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.
C++
OTcl
Hình 2: Sự tương đồng giữa C++ và OTcl
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
5
Giới thiê êu công cụ NS
Hình 3: Mô hình kiến trúc của NS
Hình 3 chỉ ra kiến trúc chung của công cụ mô phỏng NS. Trong hình vẽ này,
người sử dụng thiết kế, triển khai các mô phỏng bằng các câu lê nê h Tcl, sử dụng các
đối tượng mô phỏng từ thư viê ên Otcl, các bô ê định trình sự kiê ên và phần lớn các đối
tượng mạng được xây dựng bằng C++, và các đối tượng này vẫn có thể được sử dụng
như là các đối tượng Otcl thông qua các liên kết. Toàn bô ê các thành phần trong hình 3,
kết hợp lại tạo nên mô tê bô ê công cụ mô phỏng mạng NS, là mô êt bô ê thông dịch Tcl
được mở rô nê g 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ên
mỗ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ình
sự 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ô ê
định thờ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ại mô ê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ều khiể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ê .
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
6
Giới thiê êu công cụ NS
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à định
trì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 định
trong NS. Các bô ê định trình thời gian thực được sử dụng để thực hiê ên viê êc mô phỏng
tươ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ê ên
AtEvent vẫn được xử lý bình thường như các sự kiê nê liên quan đến viê êc xử lý gói
khá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ê ênAtEvent sẽ được thực thi. Ví dụ:
set ns [new Simulator]
$ns use-scheduler Heap
$ns at 300 "finish_sim"
...
proc finish_sim{}{
...
}
Trong ví dụ trên, ta thấy rằng hàm at time "string" là hàm thành viên của đối
tượng Simulator, nhưng cần phải lưu ý rằng đối tượng Simulator chỉ đóng vai trò giao
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
7
Giới thiê êu công cụ NS
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ượng
mạ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ớp
Gố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, định
thờ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ành
phầ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 đối
tượng phức hợp, như các đối tượng nodes hoă êc links chẳng hạn. Các thành phần
mạ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ớpConnector, các đối tượng chuyển
mạch có thể có nhiều đường dữ liê uê đầu ra thuô êc vào lớpClassifier.
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út
và 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ượng
phâ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ổng
như 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.
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
8
Giới thiê êu công cụ NS
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 đối
tượ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ỉ ra
kiể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ượng
Link. 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ên
duplex-link của đối tượng Simulator, hai kết nối đơn trên hai hướng sẽ được tạo ra
như trong hình vẽ 7.
Hình 7: Đường kết nối
Cầ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ượng Link đơn. Các gói khi ra khỏi mô êt hàng đợi Queue, sẽ được chuyển tới đối
tượng Delay, đố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 đối
tượng mô phỏng được chỉ thị theo dõi các tác vụ mạng ( sử dụng lê nê h $ns traceall file hoă êc $ns trace-nam file), thì sau đó các đường kết nối được tạo ra
sẽ đượ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ê ênh create-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ác gó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ói
dữ 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
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
9
Giới thiê êu công cụ NS
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ùng
quan 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ám
sá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 đợi
Khi 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ông
gian dữ liê uê như hình 10
Hình 10: Khuôn dạng gói trong NS
Khuôn dạng mào đầu gói được tạo ra ngay khi đối tượng Simulator được khởi
tạ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ác mà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ượng Agent,
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 gian
dữ 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 ứng
dụ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
ứng dụ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ở.
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
10
Giới thiê êu công cụ NS
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ây
phâ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 theo
lớ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ày có 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-1 giữ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ấp thông dịch, được khởi tạo trong bô ê thông dịch và sẽ được ánh xạ sang mô êt đối
tượng tươ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 định
nghĩa trong lớp TclClass. Các đối tượng tạo bởi người dùng được ánh xạ thông qua cá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ác
trong 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ôn ngữ 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
đầu gó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ững cô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ững thay đổi nhỏ các tham số đầu vào, thay đổi cấu hình hay viê êc tìm hiểu nhanh
chóng mô ê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
tham số, 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ọng hơ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ợp
vớ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ại
dễ 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 qua
tclcl) đưa ra cơ chế cho phép sử dụng các đối tượng và biến trong môi trường cả hai
ngô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ô êt
lầ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
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
11
Giới thiê êu công cụ NS
(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ần phải xây dựng mô tê đối tượng C++ mới.
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 /tclclvà 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ép
người dùng khởi tạo các đối tượng TclObject
- Lớp TclCommand: định nghĩa các câu lê n
ê h thông dịch đơn giản
- Lớp EmbeddedTcl: định nghĩa các hàm để nạp các câu lê n
ê h có sẵn ở múc
cao 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ên C++.
2.3 Lớp Tcl
Lớp Tcl bao bọc toàn bô ê instance thực sự của bô ê thông dịch OTcl và đưa ra
cá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ến
thà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âu
lê ênh
Tcl& tcl = Tcl:instance()
2.3.2 Gọi các hàm OTcl
Có 4 hàm khác nhau để gọi mô êt câu lê nê h OTcl quaTcl instance:
-
tcl.eval(char* s)
tcl.evalc(const char* s)
tcl.eval()
tcl.evalf(const char * s,..)
Những hàm này chỉ khác nhau ở tham số đầu vào, mỗi hàm sẽ chuyển câu lê nê h
dưới dạng chuỗi tới bô ê thông dịch, bô ê thông dịch sẽ kiểm tra câu lê nê h đó và trả về các
kết quả TCL_OK nếu câu lê nê h đúng và TCL_ERROR nếu câu lê nê h sai.
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
12
Giới thiê êu công cụ NS
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à
-
tcl.result(const char * s)
tcl.result(const char * fmt,...)
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 trong
mô ê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óa
tham 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ông
qua 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ên dị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 đối
tượng đó thông qua viê êc gọi hàm dựng init{} với các tham số nhâ nê được từ người
dùng. Sau đó NS sẽ tự đô nê g tạo ra mô êt đối tượng biên dịch tương ứng, đối tượng ánh
xạ 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 đối
tượ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ác
khở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ạo
ra.
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 đối
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
13
Giới thiê êu công cụ NS
tượng phải gọi hàm hủy của lớp cha mô êt cách tường minh ở câu lê nê h cuối cùng trong
hà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àm
delete_shadow{} để xóa bỏ đối tượng biên dịch tương ứng. Cuối cùng bô ê thông
dịch sẽ xóa bỏ đối tượng thông dịch
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ác
biế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ịch
cũ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ả hai
biế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ành
viê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 được
khở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ời gian 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
$object
$object
$object
$object
set
set
set
set
set
realvar 1.2e3
intvar 123
bwvar 1.5mb
timevar 1500m
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ê êc
theo 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ất
hiê ê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ến
kế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ủa
biế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ủa
biế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ữu
biế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ô êng
hà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ẫu cmd{}, đó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ác tham 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 minh
hà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,
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
14
Giới thiê êu công cụ NS
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ạ sang
câ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ượng
TclObjects 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
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ịch
tươ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 đối
tượng mới của lớp RenoTcpAgent. Lớp biên dịch RenoTcpAgent là lớp được dẫn xuất
từ 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ớp
Agent 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 {
public:
RenoTcpClass() : TclClass("Agent/TCP/Reno") {}
TclObject* create(int argc, const char*const* argv) {
return (new RenoTcpAgent());
}
} class_reno;
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ành
viê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ại
khô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ủa
mỗ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ến
thà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ương
tự như viê cê kết hợp biến trong TclObject, bởi vì cơ chế kết hợp biến trong TclObject
dự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ượng TclObject 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àm nà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ướng dẫ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ới
bô ê 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ôi
trườ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].
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
15
Giới thiê êu công cụ NS
Ví dụ:
% ns-version
2.0a12
% ns-random
12334556
2.7 Lớp EmbeddedTcl
NS cho phép phát triển các chức năng hoă êc bằng mã biên dịch hoă êc bằng mã
thông dịch, các mã này sẽ được kiểm tra khi khởi đô êng NS. Chẳng hạn như các thư
viê nê mã ~tclcl/tcl-object.tcl, ~ns/tcl/lib/*.tcl. Viê êc nạp và kiểm tra các mã kịch bản
này sẽ được thực hiê nê thông qua các đối tượng trong lớp EmbeddedTcl.
Cách đơn giản nhất để mở rô êng NS là thêm các mã OTcl hoă êc là vào file tclobject.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ự đô nê g
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ê nê h
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ình
kiể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, sau
khi 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ụng
phả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ến
C++ 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ịch
tươ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.
Có
năm
lớp
biến:
InstVarReal,
InstVarTime,
InstVarBandwidth, InstVarInt và InstVarBool, được sử dụng để kết
hợ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ột
tậ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
đầu bở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ác cấ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ực
hiệ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ác
nhau)
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
16
Giới thiê êu công cụ NS
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ụng
trong 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ển
sự 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ài
ngữ 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]
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ình
hiệ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ác
nhau: 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 động
bở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ành
sau đó 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 được
thự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 đầu
tiê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ùng
mô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àm
trì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.
*/
class Handler {
public:
virtual void handle(Event* event);
};
Hai kiểu của đối tượng được dẫn xuất từ lớp sự kiện gốc: gói và "đang lúc sự
kiện" (at-event). Một at-event là việc thực hiện thủ tục tcl được định trình diễn ra tại
một thời điểm nhất định. Điều này thường xuyên được sử dụng trong kịch bản mô
phỏng. Một ví dụ đơn giản về việc sử dụng chúng như sau:
...
set ns_ [new Simulator]
$ns_ usescheduler Heap
$ns_ at 300.5 "$self complete_sim"
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
17
Giới thiê êu công cụ NS
...
Đoạn mã tcl trên đầu tiên tạo ra đối tượng mô phỏng, sau đó thay đổi bộ định
trình mặc định thành bộ định trình dựa trên việc tạo đống (xem bên dưới) và cuối cùng
định trình hàm $self complete_sim sẽ thực hiện ở thời gian 300.5s. Các at-event được
thi hành như các sự kiện mà trình xử lý thực hiện một cách hiệu quả của bộ thông dịch
tcl.
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ên
kế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ện
chè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 thi
nà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ấu
trú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ời
gian 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ấy
từ 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ột
ngày. Sự thực thi của xếp hàng theo lịch trong ns v2 được đóng góp bởi David
Wetherall
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ới
thờ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ăng
về 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ạng
chậ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 trong
thế 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ết
lậ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ương
phá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ộ định
trì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ạng
củ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
Bài tiểu luâ ân môn học IP-Ứng dụng và bảo mâ ât
18
Giới thiê êu công cụ NS
Simulator instproc halt ;# stop (pause) the scheduler
Simulator instproc flushtrace ;# flush all trace object write
buffers
Simulator instproc createtrace type files src dst ;# create trace
object
Simulator instproc create_packetformat ;# set up the simulator’s
packet format
3.4. Lướt qua về các lệnh
Synopsis:
ns
..
Mô tả: Lệnh cơ bản để chay một kịch bản mô phỏng trong ns. Bộ mô phỏng ns
gọ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ấy
trong 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ụng
trong 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_ halt
dừng lại và tạm dừng bộ định trình.
This stops or pauses the scheduler.
$ns_ run
Chạy bộ định trình This starts the scheduler.
$ns_ at