Khái niệm hiệu năng mạng
Hiệu năng mạng là một vấn đề phức tạp do các yếu tố có thể tổng hợp đưa ra nhằm đánh giá vấn đề hiệu năng chưa thực sự rõ ràng. Đã có nhiều khái niệm, tham số được đưa ra nhằm minh chứng cho bản chất của vấn đề hiệu năng, lý giải cho việc truyền thông tin hiệu quả hay kém hiệu quả giữa các hệ thống trong mạng. Tuy nhiên, trong thực tế rất cần có những khái niệm bản chất và sát thực tiễn với mục tiêu đánh giá được toàn bộ vấn đề hiệu năng bao gồm cả các yếu tố đo đạc, theo dõi, điều khiển đều được tính đến. Có thể sơ lược khái niệm hiệu năng mạng như sau: Hiệu năng mạng là hiệu quả và năng lực hoạt động của hệ thống mạng. Như vậy, việc đánh giá hiệu năng mạng chính là tính toán và xác định hiệu quả, năng lực thực sự của hệ thống mạng trong các điều kiện khác nhau.
75 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 4733 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Tổng quan đánh giá hiệu năng mạng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Các hàng đợi biểu diễn các vị trí mà các gói tin có thể được giữ lại hoặc bị bỏ đi. Lập trình gói tin liên quan tới việc xử lí quyết định thường dùng để lựa chọn các gói tin được sử dụng hay sẽ bị bỏ đi. Việc quản lí bộ đệm liên quan tới các phương pháp riêng biệt thường dùng để điều chỉnh lại thời gian chiếm đóng của một hàng đợi riêng biệt. Hiện tại, việc hỗ trợ bao gồm hàng đợi FIFO, quản lí bộ đệm RED, CBQ (bao gồm lập trình ưu tiên và lập trình xoay vòng), và các khác biệt của hàng đợi phiên và bao gồm cả hàng đợi phiên (Fair Queueing), Stochastic Fair Queueing (SFQ) và Deficit Round-Robin (DDR). Trong trường hợp thông thường, một phần tử delay là yếu tổ tải về từ hàng đợi, hàng đợi có thể bị chặn lại cho đến khi nó được cho phép trở lại bởi các dòng tải xuống lân cận nó. Đây là một kĩ thuật được gọi là giả vờ trì hoãn truyền thông. Thêm vào đó, hàng đợi có thể bị chặn nhiều hơn hoặc được cho phép ớ một thời gian tùy ý bởi lân cận của chúng (thường sử dụng thực thi đa hàng đợi tập hợp các hàng đợi với việc điều khiển luồng hàng đợi trong). Các gói tin bị bỏ được thực thi trong trường hợp các hàng đợi đó chứa một đích đến bị bỏ, đó là, một đối tượng nhận tất cả các gói tin bị bỏ bởi một hàng đợi. Điều này có thể hữu ích trong việc thống kê các gói tin bị bỏ.
Lớp C++ Queue
Lớp Queue có nguồn gốc từ một lớp kết nối cơ bản. Nó cung cấp một lớp cơ bản sử dụng bởi các kiểu lớp hàng đợi riêng biệt, giống như việc gọi lại hàm thực thi việc blocking.
Dưới đây định nghĩa các ứng dụng trong queue.h:
class Queue : public Connector {
public:
virtual void enque(Packet*) = 0;
virtual Packet* deque() = 0;
void recv(Packet*, Handler*);
void resume();
int blocked();
void unblock();
void block();
protected:
Queue();
int command(int argc, const char*const* argv);
int qlim_;/*số lượng các gói tin lớn nhất cho phép trong hàng đợi*/
int blocked_;
int unblock_on_resume_; /* có phá khoá q khi nhàn rỗi */
QueueHandler qh_;
};
Các hàm enque và deque là các lớp ảo, chỉ ra lớp Queue được dùng như một lớp cơ sở. Các hàng đợi riêng biệt có nguồn gốc từ Queue và thực thi hai hàm này như một điều cần thiết. Nhìn chung các hàng đợi riêng biệt không ghi đè lên hàm recv bởi vì nó đưa ra các hàm enque và deque riêng biệt.
Lớp Queue không chứa nhiều các trạng thái nội bộ. Thông thường những cái đó là các đối tượng kiểm tra đặc biệt. thành phần qlim_ được đặt ra để chỉ định một giới hạn lớn nhất chiếm giữ hàng đợi nhưng lại không chịu ảnh hưởng (không có hiệu lực ) bởi chính lớp Queue, nó được sử dụng bởi các lớp queue phụ riêng biệt nếu thấy cần giá trị này. Thành phần blocked_ là một giá trị logic chỉ định bất cứ khi nào hàng đợi có thể gởi các gói tin ngay tức khắc tới các dòng tải xuống lân cận của nó. Khi một hàng đợi bị khóa, nó có thể cho vào hàng đợi nhưng không gởi chúng.
Khoá hàng đợi
Một hàng đợi có thể bị khóa hay không ở bất kì thời gian nào. Thông thường, một hàng đợi bị khóa khi một gói tin quá cảnh giữa nó và các dòng tải xuống lân cận nó (phần lớn thời gian nếu hàng đợi bị đầy). Một hàng đợi bị khóa sẽ bị khóa chừng nào liên kết các dòng tải xuống bận và hàng đợi có ít nhất một gói tin được gởi đi. Một hàng đợi được phá khó a chỉ khi hàm cho phép nó tiếp tục được đưa ra (có nghĩa là việc lập trình một dòng tải xuống lân cận nó thông qua việc gọi lại), thường thì khi không có gói tin nào trong hàng đợi. Việc gọi lại được thực thi bằng cách sử dụng các lớp và các phương thức dưới đây:
class QueueHandler : public Handler
{
public:
inline QueueHandler(Queue& q) : queue_(q) {}
void handle(Event*); /* gọi queue_.resume() */
private:
Queue& queue_;
};
void QueueHandler::handle(Event*)
{
queue_.resume();
}
Queue::Queue() : drop_(0), blocked_(0), qh_(*this)
{
Tcl& tcl = Tcl::instance();
bind("limit_", &qlim_);
}
void Queue::recv(Packet* p, Handler*)
{
enque(p);
if (!blocked_) {
p = deque();
if (p != 0) {
blocked_ = 1;
target_->recv(p, &qh_);
}
}
}
void Queue::resume()
{
Packet* p = deque();
if (p != 0)
target_->recv(p, &qh_);
else {
if (unblock_on_resume_)
blocked_ = 0;
else
blocked_ = 1;
}
}
Việc quản lí điều khiển ở đây khôn khéo hơn một chút. Khi một đối tượng Queue mới được tạo ra, nó 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 (Queue&QueueHandler::queue_). Điều này thực thi bởi Queue đang sử dụng biểu thức qh_(*this). Khi một Queue nhận một gói nó gọi lớp phụ (có nghĩa là hàng đợi đặc tả phương pháp) của hàm enque với gói tin. Nếu hàng đợi không bị khóa, nó cho phép gởi một gói tin và gọi hàm deque xác định gói tin đã gởi, khóa hàng đợi (bởi vì có một gói tin đang quá cảnh), và gởi gói tin tới dòng tải xuống lân cận nó. Chú ý rằng bất cứ gói tin nào nhận được trong tương lai từ dòng tải lên lân cận sẽ đưa đến một hàng đợi bị khóa. Khi một dòng tải xuống yêu cầu nguyên nhân lí do hàng đợi bỏ khóa nó lập trình cho hàm điều khiển của QueueHandler thông qua qh_ để lập trình mô phỏng. Hàm điều khiển bắt đầu lại, sẽ gởi theo dòng tải xuống gói tin được lập trình tiếp theo (và rời khỏi hàng đợi bị khóa.), hoặc bẻ khóa hàng đợi khi không có gói tin nào sẵn sàng được gởi đi. Việc xử lí này cũng có thể làm gọn gàng hơn với đề nghị của phương thức LinkDelay::recv().
Lớp PacketQueue.
Lớp Queue có thể thực thi việc quản lí bộ đệm và lập trình nhưng không thực thi các hoạt động cấp thấp trên một hàng đợi riêng biệt. Lớp PacketQueue được sử dụng cho mục đích này, và được định nghĩa như sau:
class PacketQueue {
public:
PacketQueue();
int length(); /* chiều dài hàng đợi trong các gói tin */
void enque(Packet* p);
Packet* deque();
Packet* lookup(int n);
/* Xóa một gói tin đặc biệt trong hàng đợi */
void remove(Packet*);
protected:
Packet* head_;
Packet** tail_;
int len_; // số gói tin
};
Lớp này giữ một danh sách liên kết các gói tin, và thông thường được sử dụng bởi việc lập trình riêng biệt và quản lí bộ đệm để giữ một trật tự thiết lập các gói tin. Việc lập trình riêng biệt hay sự sắp xếp quản lí hệ thống bộ nhớ có thể sử dụng nhiều đối tượng PacketQueue. Lớp PacketQueue quản lí việc đếm các gói tin hiện tại trong hàng đợi được trả về bằng phương thức length(). Hàm enque đặt gói tin ở cuối hàng đợi và cập nhật lại biến thành viên len_. Hàm deque trả về gói tin ở đầu hàng đợi và xóa nó khỏi hàng đợi (và cập nhật lại biến đếm counter), hay trả về NULL néu hàng đợi rỗng. Hàm lookup trả về gói tin nth ở đầu hàng đợi, hay NULL trong các trường hợp khác. Hàm remove xóa gói tin lưu trữ trong địa chỉ lấy từ hàng đợi (và cập nhật lại biến đếm). Nó tạo ra một chương trình không bình thường và kết thúc nếu gói tin không tồn tại.
Ví dụ : Drop Tail
Ví dụ dưới đây làm sáng tỏ việc thực thi đối tượng Queue/DropTail, thực thi lập trình FIFO và việc quản lí bộ đệm bỏ trên luồng (drop-on-overflow) trong hầu hết các router Internet ngày nay. Định nghĩa dưới đây sẽ trình bày các lớp và kết nối Otcl của nó:
class DropTail : public Queue {
protected:
void enque(Packet*);
Packet* deque();
PacketQueue q_;
};
Lớp cơ sở Queue, DropTail xuất phát từ đó, cung cấp hầu hết các chức năng cần thiết. Hàng đợi drop-tail duy trì chính xác một hàng đợi FIFO, thực thi bởi việc bao gồm một đối tượng của lớp PacketQueue. Drop-tail thực thi chính phiên bản của enque và deque như sau:
void DropTail::enque(Packet* p)
{
q_.enque(p);
if (q_.length() >= qlim_)
{
q_.remove(p);
drop(p);
}
}
Packet* DropTail::deque()
{
return (q_.deque());
}
Ở đây, hàm enque đầu tiên lưu trữ gói tin trong hàng đợi các gói tin bên trong (không bị giới hạn), và sau đó kiểm tra kích thước của hàng đợi gói tin thông qua qlim_. Drop-on-overflow được thực thi bằng cách bỏ đi hầu hết các gói tin vừa được thêm vào hàng đợi gói tin nếu đã đạt đến hay vượt qua giới hạn. Việc thực thi trên enque, thiết lập qlim_ lên n trên thực tế có nghĩa là kích thước của hàng đợi là n-1. lập trình FIFO đơn giản được thực thi trên hàm deque bởi việc thường xuyên trả về gói tin đầu tiên trong hàng đợi gói tin.
Các kiểu khác nhau của các đối tượng Queue
Một đối tượng hàng đợi là một lớp tổng quát của đối tượng có khả năng giữ và đánh dấu một cách hợp lí hay loại bỏ các gói tin như chúng di chuyển thông qua mô phỏng topology. Các tham số cấu hình cho các đối tượng hàng đợi là:
limit_ kích thước hàng đợi của các gói tin.
blocked_ mặc định là false, nó bật lên true khi hàng đợi bị khoá (không cho phép gởi các gói tin tới dòng tải xuống lân cận của nó).
unblocked_on_resume_ mặc định bằng true, chỉ ra một hàng đợi nên bẻ khóa tại thời điểm gói tin cuối cùng được gởi đi (không nhất thiết phải được nhận).
Các đối tượng hàng đợi khác xuất phát từ lớp cơ sở khác là các đối tượng hàng đợi drop-tail, FQ, SFQ, DRR, RED và CBQ. Mỗi cái được mô tả như sau:
Đối tượng drop-tail: là một lớp con của các đối tượng Queue thực thi hàng đợi FIFO đơn giản.
Đối tượng FQ: là lớp con của các đối tượng Queue thực thi hàng đợi phiên, không có phương thức nào đặc trưng cho các đối tượng FQ. Các tham số cấu hình là:
+ secsPerByte_ không có các biến trạng thái kết hợp với đối tượng này.
+ Đối tượng SFQ: là một lớp con của các đối tượng Queue thực thi hàng đợi Stochastic Fair. Không có phương thức nào đặc trưng cho đối tượng này. Các tham số cấu hình là:
+ maxqueue_
+ buckets_ không có biến trạng thái nào kết hợp vói đối tượng này.
Đối tượng DRR: là một lớp con của các đối tượng Queue thực thi lập trình xoay vòng. Những đối tượng này thực thi việc lập trình xoay vòng giữa các luồng khác nhau( một luồng riêng biệt là một luồng có các gói tin với node và port id gói tin OR giống nhau). Cũng khác với các đối tượng đa hàng đợi khác, đối tượng hàng đợi này thực thi một sự chia sẻ không gian bộ đệm cho các luồng khác. Các tham số cấu hình là:
+ buckets_ chỉ ra tổng số bucket thường dùng cho việc hashing mỗi luồng.
+ blimit_ chỉ ra kích thước bộ đệm chia sẻ bằng byte.
+ quantum_ chỉ ra số byte quay vòng của mỗi luồng.
+ mask_ khi được bật lên 1, có nghĩa là một luồng riêng biệt chứa các gói có các node id giống nhau (các port id có thể khác nhau), khác 1 là các luồng chứa các node id và các port id giống nhau.
Đối tượng RED: là một lớp con của các đối tượng Queue thực thi ngẫu nhiên ở cac gateway phát hiện sớm. Đối tượng chỉ có thể cấu hình bỏ hay đánh dấu các gói tin. Không có một phương thức đặc biệt nào cho các đối tượng này. Các tham số cấu hình là:
+ bytes_ lập bằng true cho phép RED chế độ byte, là kích thước của các gói tin đến có khả năng ảnh hưởng đến việc đánh dấu (hay loại bỏ) các gói tin
+ queue-in-bytes_ lập bằng true để đo kích thước hàng đợi trung bình bằng byte tốt hơn các gói tin. Cho phép tuỳ chọn này cũng là nguyên nhân thresh_ và maxthresh_ tự động scaled bởi vì mean_pktsize_ .
+ thresh_ Giới hạn nhỏ nhất của kích thước hàng đợi trung bình trong các gói tin.
+ maxthresh_ Giới hạn lớn nhất của kích thước hàng đợi trung bình trong các gói tin.
+ mean_pktsize_ Ước lượng kích thước gói tin trung bình bằng byte. Sử dụng cập nhật việc tính toán kích thước hàng đợi trung bình sau thời gian nhàn rỗi.
+ q_weight_ Trọng lượng hàng đợi, used in the exponential-weightedmoving average để tính hàng đợi trung bình.
+ wait_ Thiết lập bằng true để duy trì một khoảng thời gian giữa các gói tin bị bỏ.
+ linterm_ Thay đổi kích thước trung bình của hàng đợi giữa “thresh_” và “maxthresh_”, việc loại bỏ các gói tin có khả năng thay đổi giữa 0 và 1.
+ setbit_ thiết lập bằng true để đánh dấu các gói tin bằng việc thiết lập bit tắc nghẽn trong header gói tin rather than loại bỏ các gói tin.
+ drop-tail_ Thiết lập bằng true để sử dụng drop-tail tốt hơn là loại bỏ ngẫu nhiên khi hàng đợi bị tràn hoặc kích thước trung bình hàng đợi đạt đến “maxthresh_”.
Các đối tượng CBQ: là lớp con của các đối tượng thực thi hàng đợi lớp cơ sở.
$cbq insert
Thêm lớp lưu lượng vào cấu trúc chia sẻ liên kết phù hợp với việc liên kết các đối tượng cbq.
$cbq bind [$id2]
Nguyên nhân chứa luồng id id1 (hoặc trong dãi từ id1 đến id2) phù hợp với lớp lưu lượng cbqclass.
$cbq algorithm
Chọn thuật toán bên trong CBQ. có thể thiết lập một trong các kiểu: “ancestor-only”, “top-level”, hoặc “formal”.
Các đối tượng CBQ/WRR: là một đối tượng con của các đối tượng CBQ thực thi lập trình xaoy vòng giữa các lớp của các lớp ưu tiên giống nhau. Các tham số cấu hình là:
+ maxpkt_ Kích thước lớn nhất của một gói tin bằng byte. Điều này chỉ được sử dụng chỉ bởi các đối tượng CBQ/WRR trong việc tính toán tần số băng thông lớn nhất cho việc lập trình xoay vòng.
CBQCLASS OBJECTS
Thực thi lớp lưu lượng phù hợp với các đối tượng CBQ.
+ $cbqclass setparams :thiết lập một số tham số cấu hình cho lớp lưu lượng CBQ
+ $cbqclass parent Đặc tả nguồn gốc của các lớp trong cây chia sẻ liên kết. Nguồn gốc có thể đặc tả “none” để chỉ cây rỗng.
+ $cbqclass newallot
Thay đổi vị trí liên kết của lớp này tới một số từ 0 tới 1..
+ $cbqclass install-queue
Cài đặt một đối tượng Queue ghép vào cấu trúc liên kết CBQ hay CBQ/WRR. Khi một đối tượng CBQ được khởi tạo. Nó không bao gồm hàng đợi bên trong. Các tham số cấu hình là:
+ okborrow_ là giá trị chỉ ra một lớp được cho phép mượn băng thông từ gốc của nó.
+ allot_ là phân số lớn nhất của băng thông liên kết chỉ định cho một lớp nhằm mục đích riêng biệt như là một số thực giữa 0 và 1.
+ maxidle_ Là thời gian lớn nhất mà một lớp yêu cầu có được hàng đợi gói tin của nó trước khi chúng được cho phép hướng tới.
+ priority_ là cấp ưu tiên của lớp đối với các lớp khác. Giá trị này có thể nằm trong dãi từ 0 đến 10, và có nhiều hơn một lớp cùng tồn tại trong một mức ưu tiên giống nhau. Mức ưu tiên 0 là mức ưu tiên cao nhất .
+ level_ là cấp của lớp này trong cây chia sẻ liên kết. Node lá trong cây được xem như ở cấp 1 còn node cha ở cấp 2.
+ extradeley_ tăng độ trì hoãn bằng một lớp delay bằng cách đặc tả thời gian.
QUEUE-MONITOR OBJECTS
Các đối tượng QueueMonitor được sử dụng giám sát việc thiết lập gói tin hay các byte đến, khởi hành hay loại bỏ bộ đếm. Nó cũng bao gồm việc hỗ trợ tập hợp thống kê như là kích thước trung bình của hàng đợi.
+ $queuemonitor
Khởi động lại tất cà các bộ đếm tích luỹ được miêu tả dưới đây xuống bằng 0 (đến, khởi hành, loại bỏ). Cũng có thể khởi động lại tích phân , độ trễ nếu được định nghĩa.
+ $queuemonitor set-delay-samples
Thiết lập các đối tượng mẫu delaySamp_ vào bản ghi thống kê về độ trễ hàng đợi. delaySamp_ điều khiển một đối tượng Samples có nghĩa là đối tượng Samples sẵn sàng được tạo ra.
+ $queuemonitor get-bytes-integrator
Trả về một đối tượng Intergrator có thể được sử dụng để tìm kiếm kích thước hàng đợi toàn vẹn bằng byte.
+ $queuemonitor get-pkts-integrator
Trả về một đối tượng Intergrator có thể được sử dụng để tìm kiếm kích thước hàng đợi trong các gói tin.
+ $queuemonitor get-delay-samples
Trả về một đối tượng Samples delaySamp_ vào bản ghi thống kê về độ trễ hàng đợi. Không có các tham số cấu hình cho các đối tượng này. Các biến trạng thái là:
+ size_ Kích thước hàng đợi tức thời bằng byte.
+ pkts_ Kích thước hàng đợi tức thời bằng các gói tin.
+ parrivals_ tổng số gói tin đã đến.
+ barrivals_ tổng các byte chứa trong các gói tin đã đến.
+ pdepartures_ Tổng các gói tin đã chết (không bị loại bỏ).
+ bdepartures_ Tổng các byte chứa trong các gói tin đã chết.
+ pdrops_ Tổng số các gói tin bị loại bỏ.
+ bdrops_ Tổng số các byte bị loại bỏ.
+ bytesInt_ Đối tượng Integrator được tính toán bên trong kích thước của hàng đợi bằng byte. Biến sum_ của đối tượng này tính tổng kích thước của hàng đợi bằng byte.
+ pktsInt_ Đối tượng Integrator được tính toán bên trong kích thước của hàng đợi bằng các gói tin. Biến sum_ của đối tượng này tính tổng kích thước của hàng đợi bằng các gói tin.
QUEUEMONITOR/ED OBJECTS
Nguồn gốc các đối tượng này có khả năng khác nhau .
Một vài hàng đợi phân biệt việc loại bỏ các gói tin đến do hết bộ đệm và loại bỏ ngẫu nhiên các gói tin đến như trong hàng đợi RED. Dưới đây là một số trường hợp hữu ích để phân biệt hai loại.
Các biến trạng thái:
+ epdrops_ Số gói tin có thể bị loại bỏ sớm.
+ ebdrops_ số các byte gồm có các gói tin bị loại bỏ sớm.
Lớp này là một lớp con của lớp QueueMonitor, các đối tượng thuộc kiểu này cũng có các trường như pdrops_ và bdrops_. Những trường này sẽ miêu tả tổng số các gói tin và các byte bị loại bỏ, bao gồm cả sớm và không sớm.
QUEUEMONITOR/ED/FLOWMON OBJECTS
Những đối tượng này có thể được sử dụng theo qui ước các đối tượng QueueMonitor khi tập hợp các biến đếm trên luồng và thống kê việc thêm vào tập hợp cac biến đếm và thống kê các cung cấp bởi lớp cơ sở QueueMonitor.
$fmon classifier
Việc thêm vào này phân lớp luồng giám sát đối tượng. Điều này thường được dùng để ánh xạ các gói tin đến luồng phù hợp với chúng.
$fmon dump
Kết xuất biến đếm trên luồng hiện tại và thống kê kênh nhập/xuất trong các hoạt động kèm theo trước đó.
$fmon flows
Trả về một chuỗi kí tự chứa tên tất cả các luồng được biết đến bởi luồng giám sát này. Mỗi đối tượng này thuộc kiểu QueueMonitor/ED/Flow.
$fmon attach
Đính kèm một kênh nhập xuất Tcl tới luồng giám sát. Thống kê luồng được viết ra kênh khi hoạt động kết xuất được thực thi.
Các tham số cấu hình là.
+ enable_in_ Mặc định bằng true, chỉ ra trạng thái các luồng đến được duy trì bởi luồng giám sát. Nếu nó là false, chỉ thông tin khởi hành được duy trì.
+ enable_out_ Mặc định bằng true, chỉ ra trạng thái luồng khởi hành được duy trì bởi luồng giám sát. Nếu nó bằng false, chỉ các thông tin khởi hành được giữ lại.
+ enable_drop_ mặc định bàng true, chỉ ra trạng thái loại bỏ trên luồng được duy trì bởi luồng giám sát. Nếu bằng false thì chỉ có thông tin loại bỏ được giữ lại.
+ enable_edrop_ Mặc định bằng true, chỉ ra trạng thái loại bỏ sớm trên luồng được duy trì bởi luồng giám sát. Nếu nó bằng false thì chỉ có thông tin loại bỏ sớm được giữ lại.
QUEUEMONITOR/ED/FLOW OBJECTS
Những đối tượng này chứa biến đếm trên luồng và quản lí việc thống kê bởi một đối tượng QueueMonitor/ED/Flowmon. Chúng thường được tạo trong việc gọi lại một thủ tục Otcl khi một luồng giám sát gởi một gói không ánh xạ được tới luồng được biết trứơc. Chú ý rằng việc phân lớp của luồng giám sát chịu trách nhiệm trong việc ánh xạ các gói tin tới các luồng theo cách của nó. Do đó việc ohụ thuộc kiểu phân loại thường thì không phải tất cả các biến trạng thái đều có liên quan (có nghĩa là việc phân loại nhiều gói tin dựa trên cơ sở id luồng trong trường hợp mà địa chỉ nguồn và địa chỉ đích không quan trọng.). Các biến trạng thái là:
+ src_ Địa chỉ nguồn của gói tin phụ thuộc vào luồng này.
+ dst_ Địa chỉ đích của gói tin phụ thuộc vào luồng này.
+ flowid_ id luồng của gói tin phụ thuộc vào luồng này.
Một số tập lệnh.
Dưới đây là danh sách các lệnh hàng đợi thường dùng trong lệnh mô phỏng.
$ns_ queue-limit
Thiết lập một giới hạn kích thước bộ đệm lớn nhất trong liên kết giữa các node và .
$ns_ trace-queue
Thiết lập các đối tượng dò tìm các sự kiện ghi trong hàng đợi. Nó file dò tìm không tìm thấy, nó sử dụng traceAllFile_ để ghi vào các sự kiện.
$ns_ namtrace-queue
Thông thường trên hàng đợi dò tìm (trace-queue), thiết lập nam-tracing trong hàng đợi.
$ns_ monitor-queue
CHƯƠNG 3. XÂY DỰNG GIAO THỨC VÀ TRIỂN KHAI MÔ PHỎNG
3.1 Các bước xây dựng một giao thức
Protocol mới định nghĩa phần đầu gói của chính nó hoặc là mở rộng phần đầu sẵn có bằng cách thêm vào các trường. Phần đầu gói mới được đưa vào trong trình mô phỏng bằng cách định nghĩa một cấu trúc C++ với những trường cần thiết, định nghĩa một lớp tĩnh để cung cấp liên kết OTcl, và sau đó thay đổi một số code khởi tạo của trình mô phỏng để gán một byte khoảng trống trong mỗi gói, nơi mà một phần đầu mới được xác định có quan hệ với những cái khác.
Khi trình mô phỏng được khởi tạo thông qua OTcl, người dùng có thể chọn lựa để cho phép chỉ một tập hợp con của trình biên dịch trong các định dạng gói, kết quả trả về trong chế độ lưu trữ bộ nhớ trong suốt quá trình thực hiện mô phỏng. Lúc này, hầu hết mọi cấu hình trong định dạng gói đều cho phép. Việc quản lý định dạng các gói hiện thời đang được cho phép (enable) trong trình mô phỏng được điều khiển bởi một đối tượng quản lý phần đầu một gói cụ thể được mô tả dưới đây. Đối tượng này hỗ trợ một phương thức OTcl được sử dụng để xác định phần đầu gói nào sẽ được sử dụng trong trình mô phỏng. Nếu một đối tượng trong trình mô phỏng sử dụng một trường trong phần đầu mà nó không được cho phép thì một chương trình thời gian thực (run-time) sẽ xuất hiện để hủy bỏ nó.
3.1.1 Tạo một header mới cho giao thức
Khi xây dựng protocol mới phải tạo một header cụ thể để sử dụng, tránh overload trên những trường tồn tại trong header. Dựa vào yêu cầu của giao thức cần những trường nào ta định nghĩa một số trường cần dùng cho giao thức. Khai báo phần này được đặt trong file.h. Ví dụ tạo header cho giao thức ping trong tệp Ping.h
struct hdr_ping {
char ret;
double send_time;
// Header access methods
static int offset_; // required by PacketHeaderManager
inline static hdr_ping* access(const Packet* p) {
return (hdr_ping*) p->access(offset_);
}
};
class PingAgent : public Agent {
public:
PingAgent();
virtual int command(int argc, const char*const* argv);
virtual void recv(Packet*, Handler*);
};
3.1.2 C++ code
Phần đầu gói mới được đưa vào trong trình mô phỏng bằng cách định nghĩa một cấu trúc C++ với những trường cần thiết, định nghĩa một lớp tĩnh để cung cấp liên kết OTcl, và sau đó thay đổi một số code khởi tạo của trình mô phỏng để gán một byte khoảng trống trong mỗi gói, nơi mà một phần đầu mới được xác định có quan hệ với những cái khác. C++ code được đặt trong file.cc
Ví dụ C++ code cho giao thức ping:
int hdr_ping::offset_;
static class PingHeaderClass : public PacketHeaderClass {
public:
PingHeaderClass() : PacketHeaderClass("PacketHeader/Ping",
sizeof(hdr_ping)) {
bind_offset(&hdr_ping::offset_);
}
} class_pinghdr;
static class PingClass : public TclClass {
public:
PingClass() : TclClass("Agent/Ping") {}
TclObject* create(int, const char*const*) {
return (new PingAgent());
}
} class_ping;
PingAgent::PingAgent() : Agent(PT_PING)
{
bind("packetSize_", &size_);
}
int PingAgent::command(int argc, const char*const* argv)
{
if (argc == 2) {
if (strcmp(argv[1], "send") == 0) {
// Create a new packet
Packet* pkt = allocpkt();
// Access the Ping header for the new packet:
hdr_ping* hdr = hdr_ping::access(pkt);
// Set the 'ret' field to 0, so the receiving node knows
// that it has to generate an echo packet
hdr->ret = 0;
// Store the current time in the 'send_time' field
hdr->send_time = Scheduler::instance().clock();
// Send the packet
send(pkt, 0);
// return TCL_OK, so the calling function knows that the
// command has been processed
return (TCL_OK);
}
}
// If the command hasn't been processed by PingAgent()::command,
// call the command() function for the base class
return (Agent::command(argc, argv));
}
void PingAgent::recv(Packet* pkt, Handler*)
{
// Access the IP header for the received packet:
hdr_ip* hdrip = hdr_ip::access(pkt);
// Access the Ping header for the received packet:
hdr_ping* hdr = hdr_ping::access(pkt);
// Is the 'ret' field = 0 (i.e. the receiving node is being pinged)?
if (hdr->ret == 0) {
// Send an 'echo'. First save the old packet's send_time
double stime = hdr->send_time;
// Discard the packet
Packet::free(pkt);
// Create a new packet
Packet* pktret = allocpkt();
// Access the Ping header for the new packet:
hdr_ping* hdrret = hdr_ping::access(pktret);
// Set the 'ret' field to 1, so the receiver won't send another echo
hdrret->ret = 1;
// Set the send_time field to the correct value
hdrret->send_time = stime;
// Send the packet
send(pktret, 0);
} else {
// A packet was received. Use tcl.eval to call the Tcl
// interpreter with the ping results.
// Note: In the Tcl code, a procedure 'Agent/Ping recv {from rtt}'
// has to be defined which allows the user to react to the ping
// result.
char out[100];
// Prepare the output to the Tcl interpreter. Calculate the round
// trip time
sprintf(out, "%s recv %d %3.1f", name(),
hdrip->src_.addr_ >> Address::instance().NodeShift_[1],
(Scheduler::instance().clock()-hdr->send_time) * 1000);
Tcl& tcl = Tcl::instance();
tcl.eval(out);
// Discard the packet
Packet::free(pkt);
}
}
3.1.3 Tcl code
Sau khi biên dịch xong giao thức để mô phỏng giao thức ta có thể xây dựng kịch bản cho giao thức bằng các câu lệnh trong Tcl, các câu lện này để gọi ra các node, tạo các Agent, gọi giao thức đã được biên dịch ra, cho chạy các gói tin vào các thời điểm khác nhau.... Tcl code được lưu trong file.tcl
#Create a simulator object
set ns [new Simulator]
#Open a trace file
set nf [open out.nam w]
$ns namtrace-all $nf
#Define a 'finish' procedure
proc finish {} {
global ns nf
$ns flush-trace
close $nf
exec nam out.nam &
exit 0
}
#Create three nodes
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
#Connect the nodes with two links
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
$ns duplex-link $n1 $n2 1Mb 10ms DropTail
#Define a 'recv' function for the class 'Agent/Ping'
Agent/Ping instproc recv {from rtt} {
$self instvar node_
puts "node [$node_ id] received ping answer from \
$from with round-trip-time $rtt ms."
}
#Create two ping agents and attach them to the nodes n0 and n2
set p0 [new Agent/Ping]
$ns attach-agent $n0 $p0
set p1 [new Agent/Ping]
$ns attach-agent $n2 $p1
#Connect the two agents
$ns connect $p0 $p1
#Schedule events
$ns at 0.2 "$p0 send"
$ns at 0.4 "$p1 send"
$ns at 0.6 "$p0 send"
$ns at 0.6 "$p1 send"
$ns at 1.0 "finish"
#Run the simulation
$ns run
3.1.4 Một số thay đổi trong NS2
Khi biên dịch chương trình chúng ta phải có một số thay đổi cho các file cấu hình. Trong packet.h (...\ns-allinone-2.27\ns-2.27\common) Chèn thêm “PT_PING” trong lớp enum packet_t
enum packet_t {
PT_TCP,
PT_UDP,
......
PT_TFRC,
PT_TFRC_ACK,
PT_PING, // chèn thêm
PT_NTYPE
};
Chèn thêm biến “name_[PT_PING]="PING";” trong lớp class p_info
class p_info {
public:
name_[PT_TCP]= "tcp";
name_[PT_UDP]= "udp";
...........
name_[PT_TFRC]= "tcpFriend";
name_[PT_TFRC_ACK]= "tcpFriendCtl";
name_[PT_PING]="PING";
name_[PT_NTYPE]= "undefined";
}
Trong ns-default.tcl (...\ns-allinone-2.27\ns-2.27\tcl\lib)
Trong file ns-default.tcl là tất cả các giá trị mặc định của Tcl objects, thêm giá trị: Agent/Chap set packetSize_ 64
Trong ns-packet.tcl (...\ns-allinone-2.27\ns-2.27\tcl\lib)
foreach prot {
AODV
ARP
...
Chap
...
}
Trong makefile (...\ns-allinone-2.27\ns-2.27)
sessionhelper.o delaymodel.o srm-ssm.o \
srm-topo.o \
ping.o \
$(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o \
$(LIB_DIR)dmalloc_support.o \
3.2 Xây dựng thử nghiệm giao thức CHAP
3.2.1 Giao thức CHAP
PPP được xây dựng dựa trên nền tảng giao thức điều khiển truyền dữ liệu lớp cao (High-Level Data link Control (HDLC)) nó định ra các chuẩn cho việc truyền dữ liệu các giao diện DTE và DCE của mạng WAN như V.35, T1, E1, HSSI, EIA-232-D, EIA-449. PPP được ra đời như một sự thay thế giao thức Serial Line Internet Protocol (SLIP), một dạng đơn giản của TCP/IP. PPP cung cấp cơ chế chuyển tải dữ liệu của nhiều giao thức trên một đường truyền, cơ chế sửa lỗi nén header, nén dữ liệu và multilink . PPP có hai thành phần :
Link Control Protocol (LCP): (được đề cập đến trong RFC 1570) thiết lập, điều chỉnh cấu hình, và hủy bỏ một liên kết. Hơn thế nữa LCP còn có cơ chế Link Quality Monitoring (LQM) có thể được cấu hình kết hợp với một trong hai cơ chế chứng thực Password Authentication Protocol (PAP) hay Challenge Handshake Authentication Protocol (CHAP).
Network Control Protocol (NCP): NCP làm nhiệm vụ thiết lập, điều chỉnh cấu hình và hủy bỏ việc truyền dữ liệu của các giao thức của lớp network như: IP, IPX, AppleTalk and DECnet.
Cả LCP và NCP đều họat động ở lớp 2 . Hiện đã có mở rộng của PPP phục vụ cho việc truyền dữ liệu sử dụng nhiều links một lúc, đó là Multilink PPP (MPPP) trong đó sủ dụng Multilink Protocol (MLP) để liên kết các lớp LCP và NCP.
Giao thức chap (challenge handshake authentication protocol ).
CHAP có khả năng mã hóa mật khẩu cũng như dữ liệu.
Hai đầu kết nối chia sẻ bộ mã mật secret CHAP giống nhau và mỗi đầu được gán một local name riêng. Giả sử một user A quay số truy cập vào access server B. Access server sẽ gửi qua đường truyền một gói tin khởi tạo chứng thực Type 1 gọi là gói tin Challenge. Gói tin Challenge này chứa một số được sinh ngẫu nhiên, một số ID sequence number để xác định challenge và tên chứng thực của challenager. Bên gọi sẽ lấy ra chuỗi authentication name, và tìm trong dữ liệu của mình chuỗi mã mật CHAP ứng với user name nhận được. Caller sẽ nhập mã mật của CHAP, số ID sequence number và một giá trị số được sinh ngẫu nhiên vào thuật toán mã hoá. Giá trị kết quả sau khi tính mã hoá được gửi trả lại cho Challenger (Access server) trong một gói CHAP Response (Type 2) chứa chuỗi băm, tên chứng thực của caller và cuối cùng là ID (Sequence Number) được lấy từ gói Challenge. Khi nhận được gói Response Type 2, Challenger sẽ sử dụng ID để tìm gói Challenge nguyên thủy. username của caller (A) được sử dụng để tìm kiếm mã mật CHAP từ một CSDL trong hệ thống máy chủ. ID, giá trị Challange gốc được sinh ngẫn nhiên và giá trị CHAP ngẫu nhiên ban đầu và mã mật của được đưa vào xử lỷ bởi hàm băm(vd: MD5). Chuỗi băm kết quả sau khi tính toán sau đó được so sánh với giá trị nhận được trong gói Response. Nếu 2 chuỗi là giống nhau thì quá trình chứng thực CHAP đã thành công và các gói Type 3 được gửi đến caller chứa ID. Điều này có nghĩa là kết nối đã được chứng thực hợp lệ. Nếu chứng thực CHAP thất bại, một gói tin Type 4 sẽ được gửi đến caller trong đó chứa ID goc, xác nhận quá trình chứng thực là không thành công.
3.2.2 Xây dựng giao thức
Xây dựng tệp mô tả chap.h
#ifndef ns_chap_h
#define ns_chap_h
#include "agent.h"
#include "tclcl.h"
#include "packet.h"
#include "address.h"
#include "ip.h"
struct hdr_chap {
char usr;
char pass;
double send_time;
double rcv_time; // when ping arrived to receiver
int seq; // sequence number
// Header access methods
static int offset_; // required by PacketHeaderManager
inline static int& offset() { return offset_; }
inline static hdr_chap* access(const Packet* p) {
return (hdr_chap*) p->access(offset_);
}
};
class ChapAgent : public Agent {
public:
ChapAgent();
int seq; // a send sequence number like in real ping
int oneway; // enable seq number and one-way delay printouts
virtual int command(int argc, const char*const* argv);
virtual void recv(Packet*, Handler*);
};
#endif // ns_chap_h
Triển khai Chap.cc
#include "chap.h"
int hdr_chap::offset_;
static class ChapHeaderClass : public PacketHeaderClass {
// trong packet.cc lop nay co ham tao truyen 2 tham so :
//PacketHeaderClass::PacketHeaderClass(const char* classname, int hdrlen) :
// TclClass(classname), hdrlen_(hdrlen), offset_(0)
public:
ChapHeaderClass() : PacketHeaderClass("PacketHeader/Chap",
sizeof(hdr_chap)) {
bind_offset(&hdr_chap::offset_);
}
} class_chaphdr;
static class ChapClass : public TclClass {
public:
ChapClass() : TclClass("Agent/Chap") {}
TclObject* create(int, const char*const*) {
return (new ChapAgent());
}
} class_chap;
ChapAgent::ChapAgent() : Agent(PT_CHAP), seq(0), oneway(0)
{
bind("packetSize_", &size_);
}
int ChapAgent::command(int argc, const char*const* argv)
{
if (argc == 2) {
if (strcmp(argv[1], "send") == 0) {
// Create a new packet
Packet* pkt = allocpkt();
// Access the chap header for the new packet:
hdr_chap* hdr = hdr_chap::access(pkt);
hdr_chap* hdr1 = hdr_chap::access(pkt); //them
// Set the 'ret' field to 0, so the receiving node
// knows that it has to generate an echo packet
hdr->usr = 101;
hdr1->pass= 010;
hdr->seq = seq++;
// Store the current time in the 'send_time' field
hdr->send_time = Scheduler::instance().clock();
// Send the packet
send(pkt, 0);
// return TCL_OK, so the calling function knows that
// the command has been processed
return (TCL_OK);
}
else if (strcmp(argv[1], "start-WL-brdcast") == 0) {
Packet* pkt = allocpkt();
hdr_ip* iph = HDR_IP(pkt);
hdr_chap* ph = hdr_chap::access(pkt);
hdr_chap* ph1 = hdr_chap::access(pkt);
iph->daddr() = IP_BROADCAST;
iph->dport() = iph->sport();
ph->usr = 111;
ph1->pass= 000;
send(pkt, (Handler*) 0);
return (TCL_OK);
}
else if (strcmp(argv[1], "oneway") == 0) {
oneway=1;
return (TCL_OK);
}
}
// If the command hasn't been processed by ChapAgent()::command,
// call the command() function for the base class
return (Agent::command(argc, argv));
}
void ChapAgent::recv(Packet* pkt, Handler*)
{
// Access the IP header for the received packet:
hdr_ip* hdrip = hdr_ip::access(pkt);
// Access the Chap header for the received packet:
hdr_chap* hdr = hdr_chap::access(pkt);
hdr_chap* hdr1 = hdr_chap::access(pkt); //them
// check if in brdcast mode
if ((u_int32_t)hdrip->daddr() == IP_BROADCAST) {
if ((hdr->usr == 110) and (hdr1->pass == 110)) {
printf("Recv BRDCAST Chap REQ : at %d.%d from %d.%d\n", here_.addr_, here_.port_, hdrip->saddr(), hdrip->sport());
Packet::free(pkt);
// create reply
Packet* pktret = allocpkt();
hdr_chap* hdrret = hdr_chap::access(pktret);
hdr_chap* hdrret1 = hdr_chap::access(pktret);
hdr_ip* ipret = hdr_ip::access(pktret);
hdrret->usr = 111;
hdrret1->pass=111;
// add brdcast address
ipret->daddr() = IP_BROADCAST;
ipret->dport() = ipret->sport();
send(pktret, 0);
} else {
printf("Recv BRDCAST Chap REPLY : at %d.%d from %d.%d\n", here_.addr_, here_.port_, hdrip->saddr(), hdrip->sport());
Packet::free(pkt);
}
return;
}
// Is the 'ret' field = 0 (i.e. the receiving node is being pinged)?
if ((hdr->usr == 110) and (hdr1->pass == 110)) {
// Send an 'echo'. First save the old packet's send_time
double stime = hdr->send_time;
int rcv_seq = hdr->seq;
// Discard the packet
Packet::free(pkt);
// Create a new packet
Packet* pktret = allocpkt();
// Access the Chap header for the new packet:
hdr_chap* hdrret = hdr_chap::access(pktret);
hdr_chap* hdrret1 = hdr_chap::access(pktret);
// Set the 'ret' field to 1, so the receiver won't send
// another echo
hdrret->usr = 111;
hdrret1->pass=111;
// Set the send_time field to the correct value
hdrret->send_time = stime;
// Added by Andrei Gurtov for one-way delay measurement.
hdrret->rcv_time = Scheduler::instance().clock();
hdrret->seq = rcv_seq;
// Send the packet
send(pktret, 0);
} else {
// A packet was received. Use tcl.eval to call the Tcl
// interpreter with the you results.
// Note: In the Tcl code, a procedure
// 'Agent/You recv {from rtt}' has to be defined which
// allows the user to react to the you result.
char out[100];
// Prepare the output to the Tcl interpreter. Calculate the
// round trip time
if (oneway) //AG
sprintf(out, "%s recv %d %d %3.1f %3.1f", name(),
hdrip->src_.addr_ >> Address::instance().NodeShift_[1],
hdr->seq, (hdr->rcv_time - hdr->send_time) * 1000,
(Scheduler::instance().clock()-hdr->rcv_time) * 1000);
else sprintf(out, "%s recv %d %3.1f", name(),
hdrip->src_.addr_ >> Address::instance().NodeShift_[1],
(Scheduler::instance().clock()-hdr->send_time) * 1000);
Tcl& tcl = Tcl::instance();
tcl.eval(out);
// Discard the packet
Packet::free(pkt);
}
}
Một số thay đổi trong NS2, trong packet.h (...\ns-allinone-2.27\ns-2.27\common) ta chèn thêm “PT_CHAP” trong lớp enum packet_t
enum packet_t {
PT_TCP,
PT_UDP,
......
PT_TFRC,
PT_TFRC_ACK,
PT_CHAP,
PT_NTYPE
};
Chèn thêm biến “name_[PT_CHAP]="Chap";” trong lớp class p_info
class p_info {
public:
name_[PT_TCP]= "tcp";
name_[PT_UDP]= "udp";
...........
name_[PT_TFRC]= "tcpFriend";
name_[PT_TFRC_ACK]= "tcpFriendCtl";
name_[PT_CHAP]="Chap";
name_[PT_NTYPE]= "undefined";
}
Trong ns-default.tcl (...\ns-allinone-2.27\ns-2.27\tcl\lib)
Trong file ns-default.tcl là tất cả các giá trị mặc định của Tcl objects, thêm giá trị: Agent/Chap set packetSize_ 64
Trong ns-packet.tcl (...\ns-allinone-2.27\ns-2.27\tcl\lib)
foreach prot {
AODV
ARP
...
CHAP
...
}
Trong makefile (...\ns-allinone-2.27\ns-2.27)
common/agent.o common/message.o apps/udp.o \
apps/chap.o \
common/session-rtp.o apps/rtp.o tcp/rtcp.o \
common/ivs.o \$(LIB_DIR)dmalloc_support.o \
3.3 Biên dịch và thử nghiệm giao thức
3.3.1 Biên dịch C++ sang Otcl
- Chạy NS2 trong môi trường Cyqwin
- Chuyển con trỏ tới thư mục có chứa makefile.in, makefile.cc, theo đường dẫn sau : C:\cygwin\home\vunt\ns-allinone-2.27\ns-2.27
Trong thư mục đó cho phép makefile.
Gõ make clean : lệnh này sẽ xóa hết các file.o đã biên dịch trước đó
Gõ makefile : sẽ biên dịch lại và tạo ra các file.o
Nếu có chap.o được tạo ra thì biên dịch thành công.
3.3.2 Xây dựng kịch bản
Sau khi makefile thành công để chạy giao thức vừa mới xây dựng xong ta xây dựng kịch bản bẳng ngôn ngữ Tcl
#Create a simulator object
set ns [new Simulator]
#Open a trace file
set nf [open ch.nam w]
$ns namtrace-all $nf
#Define a 'finish' procedure
proc finish {} {
global ns nf
$ns flush-trace
close $nf
exec nam ch.nam &
exit 0
}
#Create three nodes
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
#Connect the nodes with two links
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
$ns duplex-link $n1 $n2 1Mb 10ms DropTail
$ns duplex-link $n2 $n3 1Mb 10ms DropTail
#Define a 'recv' function for the class 'Agent/Chap'
Agent/Chap instproc recv {from rtt} {
$self instvar node_
#puts "node [$node_ id] received you answer from \
# $from with round-trip-time $rtt ms."
}
#Create two you agents and attach them to the nodes n0 and n2
set p0 [new Agent/Chap]
$ns attach-agent $n0 $p0
set p1 [new Agent/Chap]
$ns attach-agent $n2 $p1
set p2 [new Agent/Chap]
$ns attach-agent $n3 $p2
#Connect the two agents
$ns connect $p0 $p1
$ns connect $p0 $p2
#Schedule events
$ns at 0.2 "$p0 send"
$ns at 0.4 "$p1 send"
$ns at 0.6 "$p2 send"
$ns at 0.6 "$p1 send"
$ns at 1.0 "finish"
#Run the simulation
$ns run
3.3.3 Mô phỏng giao thức
- Chạy trong môi trường NS2 chuyển con trỏ tới thư mục có chứa file chap.tcl
gõ lệnh ns chap.tcl chương trình sẽ chạy như sau:
BÀI TẬP PHẦN MÔ HÌNH MẠNG
0
1
2
3
4
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
0
1
3
2
0
1
3
2
4
0
1
3
2
4
(2)
(1)
(3)
(4)
(5)
=0
1
3
2
4
0
1
3
2
4
4
0
1
3
2
4
0
1
3
2
0
1
2
3
4
5
0
1
3
2
4
5
0
1
3
2
4
5
0
1
3
2
4
5
6
0
1
3
2
4
5
6
0
1
3
2
4
5
6
0
1
3
2
4
5
6
7
0
1
3
2
4
5
6
7
0
1
3
2
4
5
6
7
0
1
3
2
4
5
6
7
0
1
3
2
4
5
6
7
0
1
3
2
4
0
1
3
2
4
0
1
3
2
4
5
6
7
(36)
BÀI TẬP LÝ THUYẾT NS2
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng ping tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng tracert tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng SNMP tool.
Trình bày phương pháp kiểm soát hiệu năng trên cơ sở Sniffer tool.
Trình bày cách sử dụng và hàm trong bộ thư viện winpcap, libpcap.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng tcpdump tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng windump tool.
Trình bày phương pháp quản trị hiệu năng sử dụng Wireshark tool.
Trình bày phương pháp quản trị hiệu năng sử dụng Iris tool.
Triển khai minh họa kiểm soát lưu lượng với các DoS tool.
Triển khai minh họa kiểm soát lưu lượng với các DDoS tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng Netpert tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng Iperf tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng DBs tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng Pathrate tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng Pathload tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng Nettest tool.
Tính các tham số hiệu năng bằng cách lên kịch bản và sử dụng tcptrace tool.
Trong câu lệnh set udp [new Application/Traffic/] hãy trình bày và so sánh khái niệm udp-src-type bao gồm CBR (Constant Bit Rate), Exponential, Pareto. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Giải thích câu lệnh sau đây $ns duplex-link-op $n2 $n3 queuePos 0.5, mở rộng với câu lệnh $ns duplex-link-op. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Giải thích khái niệm Unicast address classifier và multicast address classifier, triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Giải thích câu lệnh set lossmod [new ErrorModel], mở rộng với khả năng sinh lỗi trên luồng, triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trình bày và triển khai các câu lệnh tác động lên queue, triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Để theo dõi luồng ứng dụng, ns2 sử dụng set trace [new Application/Traffic/Trace]. Hãy trình bày và triển khai các câu lệnh tác động lên trace, cho ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trình bày và triển khai công cụ awk, triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Câu lệnh set trace-all [open trace.tr w] sinh ra file trace.tr, triển khai phân tích số liệu trong file đó với công cụ xgraph.
Câu lệnh set trace-all [open trace.tr w] sinh ra file trace.tr, triển khai phân tích số liệu trong file đó với công cụ gnuplot.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm DropTail, Fair Queueing(FQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm DropTail, Stochastic Fair Queueing(SFQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm DropTail, Deficit Round Robin scheduling (DRR). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm DropTail, Random Early Detection (RED). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm DropTail, Class Based Queuing (CBQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Fair Queueing(FQ), Stochastic Fair Queuing (SFQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Fair Queueing(FQ), Deficit Round Robin scheduling (DRR). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Fair Queueing(FQ), Random Early Detection (RED). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Fair Queueing(FQ), Class Based Queuing (CBQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Stochastic Fair Queuing (SFQ), Deficit Round Robin scheduling (DRR). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Stochastic Fair Queuing (SFQ), Random Early Detection (RED). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Stochastic Fair Queuing (SFQ), Class Based Queuing (CBQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Deficit Round Robin scheduling (DRR), Random Early Detection (RED). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Deficit Round Robin scheduling (DRR), Class Based Queuing (CBQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $ns , hãy trình bày và so sánh khái niệm queue-type bao gồm Random Early Detection (RED), Class Based Queuing (CBQ). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Tahoe, Reno. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Tahoe, NewReno. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Reno, NewReno. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Tahoe, Vegas. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Tahoe, Fack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Reno, Vegas. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Reno, Fack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Tahoe, Sack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Reno, Sack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Tahoe, FullTCP. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Reno, FullTCP. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm NewReno, Vegas. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm NewReno, Fack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm NewReno, Sack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm NewReno, FullTCP. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Vegas, Fack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Vegas, Sack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Vegas, FullTCP. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Fack, Sack. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Fack, FullTCP. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh set tcp_agent [new Agent/TCP/] hãy trình bày và so sánh khái niệm tcp-agent-type bao gồm Sack, FullTCP. Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Trong câu lệnh $tcp set , giải thích parameter thiết lập cho Agent TCP sau Window settings (window_), ECN bit (ecn_), timer granularity (tcpTick_), congestion window (cwnd_), ssthresh setting (ssthresh_). Triển khai ví dụ minh họa trên mô hình mạng cụ thể với các tham số thiết lập.
Giải thích và cho ví dụ minh họa câu lệnh $ns rtproto được triển khai cho thiết lập routing trên unicast node với type là Static, Session, DV, cost, multipath.
Giải thích và cho ví dụ minh họa câu lệnh $ns mrtproto được triển khai cho thiết lập routing trên multicast node với type là CtrMcast, DM, dynamicDM, pimDM.
Các file đính kèm theo tài liệu này:
- Tổng quan đánh giá hiệu năng mạng.doc