Hoàng Đăng Hải Học Viên: Lê Đăng Phong [1-22] Vũ Anh Tuấn



tải về 0.59 Mb.
trang18/19
Chuyển đổi dữ liệu13.08.2016
Kích0.59 Mb.
#17954
1   ...   11   12   13   14   15   16   17   18   19

9.7. Agent API


Các ứng dụng được mô phỏng có thể được thực hiện trong phần đầu của các agent giao thức. Chương 32 mô tả API được các ứng dụng sử dụng để truy nhập các dịch vụ được agent giao thức cung cấp.

9.8. Các đối tượng agent khác


Lớp agent tạo nên lớp cơ sở từ nhiều loại đối tượng khác nhau như Nullobject, TCP... đã được dẫn xuất. Các phương thức của lớp agent được mô tả trong phần sau. Các tham số cấu hình:

fid_ Flowid.

prio_ Priority.

agent_addr_ Address of this agent.

agent_port_ Port adress of this agent.

dst_addr_ Destination address for the agent.

dst_port_ Destination port address for the agent.

flags_

ttl_ TTL defaults to 32.

9.9. Các lệnh cơ bản


Sau đây là các lênh liên quan đến agent sử dụng trong kịch bản mô phỏng:

ns_ attach-agent

$agent port

$agent dst-port

$agent attach-app

$agent attach-source

$agent attach-tbf

$ns_ connect

$ns_ create-connection

$ns_ create-connection-list


$ns_ simplex-connect

$agent set

$agent attach-trace


10. Các bộ định thời


Các bộ định thời có thể được thực hiện bằng C++ hoặc OTcl. Trong C++, các bộ định thời dựa trên một lớp cơ sở đã được định nghĩa trong ~ns/timer-handler.h.

Các bộ định thời thường được sử dụng trong các agent, nhưng chúng cũng có thể được sử dụng bởi một số đối tượng khác. Phần sau đây sẽ mô tả việc sử dụng các bộ định thời trong các agent.

Các thủ tục và hàm trình bày trong phần này có thể lấy trong ~ns/tcl/ex/timer.tcl, và ~ns/timer-handler.{cc, h}.

Trong OTcl, lớp định thời đơn giản được định nghĩa trong ~ns/tcl/ex/timer.tcl. Các lớp con có thể được dẫn xuất để tạo ra một cơ chế đơn giản để định trình các sự kiện ở mức của OTcl.


10.1. Lớp cơ sở trong C++ TimerHandler


Lớp cơ sở TimerHandler bao gồm các hàm bộ phận chung như sau:

void sched(double delay) schedule a timer to expire delay seconds in the future

void resched(double delay) reschedule a timer (similar to sched(), but timer may be pending)

void cancel() cancel a pending timer

int status() returns timer status (either TIMER_IDLE, TIMER_PENDING, or

TIMER_HANDLING)

Lớp cơ sở TimerHandler bao gồm các bộ phận được bảo vệ như sau:

virtual void expire(Event* e) =0 this method must be filled in by the timer client

virtual void handle(Event* e) consumes an event; invokes expire() and sets status_ of the timer appropriately

int status_ keeps track of the current timer status

Event event_ event to be consumed upon timer expiration

Hàm ảo expire() được định nghĩa bằng các lớp định thời dẫn xuất từ lớp cơ sở này. Sau cùng, hai hàm nội tuyến riêng được định nghĩa:

inline void _sched(double delay) {

(void)Scheduler::instance().schedule(this,&event_, delay);

}

inline void _cancel() {



(void)Scheduler::instance().cancel(&event_);

}

Từ đoạn mã này ta có thể thấy rằng các bộ định thời sử dụng các phương thức của lớp Scheduler.


10.1.1. Định nghĩa một bộ định thời mới


Để định nghĩa một bộ định thời mới, tiến hành phân lớp hàm này và định nghĩa hàm handle() nếu cần (thường không yêu cầu hàm handle()):

class MyTimer : public TimerHandler {

public:

MyTimer(MyAgentClass *a) : TimerHandler() { a_ = a; }



virtual double expire(Event *e);

protected:

MyAgentClass *a_;

};

Sau đó định nghĩa hiệu lực:



double

MyTimer::expire(Event *e)

{

// do the work



// return TIMER_HANDLED; // => do not reschedule timer

// return delay; // => reschedule timer after delay

}

Chú ý rằng expire() có thể trả về cờ TIMER_HANDLED hoặc một giá trị trễ, tuỳ theo yêu cầu đối với bộ định thời.



MyTimer sẽ trong cùng nhóm với MyAgentClass, hoặc expire() sẽ chỉ gọi đến hàm chung của MyAgentClass.

Các bộ định thời không thể được truy cập trực tiếp từ mức OTcl, mặc dù người dùng được tự do thiết lập phương thức kết nối.


10.1.2. Ví dụ: Bộ định thời truyền lại TCP


TCP là một ví dụ về agent cần các bộ định thời. Có 3 bộ định thời được định nghĩa trong agent cơ bản Tahoe TCP trong tcp.cc:

rtx_timer_; /* Retransmission timer */

delsnd_timer_; /* Delays sending of packets by a small random amount of time, */

/* to avoid phase effects */

burstsnd_timer_; /* Helps TCP to stagger the transmission of a large window */

/* into several smaller bursts */

Trong ~ns/tcp.h, ba lớp được dẫn xuất từ lớp cơ sở TimerHandler:

class RtxTimer : public TimerHandler {

public:

RtxTimer(TcpAgent *a) : TimerHandler() { a_ = a; }



protected:

virtual void expire(Event *e);

TcpAgent *a_;

};

class DelSndTimer : public TimerHandler {



public:

DelSndTimer(TcpAgent *a) : TimerHandler() { a_ = a; }

protected:

virtual void expire(Event *e);

TcpAgent *a_;

};

class BurstSndTimer : public TimerHandler {



public:

BurstSndTimer(TcpAgent *a):TimerHandler(){ a_ = a; }

protected:

virtual void expire(Event *e);

TcpAgent *a_;

};

Trong hàm khởi tạo cho TcpAgent trong tcp.cc, mỗi bộ định thời này được khởi tạo với một con trỏ của nó, được ấn định đến con trỏ a_.



TcpAgent::TcpAgent() : Agent(PT_TCP), rtt_active_(0), rtt_seq_(-1),...

rtx_timer_(this), delsnd_timer_(this), burstsnd_timer_(this)

{

...


}

Sau đây, ta chỉ tập trung vào bộ định thời truyền lại (retransmission timer). Các phương thức trợ giúp khác nhau có thể được định nghĩa cho các sự kiện định thời, ví dụ:

/*

* Set retransmit timer using current rtt estimate. By calling resched()



* it does not matter whether the timer was already running.

*/

void TcpAgent::set_rtx_timer()



{

rtx_timer_.resched(rtt_timeout());

}

/*

* Set new retransmission timer if not all outstanding



* data has been acked. Otherwise, if a timer is still

* outstanding, cancel it.

*/

void TcpAgent::newtimer(Packet* pkt)



{

hdr_tcp *tcph = (hdr_tcp*)pkt->access(off_tcp_);

if (t_seqno_ > tcph->seqno())

set_rtx_timer();

else if (rtx_timer_.status() == TIMER_PENDING)

rtx_timer_.cancel();

}

Trong đoạn mã trên, phương thức set_rtx_timer() thiết lập định thời lại cho bộ định thời truyền lại bằng cách gọi rtx_timer_.resched().



Chú ý rằng, nếu không rõ bộ định thời có chạy hay không thì việc gọi resched() sẽ huỷ bộ định thời. Trong hàm thứ hai, ví dụ sử dụng các phương thức status() và cancel(void).

Cuối cùng, phải định nghĩa phương thức expire(void) cho lớp RtxTimer. Trong trường hợp này, expire(void) gọi phương thức timeout(void) đối với TcpAgent. Có thể xảy ra điều này bởi vì timeout() là một hàm bộ phận chung; nếu không xảy ra thì RtxTimer phải được khai báo là cùng lớp của TcpAgent.

void TcpAgent::timeout(int tno)

{

/* retransmit timer */



if (tno == TCP_TIMER_RTX) {

if (highest_ack_ == maxseq_ && !slow_start_restart_) {

/*

* TCP option:



* If no outstanding data, then don’t do anything.

*/

return;



};

recover_ = maxseq_;

recover_cause_ = 2;

closecwnd(0);

reset_rtx_timer(0,1);

send_much(0, TCP_REASON_TIMEOUT, maxburst_);

} else {

/*

* delayed-send timer, with random overhead



* to avoid phase effects

*/

send_much(1, TCP_REASON_TIMEOUT, maxburst_);



}

}

void RtxTimer::expire(Event *e) {



a_->timeout(TCP_TIMER_RTX);

}


Каталог: Hoc%20Tap -> Cong%20Nghe%20Wan
Hoc%20Tap -> Point to Point Protocol (ppp) 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
Hoc%20Tap -> Cấu hình Application Port-Mapping với cbac mục tiêu: Cấu hình để router nhận ra các ứng dụng không sử dụng port chuẩn. Mô hình
Hoc%20Tap -> ĐẢng cộng sản việt nam đẢng ủy phưỜng 04
Hoc%20Tap -> CiR = Bc / Tc
Hoc%20Tap -> Mean command : ip ospf mtu-ignore Diagram : Problems
Hoc%20Tap -> R1# ip route 0 0 0 0 FastEthernet0/0 R2# show run
Cong%20Nghe%20Wan -> Câu hỏi về kết nối chi nhánh về Head Office dùng wan
Cong%20Nghe%20Wan -> 1/ Cáp đồng gshdsl
Cong%20Nghe%20Wan -> 1. xu hưỚng chuẩn hoá VÀ CẤu trúc giao thứC

tải về 0.59 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   11   12   13   14   15   16   17   18   19




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương