Cấu hình nút về mặt chức năng

Một phần của tài liệu Bài tiểu luận môn hoc IP ứng dụng và bảo mật giới thiệu công cụ ns (Trang 26)

3. Lớp Simlator

4.3 Cấu hình nút về mặt chức năng

4.3.1 Giao diện cấu hình nút

Giao diện cấu hình nút gồm có 2 phần. Phần thứ nhất giải quyết cấu hình nút, phần thứ 2 thực sự tạo ra nút theo kiểu cụ thể. Cấu hình nút gồm có định nghĩa các đặc tính khác nhau của nút trước khi tạo ra chúng, có thể gồm có kiểu cấu trúc đánh địa chỉ trong việc mô phỏng, định nghĩa các thành phần mạng cho các nút di đông, bật hoặc tắt các lựa chọn theo dõi ở mức tác tử, bộ định tuyến hoặc MAC, lựa chọn kiểu các thủ tục định tuyến thay đổi cho các nút không dây hoặc định nghĩa mô hình năng lượng của chúng. Toàn bộ API cấu hình nút như sau:

OPTION_TYPE AVAILABLE OPTION_VALUES

--- ---

$ns_ node-config -addressingType flat or hierarchical or expanded -adhocRouting DSDV or DSR or TORA or AODV

-llType LL -macType Mac/802_11 -propType Propagation/TwoRayGround -ifqType Queue/DropTail/PriQueue -ifqLen 50 -phyType Phy/WirelessPhy -antType Antenna/OmniAntenna -channelType Channel/WirelessChannel -topoInstance $topo_instance -wiredRouting ON or OFF -mobileIP ON or OFF -energyModel EnergyModel

-initialEnergy (in Joules)

-rxPower (in W) -txPower (in W) -agentTrace ON or OFF -routerTrace ON or OFF -macTrace ON or OFF -movementTrace ON or OFF -reset

Giá trị mặc định cho tất cả lựa chọn trên là rỗng trừ kiểu đánh địa chỉ, -addressingType có giá trị mặc định là kiểu phẳng, lựa chọn -reset có thể được lựa chọn để thiết lập lại toàn bộ tham số cấu hình nút mang giá trị mặc định của chúng.

Cấu hình nút cho nút không dây, di động chạy AODV như là giao thức định tuyến adhoc trong cấu trúc mạng phân cấp được chỉ ra dưới đây, chúng ta quyết định bật theo dõi chỉ ở mức tác tử và mức bộ định tuyến. Hơn nữa chúng ta giả sử rằng sơ

đồ kiến trúc mạng đã được tạo ra với lệnh "set topo [new Topography]". Lệnh cấu hình nút như sau:

$ns_ node-config -addressingType hierarchical

-adhocRouting AODV -llType LL -macType Mac/802_11 -ifqType Queue/DropTail/PriQueue -ifqLen 50 -antType Antenna/OmniAntenna -propType Propagation/TwoRayGround -phyType Phy/WirelessPhy -topoInstance $topo -channelType Channel/WirelessChannel -agentTrace ON -routerTrace ON -macTrace OFF -movementTrace OFF

Chú ý rằng lệnh cấu hình có thể ngắt thành những dòng riêng biệt như: $ns_ node-config -addressingType hier

$ns_ node-config -macTrace ON

Các lựa chọn cần phải thay đổi chỉ thay đổi khi được gọi đến, ví dụ sau khi cấu hình cho các nút di động AODV như trên, chúng ta có thể cấu hình cho các nút trạm gốc AODV theo cách sau:

$ns_ node-config -wiredRouting ON

Trong khi tất cả các đặc tính khác của các nút trạm gốc và các nút di động là giống nhau, các nút trạm gốc có khả năng định tuyến hữu tuyến, trong khi các nút di động thì không có khả năng này. Trong trường hợp này chúng ta cần phải thay đổi cấu hình nút chỉ khi nó là bắt buộc.

Tất cả các nút cụ thể được tạo ra sau lệnh cấu hình nút đã cho có cùng thuộc tính trừ khi một phần hoặc tất cả lệnh cấu hình nút được thực hiện với các giá trị tham số khác nhau. Nhưng sau khi tạo ra các nút di động và nút trạm gốc AODV, nếu chúng ta muốn tạo ra các nút đơn, chúng ta sẽ sử dụng lệnh cấu hình nút sau:

$ns_ node-config -reset

Điều này sẽ thiết lập tất cả giá trị các tham số tới giá trị mặc định cơ bản được định nghĩa khi cấu hình một nút đơn.

4.4 Bộ phân lớp

Chức năng của một nút khi nó nhận một gói là xem xét các trường của gói đó, thông thường là địa chỉ đích và một vài trường hợp là địa chỉ nguồn. Sau đó nó ánh xạ các giá trị tới đối tượng giao diện ra của phía người nhận tiếp theo của gói tin này.

Trong ns, nhiệm vụ này được thực hiện bởi đối tượng classifier đơn, Các đối tượng trong bộ đa phân lớp, xem xét việc phân chia cụ thể của việc chuyển gói tin qua nút. Một nút trong ns sử dụng nhiều kiểu khác nhau của bộ phân lớp cho nhiều mục đính khác nhau. Trong phần này xem xét một vài đối tượng phân lớp chung hơn, đơn giản hơn trong ns.

Chúng ta bắt đầu mô tả lớp cơ sở trong phần này. Đoạn tiếp theo sẽ mô tả bộ phân lớp địa chỉ (4.4.1), bộ phân lớp đa hướng (4.4.2), bộ phân lớp đa đường (4.4.3) và cuối cùng bộ tái tạo (bản sao)(4.4.5)

Bộ phân lớp cung cấp cách đối xử với một gói tin dựa vào vài điều kiện logic và lấy tham chiếu tới đối tượng mô phỏng khác dựa trên kết quả tính toán. Mỗi bộ phân lớp gồm có một bảng các đối tượng mô phỏng được đánh chỉ mục bằng số khe (slot number). Công việc của một bộ phân lớp là xác định số khe kết hợp với gói tin nhận được và chuyển gói tin này tới đối tượng được tham chiếu bởi khe liên quan. Lớp Classifier cung cấp một lớp cơ sở từ đó các bộ phân lớp khác được dẫn xuất từ lớp này.

class Classifier : public NsObject { public:

~Classifier();

void recv(Packet*, Handler* h = 0);

protected:

Classifier();

void install(int slot, NsObject*); void clear(int slot);

virtual int command(int argc, const char*const* argv);

virtual int classify(Packet *const) = 0;

void alloc(int);

NsObject** slot_; /* table that maps slot number to a NsObject */

int nslot_; int maxslot_;

};

Phương thức classify() là hoàn toàn ảo, chỉ định lớp Classifier được sử dụng như một lớp gốc, phương thức alloc() cấp phát động không gian đủ cho bảng chứa số cụ thể của các khe. Phương thức install() và clear() thêm vào hoặc xóa bỏ các đối tượng từ bảng này. Phương thức recv() và giao diện OTcl là được thực thi như sau:

/*

* objects only ever see "packet" events, which come either

* from an incoming link or a local agent (i.e., packet source).

*/

void Classifier::recv(Packet* p, Handler*)

{

NsObject* node;

int cl = classify(p);

if (cl < 0 || cl >= nslot_ || (node = slot_[cl]) == 0) {

Tcl::instance().evalf("%s no-slot %d", name(), cl); Packet::free(p);

return;

}

node->recv(p);

}

int Classifier::command(int argc, const char*const* argv)

{

Tcl& tcl = Tcl::instance();

if (argc == 3) {

/*

* $classifier clear $slot */

if (strcmp(argv[1], "clear") == 0) {

int slot = atoi(argv[2]);

clear(slot);

return (TCL_OK);

} /*

* $classifier installNext $node

*/

if (strcmp(argv[1], "installNext") == 0) {

int slot = maxslot_ + 1;

NsObject* node =

(NsObject*)TclObject::lookup(argv[2]); install(slot, node);

if (strcmp(argv[1], "slot") == 0) {

int slot = atoi(argv[2]);

if ((slot >= 0) || (slot < nslot_)) {

tcl.resultf("%s", slot_[slot]->name());

return TCL_OK; }

tcl.resultf("Classifier: no object at slot %d", slot);

return (TCL_ERROR);

}

} else if (argc == 4) { /*

* $classifier install $slot $node

*/

if (strcmp(argv[1], "install") == 0) {

int slot = atoi(argv[2]);

NsObject* node = (NsObject*)TclObject::lookup(argv[3]); install(slot, node);

return (TCL_OK);

}

}

return (NsObject::command(argc, argv)); }

Khi bộ phân lớp recv() nhận một gói tin nó gọi phương thức classify(), khuôn mẫu thông thường là phương thức này xác định và trả về chỉ mục của khe trong bảng về số các khe. Nếu chỉ mục là hợp lệ, và chỉ tới TclObject hợp lệ, bộ phân lớp sẽ xử lý gói tin này tới các đối tượng sử dụng phương thức recv() của đối tượng. Nếu chỉ mục này là không hợp lệ, bộ phân lớp sẽ gọi đến một thủ tục no-slot{} để cố gắng đưa đến một bảng phù hợp. Tuy vậy trong lớp gốc Classifier::no-slot{} in ra thông báo lỗi và ngắt sự thực hiện.

Phương thức command() cung cấp theo các thủ tục tương tự tới bộ thông dịch: clear{(slot)} xóa điểm vào trong một khe riêng biệt

installNext {(object)} cài đặt đối tượng trong khe khả dụng tiếp theo và trả về số khe.

slot {(index)} trả về đối tượng được lưu trữ trong một khe nào đó install {(index), (object)} cài đặt một đối tượng nào đó trong một khe

Chú ý rằng các thủ tục tương tự cũng là được nạp chồng bởi một thủ tục cụ thể có cùng tên mà nó lưu trữ một tham chiếu tới đối tượng được lưu trữ.

4.4.1 Bộ phân lớp địa chỉ

Một bộ phân lớp địa chỉ được sử dụng hỗ trợ chuyển gói tin đơn hướng. Nó áp dụng một bit trạng thái shift và mask thao tác địa chỉ đích của gói tin đưa ra số khe, số khe này được trả về từ phương thức classify(). Lớp AddressClassifier được định nghĩa như sau:

class AddressClassifier : public Classifier {

public:

AddressClassifier() : mask_(~0), shift_(0) {

bind("mask_", (int*)&mask_);

bind("shift_", &shift_);

}

protected:

int classify(Packet *const p) {

IPHeader *h = IPHeader::access(p->bits());

return ((h->dst() >> shift_) & mask_);

}

nsaddr_t mask_;

int shift_; };

Lớp này lợi dụng việc không có ý nghĩa về ngữ nghĩa trực tiếp trong trường địa chỉ đích của gói tin. Đúng hơn là, nó trả về vài số của bit từ trường dst_ của gói tin như là số khe được dùng trong phương thức Classifier::recv(). Giá trị của mask_ và shift_ được thiết lập qua OTcl.

4.4.2 Bộ phân lớp đa hướng

Bộ phân lớp đa hướng phân loại các gói tin theo cả hai địa chỉ nguồn và đích (nhóm địa chỉ). Nó duy trì bảng ánh xạ cặp địa chỉ nguồn/ nhóm và các số khe. Khi mà một gói tin chứa địa chỉ nguồn/nhóm không rõ đến bộ phân lớp, nó gọi đến một thủ tục Otcl Node::new-group{} để thêm một điểm vào cho bảng này. Thủ tục OTcl này có thể sử dụng phương thức set-hash để thêm 3 phần (nguồn, nhóm, khe) vào bảng của bộ phân lớp. Bộ phân lớp đa hướng được định nghĩa như sau:

static class MCastClassifierClass : public TclClass {

public:

MCastClassifierClass() : TclClass("Classifier/Multicast") {}

TclObject* create(int argc, const char*const* argv) {

public:

MCastClassifier();

~MCastClassifier();

protected:

int command(int argc, const char*const* argv); int classify(Packet *const p);

int findslot();

void set_hash(nsaddr_t src, nsaddr_t dst, int slot);

int hash(nsaddr_t src, nsaddr_t dst) const {

u_int32_t s = src ^ dst; s ^= s >> 16; s ^= s >> 8; return (s & 0xff); } struct hashnode { int slot; nsaddr_t src; nsaddr_t dst; hashnode* next; }; hashnode* ht_[256];

const hashnode* lookup(nsaddr_t src, nsaddr_t dst) const;

};

int MCastClassifier::classify(Packet *const pkt)

{

IPHeader *h = IPHeader::access(pkt->bits()); nsaddr_t src = h->src() >> 8; /*XXX*/

nsaddr_t dst = h->dst();

const hashnode* p = lookup(src, dst);

if (p == 0) {

/*

* Didn’t find an entry.

* Call tcl exactly once to install one.

* If tcl doesn’t come through then fail.

*/

Tcl::instance().evalf("%s new-group %u %u", name(), src, dst);

if (p == 0)

return (-1);

}

return (p->slot);

}

Lớp MCastClassifier thực thi một bảng băm theo chuỗi và sử dụng hàm băm trong cả nguồn gói tin và địa chỉ đích. Hàm băm trả về số khe đánh chỉ mục trong bảng slot_ tại đối tượng ưu tiên. Một điểm băm thiếu ngụ ý gói tin được giao tới nhóm không biết rõ trước đó, OTcl sẽ được gọi để xử lý tình huống này. Mã OTcl mong muốn chèn một điểm vào thích ứng trong bảng băm

Một phần của tài liệu Bài tiểu luận môn hoc IP ứng dụng và bảo mật giới thiệu công cụ ns (Trang 26)