Các mô hình sinh lỗi trong NS-2

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 58)

Xác định đặc điểm hành trạng của việc mất gói số liệu là một nhiệm vụ quan trọng, bởi vì đó là một trong số ít các tham số quan trọng nhất ảnh hưởng đến tất cả các tầng của bộ giao thức.

Trong mô phỏng, các lỗi có thể được sinh ra bởi một mô hình đơn giản hoặc từ nhiều mô hình được xây dựng theo kinh nghiệm và thống kê phức tạp. Để hỗ trợ nhiều mô hình lỗi, đơn vị lỗi có thể được chỉ ra là tỉ lệ gói tin, tỉ lệ bit bị lỗi hay khoảng thời gian xảy ra lỗi...

Lớp ErrorModel được kế thừa từ lớp connector, nó kế thừa một số phương thức của đối tượng như phương thức targetdrop-target. Nếu drop- target được sử dụng, nó sẽ nhận các gói tin bị lỗi từ ErrorModel, khi đó các gói tin này xem như đã bị loại trên đường truyền. Hoặc là, ErrorModel đánh dấu cờ error_ trong phần hearder của gói tin, cho phép các agent nhận ra gói tin bị lỗi. ErrorModel cũng định nghĩa thêm phương thức unit để chỉ rõ đơn vị lỗi và ranvar để chỉ các biến ngẫu nhiên cho việc sinh lỗi. Nếu không được chỉ rõ thì đơn vị lỗi là gói tin, các biến ngẫu nhiên được phân bố từ 0 đến 1.

Trong C++, lớp ErrorModel được khai báo như sau:

enum ErrorUnit { EU_PKT=0, EU_BIT, EU_TIME }; class ErrorModel : public Connector {

public:

ErrorModel();

void recv(Packet*, Handler*); virtual int corrupt(Packet*);

inline double rate() { return rate_; } protected:

int command(int argc, const char*const* argv); ErrorUnit eu_; /* thiết lập đơn vị lỗi */

RandomVariable* ranvar_; double rate_;

};

Phương thức recv sẽ loại gói tin khỏi đường truyền, còn phương thức corrupt sẽ làm hỏng gói tin.

Thí dụ, tạo mô hình lỗi cho kịch bản mô phỏng với tỉ lệ lỗi gói tin là 1%:

set loss_module [new ErrorModel] $loss_module set rate_ 0.01

# Thiết lập tùy chọn đơn vị lỗivà biến ngẫu nhiên

$loss_module unit pkt ; # đơn vị lỗi là gói tin

$loss_module ranvar [new RandomVariable/Uniform] # Sử dụng phương thức drop-targetđể loại gói tin $loss_module drop-target [new Agent/Null]

Lớp ErrorModel chỉ thực hiện chính sách đơn giản dựa trên tỉ lệ lỗi đơn trong các gói tin, các bit. Nhiều mô hình lỗi phức tạp khác đã được cài đặt trong C++ dựa vào mô hình lỗi ErrorModel và định nghĩa lại phương thức corrupt.

Mô hình lỗi có thể được chèn vào nhiều vị trí trên đường truyền đơn công (SimpleLink), hiện tại, NS hỗ trợ các phương thức để chèn mô hình lỗi vào ba vị trí khác nhau trên đường truyền đơn:

− Chèn mô hình lỗi vào trong liên kết đơn công tại vị trí trước đối tượng hàng đợi. Với cách chèn lỗi này, trong OTcl cung cấp hai phương thức:

+ SimpleLink::errormodule args: Khi mô hình lỗi được đưa ra như là một tham biến, nó chèn mô hình lỗi vào bên trong đường truyền đơn, ngay trước hàng đợi và đặt drop-target của mô hình lỗi là đối tượng drop trace của đường truyền đơn. Chú ý rằng điều này yêu cầu thứ tự cấu hình như sau: $ns namtrace-all, tiếp theo là các cấu hình đường truyền, chèn mô hình lỗi vào. Khi không có đối số nào được đưa ra thì nó sẽ trả về mô hình lỗi hiện tại trong đường truyền, phương thức này được định nghĩa trong

ns/tcl/lib/ns-link.tcl

+ Simulator:: lossmodel (em)(src)(dst): phương thức này sẽ gọi phương thức SimpleLink::errormodule để chèn mô hình lỗi cho trước vào trong đường truyền đơn (src, dst). Phương thức này được định nghĩa trong

− Chèn mô hình lỗi trong liên kết đơn sau hàng đợi nhưng trước đối tượng DELAY đường truyền, được cung cấp hai phương thức sau:

+ SimpleLink::insert-linkloss args: Cách xử lý giống như SimpleLink::Errormodule ngoại trừ việc nó thêm vào một mô hình lỗi ngay sau đối tượng hàng đợi, phương thức này được định nghĩa trong

ns/tcl/lib/ns-link.tcl

+ Simulator::link-lossmodel(em)(src)(dst): phương thức này bao

hàm cả phương thức SimpleLink::insert-linkloss, được định nghĩa trong ns/tcl/lib/ns-link.tcl.

− Chèn vào mô hình lỗi vào sau đối tượng DELAY: sử dụng phương thức Link::install-error.

Mô hình lỗi trên được thực hiện xuyên suốt toàn bộ thời gian mô phỏng, để thay đổi mô hình lỗi trong từng khoảng thời gian mô phỏng ta cần sử dụng mô hình lỗi đa trạng thái. Mô hình lỗi đa trạng thái thực hiện việc chuyển trạng thái lỗi dựa trên thời gian. Việc chuyển đến trạng thái lỗi tiếp theo xảy ra tại thời điểm kết thúc của khoảng thời gian của trạng thái hiện tại. Sau đó, trạng thái lỗi tiếp theo được chọn bằng cách sử dụng ma trận trạng thái chuyển. Để tạo mô hình lỗi đa trạng thái, các tham biến sau được sử dụng để tạo mô hình lỗi:

- States: một mảng các trạng thái.

- Periods: một mảng các khoảng thời gian trạng thái. - Trans: ma trận mô hình chuyển trạng thái.

- Transunit: đơn vị lỗi, có thể là gói tin, byte hoặc time.

- Sttype: kiểu chuyển trạng thái sử dụng hoặc là time hoặc là pkt. - Nstates: số lượng các trạng thái.

- Start: trạng thái bắt đầu.

Thí dụ đơn giản mô hình lỗi đa trạng thái:

set tmp [new ErrorModel/Uniform 0 pkt] set tmp1 [new ErrorModel/Uniform .9 pkt] set tmp2 [new ErrorModel/Uniform .5 pkt]

# Tạo mảng các trạng thái

set m_states [list $tmp $tmp1 $tmp2] # Thời gian thực hiện của các trạng thái

set m_periods [list 0 .0075 .00375] # Mô hình ma trận chuyển trạng thái

set m_transmx { {0.95 0.05 0} {0 0 1} {1 0 0}} set m_trunit pkt

# Chuyển trạng thái theo thời gian

set m_sttype time set m_nstates 3

set m_nstart [lindex $m_states 0]

set em [new ErrorModel/MultiState $m_states $m_periods $m_transmx $m_trunit $m_sttype $m_nstates $m_nstart]

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 58)