Tác tử (Agent)

Một phần của tài liệu Nghiên cứu khả năng tương tác với mạng thực của bộ mô phỏng NS-2 (Trang 53)

Các agent được sử dụng để cài đặt các giao thức tại các tầng khác nhau. Các agent đại diện cho các điểm cuối, nơi mà các gói tin tầng mạng được tạo ra hoặc hủy bỏ. Lớp Agent cơ sở được cài đặt trong OTcl(~ns/tcl/lib/ns- agent.tcl) và C++(~ns/agent.cc). Lớp Agent trong C++ định nghĩa các trạng thái của một agent, các trạng thái của agent được sử dụng để tạo gói tin mô phỏng trước khi được gửi đi. Các trạng thái bao gồm:

addr_ địa chỉ của agent (địa chỉ nguồn của gói tin). dst_ địa chỉ đích của gói tin.

size_ kích thước gói tin tính bằng bytes (được đặt trong phần common header – “header chung”).

type_ kiểu gói tin (trong phần common header). fid_ luồng gói tin IP.

prio_ trường ưu tiên. flags_ các cờ của gói tin. defttl_ giá trị ttl mặc định.

Tất cả các agent đều thừa kế từ lớp Agent trong C++. Các hàm thành viên sau được cài đặt trong lớp Agent và không được nạp chồng (over-ridden) bởi các lớp dẫn xuất:

 Packet* allocpkt(): cấp phát một gói tin mới và ấn định các trường của nó.

 Packet* allocpkt(int n): cấp phát một gói tin mới với kích thước n byte dữ liệu và ấn định các trường của nó.

Phương thức allocpkt() được sử dụng bởi lớp dẫn xuất nhằm tạo ra các gói tin để gửi đi. Hàm này điền thông tin vào các trường uid, ptype, size trong phần common header của gói tin và những trường src, dst, flowid, prio, ttl trong phần header của gói tin IP. Điền zero vào những trường ecn, pri, usr1, usr2 cho các cờ của header. Các thông tin còn lại sẽ được bổ sung bởi các lớp dẫn xuất từ Agent.

Những hàm sau đây cũng được định nghĩa bởi lớp Agent nhưng chúng có thể bị ghi đè bởi các lớp dẫn xuất từ Agent:

 void timeout(timeout number)  void recv(Packet*, Handler*)

Phương thức recv() nhận các gói tin từ điểm vào của một Agent, và được gọi bởi những nút gửi khi gửi đi một gói tin. Phương thức timeout xác định thời gian hết hạn của một gói tin.

Danh sách các agent khác nhau hiện tại được NS hỗ trợ tại tầng Giao vận có thể được tìm thấy ở tài liệu [5].

Cách thêm một Agent mới vào bộ mô phỏng NS

NS cho phép người sử dụng mở rộng ngăn xếp các giao thức đã có bằng cách thêm vào các agent tự xây dựng. Chúng tôi sẽ trình bày cách thêm một agent đơn giản MyAgent vào NS. Đầu tiên, chúng ta tạo một lớp đối tượng mạng trong C++ là “MyAgent” thừa kế từ lớp “Agent”. Sau đó, tạo một thể hiện của đối tượng “MyAgent” trong OTcl bằng cách định nghĩa một đối tượng liên kết có tên là “MyAgentClass” dẫn xuất từ lớp “TclClass”. Khi đó, trong chương trình mô phỏng ta có thể tạo đối tượng OTcl thông qua tên “Agent/MyAgentOtcl”

Ví dụ về thành phần C++ và đối tƣợng liên kết

Khi NS khởi động lần đầu, nó tạo ra một đối tượng “MyAgentClass”. Lớp “Agent/MyAgentOTcl” và các phương thức của nó được tạo ra trong không gian OTcl. Sau đó, người sử dụng có thể tạo đối tượng của “MyAgentClass” bằng lệnh “new Agent/MyAgentOtcl”. Khi đó phương thức “MyAgentClass::create” được gọi để tạo đối tượng “MyAgent” và trả về địa chỉ đối tượng được tạo.

Trong không gian OTcl có thể gọi các biến thành viên của đối tượng C++ “MyAgent” bằng cách sử dụng hàm liên kết (binding function) cho mỗi biến trong lớp C++. Hàm liên kết có hai tham số. Tham số thứ nhất là tên biến thành viên sẽ được tạo của lớp “Agent/MyAgentOtcl” tương ứng tham số thứ hai, là địa chỉ của biến thành viên lớp “MyAgent”. Hàm bind tạo liên kết hai chiều giữa các biến của lớp OTcl và các biến trong C++. Vì vậy, ta có thể thay đổi các tham số mô phỏng trong ngôn ngữ OTcl hoặc trong C++. Giả sử lớp “MyAgent” có hai biến là “my_var1” và “my_var2”, ta có thể nhập xuất cho hai biến này từ các kịch bản mô phỏng OTcl. Các hàm bind được đặt trong cấu tử của lớp MyAgent như sau:

Sau đó chúng ta định nghĩa một hàm thành viên “command” trong lớp “MyAgent”. Hàm này giống như một lệnh biên dịch OTcl. Khi người sử dụng gọi một hàm thành viên trong đối tượng OTcl, OTcl sẽ tìm kiếm hàm thành viên này để thực hiện. Trong trường hợp không tìm thấy hàm thành viên được gọi thì OTcl sẽ thực hiện hàm “Agent::command”

Ví dụ về lệnh biên dịch trong OTcl

Một phần của tài liệu Nghiên cứu khả năng tương tác với mạng thực của bộ mô phỏng NS-2 (Trang 53)