Agents 695430059 Outline Introduction Agents UDP agents TCP

  • Slides: 46
Download presentation
Agents 林柏均 695430059

Agents 林柏均 695430059

Outline • • Introduction Agents UDP agents TCP agents

Outline • • Introduction Agents UDP agents TCP agents

Outline • • Introduction Agents UDP agents TCP agents

Outline • • Introduction Agents UDP agents TCP agents

Introduction • Agents represent endpoints where network-layer packets are constructed or consumed. • Agents

Introduction • Agents represent endpoints where network-layer packets are constructed or consumed. • Agents are used in the implementation of protocols at various layers. • The class Agent has an implementation partly in OTcl and partly in C++. – C++ implementation is contained in ~ns/agent. cc and ~ns/agent. h – the OTcl support is in ~ns/tcl/lib/ns-agent. tcl.

Outline • • Introduction Agents UDP agents TCP agents

Outline • • Introduction Agents UDP agents TCP agents

Agent state • • addr_ dst_ size_ : packet bytes type_ : see packet.

Agent state • • addr_ dst_ size_ : packet bytes type_ : see packet. h fid_ : the IP flow identifier (formerly class in ns-1) prio_ : the IP priority field flags_ : packet flags (similar to ns-1) defttl_ : default IP ttl value

Agent methods • Packet* allocpkt() allocate new packet and assign its fields • Packet*

Agent methods • Packet* allocpkt() allocate new packet and assign its fields • Packet* allocpkt(int) allocate new packet with a data payload of n bytes and assign its fields – are generally not over-ridden by derived classes • void timeout(timeout number) subclass-specific time out method • void recv(Packet*, Handler*) receiving agent main receive path – are intended to be over-ridden by classes deriving from Agent

void Agent: : recv(Packet* p, Handler*) { if (app_) app_->recv(hdr_cmn: : access(p)->size()); /* *

void Agent: : recv(Packet* p, Handler*) { if (app_) app_->recv(hdr_cmn: : access(p)->size()); /* * didn't expect packet (or we're a null agent? ) Packet: : free(p); } Packet*Agent: : allocpkt() const { Packet* p = Packet: : alloc(); initpkt(p); return (p); } */

Protocol Agents • TCP a “Tahoe” TCP sender (cwnd = 1 on any loss)

Protocol Agents • TCP a “Tahoe” TCP sender (cwnd = 1 on any loss) • TCP/Reno a “Reno” TCP sender (with fast recovery) • TCP/Newreno a modified Reno TCP sender (changes fast recovery) • TCP/Sack 1 a SACK TCP sender • TCP/Fack a “forward” SACK sender TCP • TCP/Full. Tcp a more full-functioned TCP with 2 -way traffic • TCP/Vegas a “Vegas” TCP sender • TCP/Vegas/RBP a Vegas TCP with “rate based pacing” • TCP/Vegas/RBP a Reno TCP with “rate based pacing”

Protocol Agents • TCP/Asym an experimental Tahoe TCP for asymmetric links • TCP/Reno/Asym an

Protocol Agents • TCP/Asym an experimental Tahoe TCP for asymmetric links • TCP/Reno/Asym an experimental Reno TCP for asymmetric links • TCP/Newreno/Asym an experimental Newreno TCP for asymmetric links • TCPSink a Reno or Tahoe TCP receiver (not used for Full. Tcp) • TCPSink/Del. Ack a TCP delayed-ACK receiver • TCPSink/Asym an experimental TCP sink for asymmetric links • TCPSink/Sack 1 a SACK TCP receiver • TCPSink/Sack 1/Del. Ack a delayed-ACK SACK TCP receiver

Protocol Agents • • UDP a basic UDP agent RTP an RTP sender and

Protocol Agents • • UDP a basic UDP agent RTP an RTP sender and receiver RTCP an RTCP sender and receiver Loss. Monitor a packet sink which checks for losses IVS/Source an IVS source IVS/Receiver an IVS receiver Ctr. Mcast/Encap a “centralised multicast” encapsulator Ctr. Mcast/Decap a “centralised multicast” de-encapsulator

Protocol Agents • • Message a protocol to carry textual messages Message/Prune processes multicast

Protocol Agents • • Message a protocol to carry textual messages Message/Prune processes multicast routing prune messages SRM an SRM agent with non-adaptive timers SRM/Adaptive an SRM agent with adaptive timers Tap interfaces the simulator to a live network Null a degenerate agent which discards packets rt. Proto/DV distance-vector routing protocol agent

TCPs SACK RFC 2018 Tahoe RFC 793 Reno RFC 2001 new. Reno RFC 2582

TCPs SACK RFC 2018 Tahoe RFC 793 Reno RFC 2001 new. Reno RFC 2582 Vegas

OTcl Linkage • Creating and Manipulating Agents set newtcp [new Agent/TCP] ; # create

OTcl Linkage • Creating and Manipulating Agents set newtcp [new Agent/TCP] ; # create new object (and C++ shadow object) $newtcp set window_ 20 ; # sets the tcp agent’s window to 20 $newtcp target $dest ; # target is implemented in Connector class $newtcp set port. ID_ 1 ; # exists only in OTcl, not in C++

Default Values • ~ns/tcl/lib/ns-default. tcl Agent set fid_ 0 Agent set prio_ 0 Agent

Default Values • ~ns/tcl/lib/ns-default. tcl Agent set fid_ 0 Agent set prio_ 0 Agent set addr_ 0 Agent set dst_ 0 Agent set flags_ 0

OTcl Methods • • ~ns/tcl/lib/ns-agent. tcl. port the agent’s port identifier dst-port the destination’s

OTcl Methods • • ~ns/tcl/lib/ns-agent. tcl. port the agent’s port identifier dst-port the destination’s port identifier attach-source (stype) create and attach a Source object to an agent

Examples: Tcp, TCP Sink Agents • Creating the Agent static class Tcp. Class :

Examples: Tcp, TCP Sink Agents • Creating the Agent static class Tcp. Class : public Tcl. Class { public: Tcp. Class() : Tcl. Class("Agent/TCP") {} set tcp [new Agent/TCP] Tcl. Object* create(int , const char*const*) { $tcp set fid_ 2 return (new Tcp. Agent()); set sink [new Agent/TCPSink] } $ns attach-agent $n 0 $tcp } class_tcp; $ns attach-agent $n 3 $sink $ns connect $tcp $sink set ftp [new Application/FTP] $ftp attach-agent $tcp Tcp. Agent: : Tcp. Agent() : Agent(PT_TCP), $ns at 1. 2 "$ftp start" rtt_active_(0), … { Application/FTP instproc start {} { [$self agent] send -1 } bind(…); … }

Tcp. Simple. Agent constructor (~ns/tcp. cc) Tcp. Agent: : Tcp. Agent() : Agent(PT_TCP), rtt_active_(0),

Tcp. Simple. Agent constructor (~ns/tcp. cc) Tcp. Agent: : Tcp. Agent() : Agent(PT_TCP), rtt_active_(0), rtt_seq_(-1), rtx_timer_(this), delsnd_timer_(this) { bind("window_", &wnd_); bind("window. Init_", &wnd_init_); bind("window. Option_", &wnd_option_); bind("window. Constant_", &wnd_const_); . . . bind("off_ip_", &off_ip_); bind("off_tcp_", &off_tcp_); . . . }

Agent constructor (~ns/agent. cc) Agent: : Agent(int pkttype) : addr_(-1), dst_(-1), size_(0), type_(pkttype), fid_(-1),

Agent constructor (~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_); . . . }

Starting the Agent Application/FTP instproc start {} { [$self agent] send -1 } int

Starting the Agent Application/FTP instproc start {} { [$self agent] send -1 } int Agent: : command(int argc, const char*const* argv){ … else if (strcmp(argv[1], "send") == 0) { sendmsg(atoi(argv[2])); return (TCL_OK); } … } //agent. cc void Tcp. Agent: : sendmsg(int nbytes, const char* /*flags*/) { … send_much(0, 0, maxburst_); } //tcp. cc

Generate packets void Tcp. Agent: : output(int seqno, int reason) { Packet* p =

Generate packets void Tcp. Agent: : 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); . . . }

Sender(tcp) Receiver(sink) Output() Tcp. Sink: : recv() Tcp. Sink: : ack() Tcp. Agent: :

Sender(tcp) Receiver(sink) Output() Tcp. Sink: : recv() Tcp. Sink: : ack() Tcp. Agent: : recv() … output Tcp. Sink: : recv() …

Processing Input at Receiver void Tcp. Sink: : recv(Packet* pkt, Handler*) { hdr_tcp *th

Processing Input at Receiver void Tcp. Sink: : recv(Packet* pkt, Handler*) { hdr_tcp *th = (hdr_tcp*)pkt->access(off_tcp_); acker_->update(th->seqno()); ack(pkt); Packet: : free(pkt); }

ack() void Tcp. Sink: : ack(Packet* opkt) { Packet* npkt = allocpkt(); hdr_tcp *otcp

ack() void Tcp. Sink: : 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); }

Processing Responses at the Sender void Tcp. Agent: : recv(Packet *pkt, Handler*) { hdr_tcp

Processing Responses at the Sender void Tcp. Agent: : 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_); }

Creating a New Agent • 1. ~/ns/echo. cc & echo. h • 2. makefile

Creating a New Agent • 1. ~/ns/echo. cc & echo. h • 2. makefile OBJ_CC = … wpan/p 802_15_4 sscs. o wpan/p 802_15_4 timer. o wpan/p 802_15_4 trace. o wpan/p 802_15_4 transac. o echo/echo. o $(OBJ_STL) • 3. difine any necessary classes and functions • 4. link to OTcl

Create packet header format struct ECHOHeader { static int offset_; double lastpkttime_; inline static

Create packet header format struct ECHOHeader { static int offset_; double lastpkttime_; inline static int& offset() { return offset_; } inline static ECHOHeader* access(const Packet* p) { return (ECHOHeader*) p->access(offset_); } };

Class definitions class ECHO_Timer; class ECHO_Agent : public Agent { public: ECHO_Agent(); int command(int

Class definitions class ECHO_Timer; class ECHO_Agent : public Agent { public: ECHO_Agent(); int command(int argc, const char*const* argv); protected: void timeout(int); void sendit(); double interval_; ECHO_Timer echo_timer_; }; class ECHO_Timer : public Timer. Handler { public: ECHO_Timer(ECHO_Agent *a) : Timer. Handler() { a_ = a; } protected: virtual void expire(Event *e); ECHO_Agent *a_; };

The recv() and timeout() Methods void ECHO_Agent: : timeout(int) { sendit(); echo_timer_. resched(interval_); }

The recv() and timeout() Methods void ECHO_Agent: : timeout(int) { sendit(); echo_timer_. resched(interval_); } void ECHO_Agent: : sendit() { Packet* p = allocpkt(); ECHOHeader *eh = ECHOHeader: : access(p->bits()); eh->timestamp() = Scheduler: : instance(). clock(); send(p, 0); // Connector: : send() } void ECHO_Timer: : expire(Event *e) { a_->timeout(0); }

Linking the “ping” Agent with OTcl static class ECHOClass : public Tcl. Class {

Linking the “ping” Agent with OTcl static class ECHOClass : public Tcl. Class { public: ECHOClass() : Tcl. Class("Agent/ECHO") {} Tcl. Object* create(int argc, const char*const* argv) { return (new ECHO_Agent()); } } class_echo;

Echo agent constructor ECHO_Agent: : ECHO_Agent() : Agent(PT_ECHO), echo_timer_(this) { bind_time("interval_", &interval_); bind("packet. Size_",

Echo agent constructor ECHO_Agent: : ECHO_Agent() : Agent(PT_ECHO), echo_timer_(this) { bind_time("interval_", &interval_); bind("packet. Size_", &size_); }

command int ECHO_Agent: : command(int argc, const char*const* argv) { if (argc == 2)

command int ECHO_Agent: : command(int argc, const char*const* argv) { if (argc == 2) { if (strcmp(argv[1], "start") == 0) { timeout(0); return (TCL_OK); } } return (Agent: : command(argc, argv)); }

ns/common/packet. h enum packet_t { PT_TCP, PT_UDP, ………… PT_AODV, PT_ECHO, ………… // insert new

ns/common/packet. h enum packet_t { PT_TCP, PT_UDP, ………… PT_AODV, PT_ECHO, ………… // insert new packet types here PT_NTYPE // This MUST be the LAST one }; class p_info { public: p_info() { name_[PT_TCP]= "tcp"; name_[PT_UDP]= "udp"; name_[PT_AODV]= "AODV"; name_[PT_ECHO]= "ECHO"; …… } };

ns-ns-2. 29tracecmu-trace. cc void CMUTrace: : format(Packet* p, const char *why){ …… case PT_GAF:

ns-ns-2. 29tracecmu-trace. cc void CMUTrace: : format(Packet* p, const char *why){ …… case PT_GAF: break; case PT_ECHO: break; …… }

Using the agent through OTcl set echoagent [new Agent/ECHO] $simulator attach-agent $node $echoagent set

Using the agent through OTcl set echoagent [new Agent/ECHO] $simulator attach-agent $node $echoagent set dst_ $dest $echoagent set fid_ 0 $echoagent set prio_ 0 $echoagent set flags_ 0 $echoagent set interval_ 1. 5 $echoagent set packet. Size_ 1024 $echoagent start

command(start) timeout(0) expire() sendit() send() echo_timer_. resched(interval_);

command(start) timeout(0) expire() sendit() send() echo_timer_. resched(interval_);

Outline • • Introduction Agents UDP agents TCP agents

Outline • • Introduction Agents UDP agents TCP agents

UDP Agents • Agent/UDP set packet. Size_ 1000 • UDP packets also contain a

UDP Agents • Agent/UDP set packet. Size_ 1000 • UDP packets also contain a monotonically increasing sequence number and an RTP timestamp. set ns [new Simulator] set n 0 [$ns node] set n 1 [$ns node] $ns duplex-link $n 0 $n 1 5 Mb 2 ms Drop. Tail set udp 0 [new Agent/UDP] $ns attach-agent $n 0 $udp 0 set cbr 0 [new Application/Traffic/CBR] $cbr 0 attach-agent $udp 0 set packet. Size_ 536 ; # set MSS to 536 bytes set null 0 [new Agent/Null] $ns attach-agent $n 1 $null 0 $ns connect $udp 0 $null 0 $ns at 1. 0 "$cbr 0 start"

Outline • • Introduction Agents UDP agents TCP agents

Outline • • Introduction Agents UDP agents TCP agents

TCP Agents • There are two major types of TCP agents: – one-way agents

TCP Agents • There are two major types of TCP agents: – one-way agents : sender & receiver – a two-way agent : still under development

One-way TCP agents • The one-way TCP sending agents currently supported are: – –

One-way TCP agents • The one-way TCP sending agents currently supported are: – – – Agent/TCP - a “tahoe” TCP sender Agent/TCP/Reno - a “Reno” TCP sender Agent/TCP/Newreno - Reno with a modification Agent/TCP/Sack 1 - TCP with selective repeat (follows RFC 2018) Agent/TCP/Vegas - TCP Vegas Agent/TCP/Fack - Reno TCP with “forward acknowledgment” • The one-way TCP receiving agents currently supported are: – – Agent/TCPSink - TCP sink with one ACK per packet Agent/TCPSink/Del. Ack - TCP sink with configurable delay per ACK Agent/TCPSink/Sack 1 - selective ACK sink (follows RFC 2018) Agent/TCPSink/Sack 1/Del. Ack - Sack 1 with Del. Ack

Reno & Tahoe Congestion avoidance Slow start Fast recovery

Reno & Tahoe Congestion avoidance Slow start Fast recovery

TCPs SACK RFC 2018 Tahoe RFC 793 Reno RFC 2001 new. Reno RFC 2582

TCPs SACK RFC 2018 Tahoe RFC 793 Reno RFC 2001 new. Reno RFC 2582 Vegas

Two-Way TCP Agents (Full. Tcp) • connections may be established and town down (SYN/FIN

Two-Way TCP Agents (Full. Tcp) • connections may be established and town down (SYN/FIN packets are exchanged) • bidirectional data transfer is supported • The generation of SYN packets (and their ACKs) can be of critical importance in trying to model real-world behavior when using many very short data transfers.

Two-Way TCP Agents (Full. Tcp) set src [new Agent/TCP/Full. Tcp] set sink [new Agent/TCP/Full.

Two-Way TCP Agents (Full. Tcp) set src [new Agent/TCP/Full. Tcp] set sink [new Agent/TCP/Full. Tcp] $ns_ attach-agent $node_(s 1) $src $ns_ attach-agent $node_(k 1) $sink $src set fid_ 0 $sink set fid_ 0 $ns_ connect $src $sink listen $src set window_ 100;

One-Way Trace TCP Trace Dynamics + 0. 95176 2 event time from 3 tcp

One-Way Trace TCP Trace Dynamics + 0. 95176 2 event time from 3 tcp 1000 ------ 0 to type fid size flags 0. 0 src 3. 0 dst node port 27 seq 42 id