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


Ví dụ: Các agent Tcp, TCPSink



tải về 0.59 Mb.
trang16/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.5. Ví dụ: Các agent Tcp, TCPSink


Lớp TCP biểu diễn dạng đơn giản của bên gửi TCP. Nó gửi dữ liệu đến agent TCPSink và xử lý các xác nhận. Nó có một đối tượng riêng phối hợp với nó thể hiện nhu cầu của ứng dụng. Với việc xem xét các lớp TCPAgent và TCPSinkAgent, ta có thể thấy được rằng các agent được xây dựng khá phức tạp. Sau đây là một ví dụ về Tahoe TCPAgent sử dụng các bộ định thời (timer).

9.5.1. Tạo Agent


Đoạn mã OTcl sau đây mô tả việc tạo TCP agent và thiết lập cho nó:

set tcp [new Agent/TCP] ;# create sender agent

$tcp set fid_ 2 ;# set IP-layer flow ID

set sink [new Agent/TCPSink] ;# create receiver agent

$ns attach-agent $n0 $tcp ;# put sender on node $n0

$ns attach-agent $n3 $sink ;# put receiver on node $n3

$ns connect $tcp $sink ;# establish TCP connection

set ftp [new Application/FTP] ;# create an FTP source "application"

$ftp attach-agent $tcp ;# associate FTP with the TCP sender

$ns at 1.2 "$ftp start" ;#arrange for FTP to start at time 1.2 sec

Câu lệnh OTcl new Agent/TCP để tạo ra một đối tượng TcpAgent trong C++. Hàm khởi tạo đầu tiên gọi hàm khởi tạo của lớp cơ sở sau đó thực hiện liên kết. Hai hàm khởi tạo bao gồm:

Hàm khởi tạo TcpSimpleAgent (~ns/tcp.cc):

TcpAgent::TcpAgent() : Agent(PT_TCP), rtt_active_(0), rtt_seq_(-1), rtx_timer_(this), delsnd_timer_(this)

{

bind("window_", &wnd_);



bind("windowInit_", &wnd_init_);

bind("windowOption_", &wnd_option_);

bind("windowConstant_", &wnd_const_);

...


bind("off_ip_", &off_ip_);

bind("off_tcp_", &off_tcp_);

...

}

Hàm khởi tạo Agent (~ns/agent.cc):



Agent::Agent(int pkttype):

addr_(-1), dst_(-1), size_(0), type_(pkttype),

fid_(-1), prio_(-1), flags_(0)

{

memset(pending_, 0, sizeof(pending_)); /* timers */



// this is really an IP agent, so set up

// for generating the appropriate IP fields. . .

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

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

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

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

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

...


}

Đoạn mã này mô tả trường hợp chung khi mà hàm khởi tạo Agent cho định danh kiểu gói vào hàm khởi tạo Agent. Các giá trị kiểu gói khác nhau được sử dụng bởi công cụ tạo vết gói (Section 22.5) và được định nghĩa trong ~ns/trace.h. Các biến bị giới hạn trong hàm khởi tạo TcpAgent là các biến thường/bộ phận của lớp trừ các giá trị nguyên đặc biệt off_tcp_ và off_ip_. Hai biến này tương ứng dùng để truy nhập vào header TCP và IP. Chi tiết xem trong phần header của gói (Section 12.1).

Chú ý rằng hàm khởi tạo TcpAgent bao gồm việc khởi tạo cho 2 bộ định thời rtx_timer_ và delsnd_timer_.

Các đối tượng TimerHandler được khởi tạo bằng cách tạo ra một con trỏ (pointer) đến agent tương ứng.


9.5.2. Khởi động Agent


Agent TcpAgent được khởi động như trong ví dụ sau đây khi nguồn FTP nhận được lệnh khởi động ở thời điểm 1.2. Quá trình khởi động là một thủ tục được định nghĩa trong lớp Application/FTP (Section 32.4). Định nghĩa trong ~ns/tcl/lib/ns-source.tcl như sau:

Application/FTP instproc start {}

{

[$self agent] send -1



}

Trong trường hợp này, agent tham chiếu đến agent TCP đơn giản và gửi –1 là tín hiệu tương tự báo hiệu sẽ gửi 1 file lớn.

Và lệnh gửi làm bên gửi TCP đơn giản tạo ra các gói. Đầu ra hàm thực hiện như sau:

void TcpAgent::output(int seqno, int reason)

{

Packet* p = allocpkt();



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

double now = Scheduler::instance().clock();

tcph->seqno() = seqno;

tcph->ts() = now;

tcph->reason() = reason;

Connector::send(p, 0);

...

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



/* No timer pending. Schedule one. */

set_rtx_timer();

}

Ở đây chúng ta xem xét việc sử dụng phương thức Agent::allocpkt(). Tiến trình đầu ra đầu tiên đặt một gói mới (có header chung và IP đã được điền), sau đó phải điền vào trường header lớp TCP. Để tìm header trong một gói (giả thiết đã được phép (Section 12.2.4)) thì off_tcp_ đã phải được khởi tạo xong, như mô tả trong hàm khởi tạo. Phương thức packet access() trả về con trỏ đến header TCP, các trường số thứ tự và dấu thời gian đã điền, và phương thức send() của lớp Connector được gọi để để gửi gói xuống lớp dưới. Chú ý rằng, toán tử ngăn cách :: được sử dụng để tránh việc gọi TcpSimpleAgent::send() (đã được định nghĩa). Việc kiểm tra định thời sử dụng phương thức định thời status() được định nghĩa trong lớp TimerHandler. Nó được sử dụng ở đây để thiết lập định thời truyền lại nếu nó chưa được thiết lập (phía gửi TCP chỉ thiết lập một bộ định thời cho mỗi cửa sổ trên mỗi kết nối).


9.5.3. Xử lý đầu vào ở bộ thu


Nhiều agent TCP có thể dùng lớp TCPSink. Lớp này định nghĩa các phương thức recv() và ack() như sau:

void TcpSink::recv(Packet* pkt, Handler*)

{

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



acker_->update(th->seqno());

ack(pkt);

Packet::free(pkt);

}

void TcpSink::ack(Packet* opkt)



{

Packet* npkt = allocpkt();

hdr_tcp *otcp = (hdr_tcp*)opkt->access(off_tcp_);

hdr_tcp *ntcp = (hdr_tcp*)npkt->access(off_tcp_);

ntcp->seqno() = acker_->Seqno();

ntcp->ts() = otcp->ts();

hdr_ip* oip = (hdr_ip*)opkt->access(off_ip_);

hdr_ip* nip = (hdr_ip*)npkt->access(off_ip_);

nip->flowid() = oip->flowid();

hdr_flags* of = (hdr_flags*)opkt->access(off_flags_);

hdr_flags* nf = (hdr_flags*)npkt->access(off_flags_);

nf->ecn_ = of->ecn_;

acker_->append_ack((hdr_cmn*)npkt->access(off_cmn_),

ntcp, otcp->seqno());

send(npkt, 0);

}

Phương thức recv() chiếm dụng phương thức Agent::recv() (đơn giản là loại bỏ các gói đã nhận). Nó cập nhật một số trạng thái nội với số thứ tự của gói đã nhận (và như vậy yêu cầu biến off_tcp_ đã được khởi tạo). Sau đó, nó tạo ra một xác nhận cho gói đã nhận được. Phương thức ack() được sử dụng để truy nhập các trường header gói cả 2 chiều bao gồm vả truy nhập riêng rẽ đến header TCP, header IP, header Flags và header chung. Lệnh send() thực chất là gọi phương thức Connector::send().


9.5.4. Xử lý đáp ứng ở bên gửi


Khi một phía TCP đơn giản nhận dữ liệu và tạo ra ACK, phía gửi thường phải xử lý ACK. Trong agent TcpAgent agent, quá trình này được thực hiện như sau:

/*

* main reception path - should only see acks, otherwise the



* network connections are misconfigured

*/

void TcpAgent::recv(Packet *pkt, Handler*)



{

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

hdr_ip* iph = (hdr_ip*)pkt->access(off_ip_);

...


if (((hdr_flags*)pkt->access(off_flags_))->ecn_)

quench(1);

if (tcph->seqno() > last_ack_) {

newack(pkt);

opencwnd();

} else if (tcph->seqno() == last_ack_) {

if (++dupacks_ == NUMDUPACKS) {

...


}

}

Packet::free(pkt);



send(0, 0, maxburst_);

}

Quá trình này được thực hiện khi ACK đến phía gửi. Trong trường hợp này, thông tin trong ACK được xử lý, gói không cần nữa và trả về cho bộ phânchia bộ nhớ cho gói. Đồng thời, việc nhận được ẠCK cho thấy khả năng gửi gói bổ sung, như vậy phương thức TcpSimpleAgent::send() sẽ cố gắng gửi thêm dữ liệu nếu cửa sổ TCP cho phép.


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


Như được mô tả trong chương sau (Chapter 11), các lớp định thời phải được dẫn xuất từ lớp cơ sở TimerHandler định nghĩa trong ~ns/timer-handler.h. Các lớp con này có thể được sử dụng như các agent định thời. Một agent có thể chiếm dụng phương thức Agent::timeout(). Trong trường hợp agent Tahoe TCP, sử dụng 2 bộ định thời: bộ định thời gửi trễ delsnd_timer_ và bộ định thời truyền lại rtx_timer_. Ta mô tả một ví dụ sử dụng bộ định thời truyền lại trong TCP (Section 11.1.2).


Каталог: 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