4.4.1Giới thiệu
Như đã trình bày phần ở trên, kịch bản mô phỏng mạng được viết bằng ngôn ngữ kịch bản OTcl (OTcl là ngôn ngữ kịch bản tcl, mở rộng phần hướng đối tượng). Chương trình tạo kịch bản mô phỏng kết xuất ra tập tin chứa những dòng lệnh cấu hình cần thiết cho mô phỏng mạng.
Mô hình mạng P2P bao gồm các thiết bị di động có khả năng lưu trữ và tính toán trong môi trường di động, vì vậy NS-2 có định nghĩa các thành phần cơ bản của một thiết bị di động (mobile node), chi tiết xem chương 16 [16]
Chương trình tạo kịch bản mô phỏng – E-MIX Demo gồm các chức năng như sau:
Chương trình mô phỏng
Chương trình tạo kịch bảng mô phỏng
Giao diện chương trình
Network simulator 2 E-MIX K ịch bản (.tcl) OTcl K ết quả (.txt) Tạo kịch bản mô phỏng Phân tíc h
Cấu hình tham số cơ bản cho một mobile node.
Tự phát sinh các file script giả lập các trường hợp truy vấn dữ liệu dựa trên đồ hình vừa xây dựng.
Tạo mô hình kiến trúc mạng P2P.
Tạo các hiệu ứng minh họa quá trình cộng tác chia sẽ giữa các clients.
Phân tích kết quả và vẽ biểu đồ dựa vào tập tin kết quả mô phỏng. Bảng 4-1
4.4.2Giao diện chính của E-MIX Demo
Chi tiết các giao diện chính của E-MIX Demo được liệt kê trong Bảng 4-1 và sơ đồ các màn hình được trình bày ở Hình 4-3.
STT Tên màn hình Ý nghĩa /Ghi chú
1 Form Main Màn hình chính
2 Tab Configuration node Cấu hình mobile node
3 Tab Model Tạo mô hình P2P
4 Tab Animation Tạo hiệu ứng
5 Tab Result Vẽ biểu đồ kết quả
Bảng 4-1 Chi tiết các giao diện chính của E-MIX Demo
4.4.2.1Màn hình “Main” Giao diện Hình 4-4 Màn hình Main Mô tả chức năng Kí hiệu Nút nhấn Giải thích 1 Tab Configuration node
Cấu hình tham số cho mobile node Xuất tập tin lưu vết
Xác định vị trí của từng mobile node Tốc độ di chuyển
Tạo kích thước mô hình mạng Chọn các tiêu chí mô phỏng.
2 Tab Model
Tạo mô hình mạng P2P
Cho phép kéo thả để xác định vị trí theo mong muốn
Thêm dữ liệu cho từng mobile Xác định dữ liệu yêu cầu
Xem bán kính và các đường kết nối giữa các mobile
3 Tab Animation Tạo các hoạt động nhận gửi các gói tin cho mobile node dựa vào kết quả mô phỏng.
4 Tab Result Hiển thị kết quả mô phỏng bằng các dạng biểu đồ Bảng 4-2 Chức năng màn hình "Main" 4.4.2.2Màn hình “Configuration node” Giao diện Hình 4-5 Màn hình "Configuration node" Mô tả chức năng
Kí hiệu Chức năng Giải thích
1 Mobile node Các tham số cấu hình cho mobile node.
2 Trace Chọn tập tin lưu vết các sự kiện mô phỏng mạng
Chọn ngẫu nhiên phát sinh vị trí
4 Movement
Xác định vị trí đích mà mobile node di chuyển đến
Xác định tốc độ di chyển (m/s)
5 Model
Xác định giao thức
Xác định kích thước mô hình mô phỏng(chiều rộng và chiều cao)
6 Criteria Lựa chọn tiêu chí muốn mô phỏng
7 Export Xuất ra tập tin mô phỏng (*.tcl) sau khi mô tả chi tiết các kịch bản mô phỏng.
8 Cancel Thoát chương trình
Bảng 4-3 Chi tiết màn hình "Configuration node"
4.4.2.3Màn hình “Model”
Giao diện
Mô tả chức năng
Kí hiệu Nút nhấn Giải thích
1 Random Phát sinh ngẫu nhiên vị trí từng mobile node, kéo thả từng mobile node để xác định vị trí mong muốn.
2 View radio Xem bán kính phạm vi truyền sóng vô tuyến của từng mobile node
3 View link Xem các đường kết nối giữa các mobile node trong mô hình
Bảng 4-4 Chi tiết màn hình "Model"
4.4.2.4Màn hình “Animation”
Giao diện
Hình 4-7 Màn hình Animation
Mô tả chức năng
Kí hiệu Nút nhấn Giải thích
thiết bị mobile
2 Open Chọn tập tin kết quả mô phỏng(*.txt)
Bảng 4-5 Chi tiết màn hình "Animation"
4.4.2.5Màn hình “Result”
Giao diện
Hình 4-8 Màn hình "Result"
Mô tả chức năng
Kí hiệu Nút nhấn Giải thích
1 Criteria Chọn tiêu chí phân tích kết quả mô phỏng và vẽ biểu đồ.
2 Option Chọn vẽ biểu đồ hình cột hoặc đường gấp khúc.
3 Select Chọn tập tin kết quả mô phỏng (*.txt)
4.5 Thực thi kịch bản mô phỏng
Sau khi tạo kịch bản mô phỏng, chúng tôi dùng NS-2 đã tích hợp kiến trúc MIX để thực thi kịch bản. NS-2 chạy trên hệ điều hành Linux, tuy nhiên chúng tôi thực hiện trên hệ điều hành Window với sự hỗ trợ của bộ giả lập Cygwin [18]. Chúng tôi minh họa NS-2 thực thi một kịch bản thể hiện ở Hình 4-9
Hình 4-9 Ví dụ NS-2 thực thi một kịch bản
Kịch bản mô phỏng được viết bằng ngôn ngữ OTcl, ngôn ngữ này sẽ được giới thiệu ở phần phụ lục B cùng với quá trình download và cài đặt cygwin.
4.6 Kiến trúc E-MIX
Để hiện thực kiến trúc E-MIX đã trình bày chương 3, chúng tôi phải xây dựng một giao thức gọi là giao thức EMixAgent. Trong giao thức EMixAgent chúng tôi xây dựng cấu trúc dữ liệu và các thuật toán đã trình bày chương 3 như: kỹ thuật xử lý nhận và gửi gói tin, xếp lịch thời gian(timer), được tham khảo từ các tài liệu kỹ thuật [16]
4.6.1Giao thức “EMIXAgent”
Chi tiết các lớp trong giao thức EMixAgent được trình bày trong Hình 4-10 và chức năng các lớp được mô tả trong Bảng 4-7.
Hình 4-10 Sơ đồ liên kết các lớp trong giao thức EMixAgent
STT Lớp Mô tả
1 EMixAgent
Đóng vai trò là lớp giao tiếp gửi và nhận các gói tin dữ liệu, có nhiệm vụ liên kết các lớp con tạo thành một giao thức hiện thực kiến trúc E-MIX.
2 RRT Thực hiện nhiệm vụ lưu trữ thông tin của dữ liệu yêu cầu, chức năng được trình bày chương 3.
3 MyCache Đóng vai trò kho lưu trữ dữ liệu.
4 numNeighNeigh
Nhiệm vụ lưu trữ thông tin(profile) số nút vùng của từng mobile, phục vụ tìm đường định tuyến để giải quyết yêu cầu dữ liệu.
5 MyList Nhiệm vụ lưu trữ thông tin hàng xóm của một mobile node.
Bảng 4-7 Chức năng các lớp trong giao thức EMixAgent
4.6.2Kỹ thuật lưu trữ trong kiến trúc E-MIX
4.6.2.1Lớp RRT
Cấu trúc dữ liệu
EMixAgent
RRT có chức năng lưu trữ thông tin của dữ liệu yêu cầu, vì thế chúng tôi dùng kỹ thuật bảng băm để lưu trữ thông tin bảng RRT . Cấu trúc dữ liệu như sau:
class objRRT { public: int _index; nsaddr_t _sender; int _item; int _time; };
typedef std::multimap<int, objRRT> mapRRT;
class RRT { public: mapRRT _mapRRT; int _size; int _index; int TTL;
void Refresh(receiveData, int);
void SaveData(receiveData, int);
nsaddr_t searchItem(int);
int isFull();
void print_RRT();
void init();
void setTTL(int);
int getTTL();
void deleteItem(int);
void deleteItem(int, nsaddr_t);
void sortBySender();
RRT* splitBySender(int &);
int* ConvertRRTToArray(int &); };
Bảng 4-8 Cấu trúc dữ liệu của lớp RRT
Các hàm chức năng
STT Tên hàm Mô tả chức năng
1 void Refresh(receiveData,
int)
Cập nhật nhãn thời gian cho thông tin
2 void SaveData(receiveData,
int)
Lưu trữ thông tin dữ liệu vào RRT
3 nsaddr_t searchItem(int) Tìm kiếm thông tin dữ liệu yêu cầu
4 int isFull() Kiểm tra kích thước RRT
5 void print_RRT() Xuất thông tin lưu trữ trong RRT
6 void init() Khởi tạo thông tin cho RRT
7 void setTTL(int) Gán thời gian quá hạn
8 int getTTL() Lấy thới gian quá hạn
9 void deleteItem(int) Xóa phần tử trong RRT
10 void deleteItem(int,
nsaddr_t)
Xóa phần tử trong một dòng trong RRT với phần tử và MU gửi xác định.
11 void sortBySender() Sắp xếp bảng RRT theo MU gửi
12 RRT* splitBySender(int &) Chia bảng RRT thành mảng các bảng RRT theo từng MU gửi
13 int* ConvertRRTToArray(int
&)
Lấy danh sách các hạng mục dữ liệu có tồn tại trong RRT
Bảng 4-9 Các hàm chức năng của lớp RRT
4.6.2.2Lớp MyCache
Cấu trúc dữ liệu
Lớp MyCache đóng vai trò là kho lưu trữ tại mỗi thiết bị mobile, chúng tôi dùng bảng băm để lưu trữ dữ liệu. Cấu trúc dữ liệu:
class data { public: char _label; int _item; nsaddr_t _IDMU; int _time; bool _allowDel; //Dùng tính giá trị LUV int _last; float _a; int _dem; float _utility; void init(); };
class MyCache { public: int _index; int _size; ITEM _item; int _TTL; MyCache(); void init(); int getSize();
void setSize(int);
data getItem(int);
data addItemp(data);
data* addArrayItem(data*, int, int&, int);
void calcUtility(int);
void deleteitem(int);
void setAllowDel(data, bool);
int searchItem(int, int);
void UpdateItem(data, int);
void print_item();
int isFull();
void setTTL(int);
int getTTL(); };
Bảng 4-10 Cấu trúc dữ liệu của lớp MyCache
Các hàm chức năng
STT Tên hàm Mô tả chức năng
1 MyCache() Hàm khởi tạo
2 void init() Khởi tạo các giá trị ban đầu cho cache
3 int getSize() Lấy kích thước cache
4 void setSize(int) Thiết lập kích thước cache
5 data getItem(int) Lấy dữ liệu trong cache dựa vào chỉ mục
6 data addItemp(data) Lưu trữ dữ liệu vào kho lưu
trữ(cache)
7 data* addArrayItem(data*,
int, int&, int)
Thêm vào cache một mảng các hạng mục dữ liệu.
cache
9 void deleteitem(int) Xóa dữ liệu trong cache
10 void setAllowDel(data,
bool)
Thiết lập cờ được phép xóa cho hạng mục dữ liệu
11 int searchItem(int, int) Tìm kiếm dữ liệu trong cache
12 void UpdateItem(data, int) Cập nhật thông tin hạng mục dữ liệu
13 void print_item() Xuất thông tin trong cache
14 int isFull() Kiểm tra cache đầy
15 void setTTL(int) Thiết lặp giá trị TTL
16 int getTTL() Lấy giá trị TTL
Bảng 4-11 Các hàm chức năng của lớp MyCache
4.6.2.3Lớp numNeighNeigh Cấu trúc dữ liệu class numNeighNeigh { public: int id; int num; MyList idNeigh; };
typedef std::map<int,numNeighNeigh>BUFFER;
Bảng 4-12 Cấu trúc dữ liệu của lớp numNeighNeigh
Mô tả chức năng
Lớp numNeighNeigh là thuộc tính của lớp EMixAgent, có nhiệm vụ lưu trữ thông tin về số lượng nút vùng của một MU.
4.6.2.4Lớp MyList
Cấu trúc dữ liệu
Lớp MyList được dùng để lưu trữ thông tin các hàng xóm của MU. Chúng tôi dùng danh sách liên kết đơn để quản lý lớp MyList, cấu trúc dữ liệu tại mỗi node là thông tin của một thiết bị mobile.
struct node { int info; int _postX; int _posY; char*name; node* pnext; }; struct list { node* phead; node* ptail; int n; }; class MyList { public: list l; public:
void init(list &);
node* getNode(int);
void addNode(list &,node*);
void input(list &,int );
void output(list);
int seachInfo(list,int);
void output_neighbors(list);
void convertArray(list,int[]);
int getNumNode(list);
int isExists(list,int);
int find_MU_previous(list,int);
int getMU_Head(list);
int isEmpty(list); };
Bảng 4-13 Cấu trúc dữ liệu của lớp MyList
Các hàm chức năng
STT Tên hàm Mô tả chức năng
1 void init(list &) Khởi tạo danh sách liên kết đơn
2 node* getNode(int) Lấy địa chỉ một node
3 void addNode(list &,node*) Thêm một node vào danh sách
4 void input(list &,int ) Thêm thông tin vào node
5 void output(list) Xuất thông tin danh sách liên kết
đơn
6 int seachInfo(list,int) Tìm thông tin trong danh sách
liên kết đơn
7 void output_neighbors(list) Xuất thông tin hàng xóm của
một MU
8 void convertArray(list,int[]) Chuyển đổi danh sách liên kết
đơn thành mảng
9 int getNumNode(list) Lấy số lượng hàng xóm trong
danh sách liên kết đơn
10 int isExists(list,int) Kiểm tra một MU có trong danh
sách liên kết đơn.
11 int find_MU_previous(list,int) Tìm ID MU trong danh sách liên
kết đơn.
12 int getMU_Head(list) Lấy MU đầu danh sách liên kết
đơn
13 int isEmpty(list) Kiểm tra danh sách liên kết đơn
rổng.
Bảng 4-14 Các hàm chức năng của lớp MyList
4.6.2.5Lớp EMixAgent
Cấu trúc dữ liệu
Chúng tôi xây dựng giao thức EMixAgent được kế thừa từ giao thức Agent của NS-2, trong giao thức này có sử dụng các thành phần mạng cơ bản của NS-2. Do tính chất kế thừa nên giao thức mà chúng tôi xây dựng có sử dụng các thuộc tính và phương thức có sẳn trong NS-2 như:
packet nsaddr_t
command(int,const char*const*) recv(Packet*, Handler*)
…
class EMixAgent: public Agent {
public:
friend class EMixAgent_PktTime;
friend class PktTime_Timeout;
friend class PktNumNeigh_Timeout;
friend class PktMUInter_Timeout;
friend class PktMU_RRT_Timeout;
friend class PktMU_Neighs_Timeout;
friend class PktMU_receive_result_Timeout;
friend class PktMU_wait_result_Timeout;
friend class PktMU_find_neighs_Timeout;
friend class Pkt_resolve_request_Timeout;
friend class Pkt_join_resquest_Timeout;
friend class Pkt_relay_join_Timeout;
friend class Pkt_resquest_data_for_DN_Timeout;
friend class Pkt_resquest_data_for_broadcast_Timeout;
RRT _RRT; int _sizeCache; nsaddr_t id; int counter; bool result; int sl; int dem; int currentTime; int X; int Y; int numNode; int *request_items; int* original_request_items;
int request_items_size, original_request_items_size;
bool result_routing; int TH; MyList id_neighbors; MyList id_neighbors_temp; MyList buffer_temp; BUFFER _buffer; STORE_PACKET _store_packet; STORE_REQUEST _store_request; STORE_PROFILE _profile; int trace; int traceThongDiepMau; int traceThoiGian; int traceUplink; MyCache _myCache; fstream write; fstream writeThoiGian;
fstream writeNeighs; fstream writeUplink;
receiveData d;
int firstTime;
bool bJoinTimeout, bBroadcastTimeout;
bool bOutputResult;
myRelayJoinClass* lstRelayJoin1;
myRelayJoinClass* lstRelayJoin2;
nsaddr_t* lstRelayJoinSender1;
nsaddr_t* lstRelayJoinSender2;
int lstRelayJoinSize1, lstRelayJoinSize2; EMixAgent(nsaddr_t);
int command(int, const char* const *);
void handleRD_request(Packet*);
void recv(Packet*, Handler*);
void Queue(int*, int);
void timeOut();
void print_position();
bool delItem(int*, int&, int);
void receive_request_Data(Packet*);
void Filter(Packet*);
void replay_result(Packet*);
void request_data_routing();
void reset_numNeigh(MyList);
void initNum();
void update_numNeighs(int, int);
MyList get_idNeighs(int);
int find_max_numNeigh(MyList);
Packet *getPacket();
void SaveNumNeighs(Packet*);
void MU_Inter_request_data_routing();
void MU_Inter_find_Mu_routing();
void find_neighbors();
void MU_inter_receive_request(Packet*);
void feedback(Packet*);
void Save_neighbors(Packet*);
void output_neighbors();
void receive_position(Packet*);
void Print_Buffer();
void replay_find_Mu_routing(nsaddr_t _src);
void receive_rrt_routing(Packet*);
void receive_neighs_routing(Packet*);
void SolveToSource(Packet *, int);
void request_Data(int*, int);
myJoinResquestClass CreateJoinResquestPkt(int*, int&);
void Solve_When_Receive_Join_Resquest(Packet*);
void MU_join_resquest_1();
void QN_broadcast_in_zone();
void QN_output_data();
void output_time(int type);
void output_time(int type, nsaddr_t Mu_gui);
void output_message(nsaddr_t, int);
void output_message(int, nsaddr_t, int);
protected: EMixAgent_PktTime pkt_timer_; PktTime_Timeout pkt_timeout; PktNumNeigh_Timeout pkt_numNeigh_timeout; PktMUInter_Timeout pkt_MUInter_timeout; PktMU_RRT_Timeout pkt_MU_RRT_timeout; PktMU_Neighs_Timeout pkt_MU_Neighs_timeout; PktMU_receive_result_Timeout pkt_MU_receive_result_timeout; PktMU_wait_result_Timeout pkt_MU_wait_result_timeout; PktMU_find_neighs_Timeout pkt_MU_find_neighs_timeout; Pkt_resolve_request_Timeout pkt_resolve_reuqest_timeout; Pkt_join_resquest_Timeout pkt_join_resquest_timeout; Pkt_relay_join_Timeout pkt_relay_join_timeout; Pkt_resquest_data_for_DN_Timeout pkt_resquest_data_for_DN_timeout; Pkt_resquest_data_for_broadcast_Timeout pkt_resquest_data_for_broadcast_timeout; void reset_EMixAgent_pkt(); void numNeigh_timeout(); void MU_Neighs_timeout(); void MU_wait_result_timeout(); void MU_find_neighs_timeout(); };
Bảng 4-15 Cấu trúc dữ liệu lớp EMixAgent
Các hàm chức năng chính
STT Tên hàm Mô tả chức năng
1 EMixAgent(nsaddr_t) Hàm khởi tạo
2
int command(int, const char*
const *) Đọc các lệnh từ script tcl
3
void handleRD_request(Packet*) Thông báo đã nhận gói tin ra màn
hình
4 void recv(Packet*, Handler*)
Hàm dùng để xử lý các gói tin được nhận về
5 void Queue(int*, int)
Tạo hàng đợi các lệnh yêu cầu dữ liệu
6 void timeOut()
Hết thời gian thực hiện truy vấn, phải thống báo kết quả
7 void print_position()
Tìm kiếm và xuất các MU lân cận một bước nhảy của một nút
8
bool delItem(int*, int&, int) Xóa một mục dữ liệu trong mảng
các hạng mục dữ liệu.
9
void
receive_request_Data(Packet*)
Hàm xử lý khi một MU nhận được yêu cầu dữ liệu từ một MU khác.
10 void Filter(Packet*)
Hàm xử lý khi một MU nhận được dữ liệu thật
11 void replay_result(Packet*)
Hàm xử lý khi MU vùng có kết quả, thông báo về cho MU nguồn
12 void request_data_routing()
Hàm xử lý yêu cầu dữ liệu trong phạm vi định tuyến
13 void reset_numNeigh(MyList)
Cập nhật lại danh sách các nút hàng xóm
14 void initNum() Khởi tạo số lượng hàng xóm
15 void update_numNeighs(int, int)
Cập nhật số lượng hàng xóm của một nút
16 MyList get_idNeighs(int) Lấy danh sách hàng xóm
17 int find_max_numNeigh(MyList) Tìm MU có nút vùng lớn nhất
18 Packet *getPacket() Lấy thông tin gói dữ liệu
19 void SaveNumNeighs(Packet*)
Hàm xử lý lưu trữ số lượng nút mạng của các MU trong vùng.
20
void
MU_Inter_request_data_routing() MU trung gian yêu cầu dữ liệu
21 void MU_Inter_find_Mu_routing()
Các MU trung gian giải quyết yêu cầu dữ liệu.
22 void find_neighbors()
Nhiệm vụ tìm hàng xóm của MU khi MU gia nhập vào mạng.
23
void
MU_inter_receive_request(Packet
*)
Mu trung gian nhận dữ liệu yêu cầu và xử lý
24 void feedback(Packet*)
Hàng xóm phản hồi lại những thông tin cần thiết cho MU nguồn.
25 void Save_neighbors(Packet*) Lưu những hàng xóm của MU.
26 void output_neighbors();
Xuất thông tin các hàng xóm ra màn hình.
27 void receive_position(Packet*) Ghi nhận các MU lân cận
28 void Print_Buffer()
Xuất danh sách các MU lân cận của một nút
29
void
replay_find_Mu_routing(nsaddr_t
_src)
MU hồi đáp thông tin dữ liệu
30
void
receive_rrt_routing(Packet*)
Dữ liệu yêu cầu được giải quyết dựa vào RRT
31
void
receive_neighs_routing(Packet*)
Yêu cầu dữ liệu được gửi đến các nút vùng.
32
void SolveToSource(Packet *,
int)
Các MU xử lý khi gói tin từ các nút mạng truyền về cho đến MU nguồn
33 void request_Data(int*, int) MU nguồn nhận yêu cầu dữ liệu