en computer networks - redes de computadores · ~note: 1 hz != 1 bit/s in general normally depends...
TRANSCRIPT
Unit 7: Link layer protocols
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 11
Computer Networks
Models and metricsStop and Wait Protocol.
Efficiency and channel utilization
Sliding window protocol.Using data windows and timers
Error control.Go-back-n and selective retransmission.
Implementations.
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 22
ShannonShannon andand Weaver'sWeaver's modelmodel
source system destination system
An information source, which produces a message. A transmitter, which encodes the message into signals A channel, to which signals are adapted for transmission A receiver, which 'decodes' (reconstructs) the message from
the signal. A destination, where the message arrives. A sixth element, noise is a dysfunctional factor: any
interference with the message traveling along the channel which may lead to the signal received being different from that sent.
An information source, which produces a message. A transmitter, which encodes the message into signals A channel, to which signals are adapted for transmission A receiver, which 'decodes' (reconstructs) the message from
the signal. A destination, where the message arrives. A sixth element, noise is a dysfunctional factor: any
interference with the message traveling along the channel which may lead to the signal received being different from that sent.
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 33
models for frame transmission: temporal diagrammodels for frame transmission: temporal diagram
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 44
Flow controlFlow control
Flow control: what for?Ensuring the sending entity does not overwhelm the receiving entity
Preventing buffer overflowLimiting the latency effects
Remember about Fragmentation:Large blocks of data are split into small frames
Limited buffer sizeErrors detected sooner (when whole frame received)On error, retransmission of smaller frames is neededPrevents one station occupying medium for long periods
ARQ techniques (Automatic Retransmission Request):The receiver informs the transmitter about when is ready to receive more dataThe transmitter MUST wait for this indication before continuing the transmission
Two basic strategies:Stop & WaitPipeline (aka: Sliding Window)
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 55
Metrics involved: BandwidthMetrics involved: Bandwidth
Bandwidth: number of bits that can be transmitted per time unit
Bandwidth often means “data rate” (R) in networking contextmaximum rate of data transmission on a linktypically specified in Kb/s, Mb/s, Gb/salso can refer to spectrum (Hz)
Note: 1 Hz != 1 bit/s in general
Normally depends on the technology being adoptedExample: Ethernet = 10 Mbps R=107 bits per second
Time to transmit 1 bit=1/bandwidth = 1/RAt 10 Mbps, time to transmit 1 bit = 0.1 µs = 100 ns
Time to transmit x bits=x/bandwidth = x/RAt 10 Mbps, time to transmit 1000 bit=100 ms
Bandwidth and bit sizeAt 1 Mbps: 1 bit = 1 µs wideAt 2 Mbps: 1 bit = 0.5 µs wide
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 66
Metrics involved: throughputMetrics involved: throughput
When talking about packets, we often talk in terms of bytesdue to computer architectures
We may also talk about packets per secondExample: Router forwarding speed
ThroughputThroughput <= bandwidthtransfer amount (bits)/time required (sec)
Utilization = Throughput/Bandwidth
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 77
Metrics: latencyMetrics: latency
Latency means delaytime to send a message from point A to point Bone-way versus round-trip time (RTT)Absolute or Time-varying (jitter)
ComponentsLatency = Transmit delay+ Propagation delay + Queue timePropagation delay = tprop= d/ Vp; normally Vp=2*108 ms
Example: How long does is take for a signal to reach the moon?One-way delay = 3.85*108 m/3.0*108 m/s=1.3 secRound-trip delay=2.6 seconds
Transmit time = tframe=L/R
Transmitter (queuing) delay
Propagation delay
Transmitdelay
Receiver (reassembly) delay
N, ..., 2, 1N, ..., 2, 1
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 88
ttttttU
ackproprespframeprop
frame
++++=
Stop and waitStop and wait
tframe = frame transmission time = L/Rtack = ack transmission timetprop = propagation time = d/Vp
tresp = response (processing) time
supposing tresp and tack are negligibleand normalizing with respect to tframe
tframe
tack
tprop
tresp
tprop
aU
211
+≅
LVRd
tt
apframe
prop ==where
EfficiencyEfficiency
PDU
ACK
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 99
ExamplesExamples
An ATM WAN with fiber optics linksd = 1000 km; L = 53 bytes; R = 155 Mbps; Vp= 2*108 m/sec
tframe = 424/(155*106) = 2,73*10-6 segtprop =106/2*108 = 5*10-3 seg.a = (5*10-3)/(2,73*10-6) = 1851U = 1/3703 = 0,00027
An 10Mbps Ethernet LAN d = 100 m; L = 1 kB; R = 10 Mbps ; Vp= 2*108 m/sec
tframe = 8000/(10*106) = 8*10-4 segtprop =100/2*108 = 5*10-7 seg.a = (5*10-7)/(8*10-4) = 0,000625U = 1/1.001 = 0,99
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1010
Impact of factor Impact of factor ‘‘aa’’
tframe = 1 a = tproptframe = 1 a = tprop
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1111
Sliding window: an exampleSliding window: an example
5 4 3 2 1 0 0
5 4 3 2 1 0
5 4 3 2 1 0
0
1
2
1 0
22
1 0
7 6 5 4 3 27 6
7 6 5 4 3 2
7 6 5 4 3 2
3
4
3 2
4 3 2
TTT RRR5 4 3 2 1 0
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1212
Sliding window elementsSliding window elements
transmittertransmitter
nn
Acknowledgedframes
Frames waiting for an ACK
Frames that can be sentFrames that cannot
be sent wwTT
5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3
channel
receiverreceiver3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1
nnAcknowledged
frames
Frames waited or to be acknowledged
Frames out of sequence and that cannot be accepted wwRR
channel
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1313
SlidingSliding windowwindow principlesprinciples
from Tanenbaum’s book
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1414
PipelinePipeline protocolsprotocols: : anan alternativealternative representationrepresentation
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
Rx windowConstant sizeCan be =1 or >1
012
3456
7
Tx windowlower limithigher limit
Variable size
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1515
Impact of factor Impact of factor ‘‘aa’’
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1616
Window sizeWindow size
N indicates the window size in the transmitterIf N > 1 the protocol is referred to as “pipeline”
When N ≥ 1+2a the transmitter can send frames back-to-back continuously, we obtain the maximum utilization
In general:
⎪⎩
⎪⎨⎧
+<+
+≥= 12
12
121aN
aN
aNU
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1717
Error controlError control
Error control requires flow control strategies to adjustAn error can basically:
Modify one or more data (or ACK) frame bits ⇒ garbled frame receptionDelete a frame (or an ACK) ⇒ frame lost
How can the receiver know whether the frame has been received correctly? It waits for an ACK before a timeout period
If the timeout expires then it sends again (retransmission)The timeout value is a very critical parameter
What if the receiver does not receive the ACK?
There can be an error in the frameThere can be an error in the ACKFrames must be numbered to detect duplicates
1
1
timeout
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1818
An example: the Alternating bit protocolAn example: the Alternating bit protocol
T
vt
TT
vvtt
R
vr
RR
vvrr
vvtt = 0= 0
vvtt = 0= 0
vvtt = 1= 1
vvtt = 1= 1
vvtt = 0= 0
vvrr = 0= 0
vvrr = 1= 1
vvrr = 1= 1
vvrr = 0= 0
vvrr = 0= 0
N (T) = 0N (T) = 0
N (R) = 1N (R) = 1
N (T) = 1N (T) = 1
N (R) = 0N (R) = 0
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 1919
Error control with pipeline protocolsError control with pipeline protocols
Two strategies: when a frame is lost and the following frames are received:they are rejected go-back-nthey are accepted selective repeat
Go-back-n:Receiver window size = 1It is not adequate for channels with high BER
Selective repeat:Receiver window size > 1Requires more resources (buffers)
Using ACKs:They must be numberedGlobal ACKs:
E.g., ACK3 indicates that frames 2, 1 and 0 were received correctly
WATCH OUT!: the transmitter window size cannot be greater than the largestsequence number
For example: if MAX_SEQ = 7 (three bits) then the maximum window size can be up to 7
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2020
GoGo--backback--n: n: anan exampleexample
2 1 0 00
2 1 0 1
3 2 1 2
1
3 2 1 3
1
3
0
3 2 13
timeout
3 2 1 2
4 3 2 3
3 2 1 1
24 23
1
42
5 34
2
53
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2121
GoGo--backback--n: n: anan exampleexample / / alternativealternative representationrepresentation0
1
2
0
3
0
2
3
11
1
2
2
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
Tim
eOut
fram
e1
012
3456
7
012
3456
7
01234
56
7
Tim
eOut
fram
e2
Tim
eOut
fram
3
012
3456
7
01234
56
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7
012
3456
7 012
3456
7
012
3456
7
012
3456
7
012
3456
7
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2222
SelectiveSelective repeatrepeat: : anan exampleexample
2 1 0 0
2 1 0 1
3 2 1 2
1
3 2 1 3
3 2 13
3 2 1 2
6 5 4 4
3 2 1 1
6 45
0
6 5 44 3 2 1
0
2 -
3 2 -
4
3 2 1
timeout
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2323
A few last things...A few last things...
Negative acknowledgmentThe receiver indicates to the sender about the incorrect reception of a frame.They can be sent, for example, after the reception of a garbled or of an out-of-order frameThey allow faster frame retransmission.
Sender and receiver must use larger buffers
PiggybackingConsists in including in a data frame an ACK field (backward ACK )When sending ACKs jointly with actual data we can increase network utilization
0
1
0
1
N(t)=0, ack=0
N(r)=0, ack=1
N(t)=1, ack=1
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2424
More about metrics: bandwidthMore about metrics: bandwidth--delay product delay product
The Bandwidth-delay product allows to estimate the capacity of the channel being used
Think of data as fluid and links as pipes30 ms * 1.5 Mb/s == 300 ms * 150 Kb/s
Example: a satellite channelL = 1000 bits; R = 50 kbps; tprop= 250 msectframe = 1000/(50*103) = 20*10-3 sega = 250*10-3/20*10-3 = 12,5U = 1/26 = 0,038
It can be calculated by multiplying the bandwidth with twice the round-trip-time (RTT = 2*tprop)
In the above example: RTT = 500 msecB-D = 50*103 * 500*10-3 = 25.000 bits
Since frames are 1.000 bits long N = 25.000/1.000 = 25
delay
BW
N = 2a+1 = 12,5*2 + 1 = 26N = 2a+1 = 12,5*2 + 1 = 26
¿26≠25?
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2525
More about metrics: bandwidthMore about metrics: bandwidth--delay productdelay product
Exercise: a DVD-10 (DS/SL) can hold up to 8.75 GB (9.4*109bytes). A 28x24x20 cm box can hold 160 DVDs. Using express regular mail the box can be sent in 24 hours to, for example Stockholm (about 4500 km). Calculate the bandwidth-delay product. Compare it with a dedicated 10Gbps line.
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2626
More about metrics: bandwidth vs. latencyMore about metrics: bandwidth vs. latency
With an 8.4 Mb file:(a) the 1 Mbps link has 84 pipes full of data; (b) the 1 Gbps link has 1/12 of one pipe full of data
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2727
More about metrics: bandwidth vs. latencyMore about metrics: bandwidth vs. latency
For short messages, latency dominates transfer timeFor long messages, bandwidth dominates transfer time
What are short and long?latency term = bandwidth term when latency = message_size/bandwidth
Critical message size = latency * bandwidth
Example: 50 µs * 50 MB/s = 2500 bytesmessages longer than 2500 bytes are bandwidth dominatedmessages shorter than 2500 bytes are latency dominated
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2828
More about metrics: More about metrics: ThroughputThroughput
ThroughputThroughput <= bandwidthUtilization = Throughput/BandwidthT = TransferSize (bits)/TransferTime (sec)Where TransferTime=RTT + TransferSize/Bandwidth
Examples: Effective throughput=1 ms, 8 bits, 1 Mbps:
Transfer size/delay=8 Kbps: Throughput=8Kbps
100 µs, 8000 bits, 100 Mbps: Transfer size/delay=80 Mbps: Throughput=44Mbps
1 ms, 25 MB, 10 Mbps: Transfer size/delay=210 Gbps: Throughput=10 Mbps
Unit 7: Link layer protocols
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 2929
Computer Networks
Implementation examples “utopía”Stop and waitParSliding windowPipeline
References: Tanenbaum, Chap. 3.3, 3.4
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3030
PremisesPremises
Tanenbaum’s implementations proposals
We suppose that the network, data link and the physical layers are independent processes that communicate through message interchange
Physical
D.Link
network
Physical
D.Link
network
∞ data∞ data
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3131
Protocol.hProtocol.h: data : data structuresstructures#define MAX_PKT 1024 typedef enum {false, true} boolean; typedef unsigned int seq_nr; typedef struct {unsigned char data[MAX_PKT];} packet; typedef enum {data, ack, nak} frame_kind; typedef struct { /* frames are transported in this layer */ frame_kind kind; /* what kind of a frame is it? */ seq_nr seq; /* sequence number */ seq_nr ack; /* acknowledgement number */ packet info; /* the network layer packet */ } frame; /* Macro inc is expanded in-line: Increment k circularly. */ #define inc(k) if (k < MAX_SEQ) k = k + 1; else k = 0
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3232
Protocol.hProtocol.h: : functionsfunctions declarationsdeclarations ((partpart 1)1)/* Fetch a packet from the network layer for transmission on the channel. */ void from_network_layer(packet *p); /* Deliver information from an inbound frame to the network layer. */ void to_network_layer(packet *p); /* Go get an inbound frame from the physical layer and copy it to r. */ void from_physical_layer(frame *r); /* Pass the frame to the physical layer for transmission. */ void to_physical_layer(frame *s); /* Wait for an event to happen; return its type in event. */ void wait_for_event(event_type *event); /* Start the clock running and enable the timeout event. */ void start_timer(seq_nr k);
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3333
““utoputopííaa”” protocolprotocol/* Protocol 1 (utopia) */ typedef enum {frame_arrival} event_type; #include "protocol.h" void sender1(void) { frame s; /* buffer for an outbound frame */ packet buffer; /* buffer for an outbound packet */ while (true) { from_network_layer(&buffer); /* go get something to send */ s.info = buffer; /* copy it into s for transmission */ to_physical_layer(&s); /* send it on its way */ } } void receiver1(void) { frame r; event_type event; /* filled in by wait, but not used here */ while (true) { wait_for_event(&event); /* only possibility is frame_arrival */ from_physical_layer(&r); /* go get the inbound frame */ to_network_layer(&r.info); /* pass the data to the network layer */ } }
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3434
Stop Stop andand waitwait/* Protocol 2 (stop-and-wait) */ typedef enum {frame_arrival} event_type; #include "protocol.h" void sender2(void) { frame s; /* buffer for an outbound frame */ packet buffer; /* buffer for an outbound packet */ event_type event; /* frame_arrival is the only possibility */ while (true) { from_network_layer(&buffer); /* go get something to send */ s.info = buffer; /* copy it into s for transmission */ to_physical_layer(&s); /* bye bye little frame */ wait_for_event(&event); /* do not proceed until allowed */ } } void receiver2(void) { frame r, s; /* buffers for frames */ event_type event; /* frame_arrival is the only possibility */ while (true) { wait_for_event(&event); /* only possibility is frame_arrival */ from_physical_layer(&r); /* go get the inbound frame */ to_network_layer(&r.info); /* pass the data to the network layer */ to_physical_layer(&s); /* send a dummy frame to awaken sender */ } }
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3535
Par: Par: thethe transmittertransmitter/* Protocol 3 (par) */ #define MAX_SEQ 1 /* must be 1 for protocol 3 */ typedef enum {frame_arrival, cksum_err, timeout} event_type; #include "protocol.h" void sender3(void) { seq_nr next_frame_to_send; /* seq number of next outgoing frame */ frame s; /* scratch variable */ packet buffer; /* buffer for an outbound packet */ event_type event; next_frame_to_send = 0; /* initialize outbound sequence numbers */ from_network_layer(&buffer); /* fetch first packet */ while (true) { s.info = buffer; /* construct a frame for transmission */ s.seq = next_frame_to_send; /* insert sequence number in frame */ to_physical_layer(&s); /* send it on its way */ start_timer(s.seq); /* if answer takes too long, time out */ wait_for_event(&event); /* frame_arrival, cksum_err, timeout */ if (event == frame_arrival) { from_physical_layer(&s); /* get the acknowledgement */ if (s.ack == next_frame_to_send) { from_network_layer(&buffer); /* get the next one to send */ inc(next_frame_to_send); /* invert next_frame_to_send */ } } } }
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3636
Par: Par: thethe receiverreceiver/* Protocol 3 (par) */
#define MAX_SEQ 1 /* must be 1 for protocol 3 */typedef enum {frame_arrival, cksum_err, timeout} event_type;#include "protocol.h"
void receiver3(void){ seq_nr frame_expected; frame r, s; event_type event;
frame_expected = 0; while (true) { wait_for_event(&event); /* frame_arrival or cksum_err */ if (event == frame_arrival) { /* A valid frame has arrived. */ from_physical_layer(&r); /* go get the newly arrived frame */ if (r.seq == frame_expected) {/* This is what we have been waiting for. */ to_network_layer(&r.info); /* pass the data to the network layer */ inc(frame_expected); /* next time expect the other sequence nr */ } s.ack = 1 - frame_expected; /* tell which frame is being acked */ to_physical_layer(&s); /* only the ack field is use */ } }}
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3737
SlidingSliding windowwindow (1/2)(1/2)/* Protocol 4 (sliding window)*/ #define MAX_SEQ 1 /* must be 1 for protocol 4 */ typedef enum {frame_arrival, cksum_err, timeout} event_type; #include "protocol.h" void protocol4 (void) { seq_nr next_frame_to_send; /* 0 or 1 only */ seq_nr frame_expected; /* 0 or 1 only */ frame r, s; /* scratch variables */ packet buffer; /* current packet being sent */ event_type event; next_frame_to_send = 0; /* next frame on the outbound stream */ frame_expected = 0; /* number of frame arriving frame expected */ from_network_layer(&buffer); /* fetch a packet from the network layer */ s.info = buffer; /* prepare to send the initial frame */ s.seq = next_frame_to_send; /* insert sequence number into frame */ s.ack = 1 - frame_expected; /* piggybacked ack */ to_physical_layer(&s); /* transmit the frame */ start_timer(s.seq); /* start the timer running */ ...
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3838
SlidingSliding windowwindow (2/2)(2/2)... while (true) { wait_for_event(&event); /* frame_arrival, cksum_err, timeout */ if (event == frame_arrival) { /* a frame has arrived undamaged. */ from_physical_layer(&r); /* go get it */ if (r.seq == frame_expected) { /* Handle inbound frame stream. */ to_network_layer(&r.info); /* pass packet to network layer */ inc(frame_expected); /* invert sequence number expected next */ } if (r.ack == next_frame_to_send) { /* handle outbound frame stream. */ from_network_layer(&buffer); /* fetch new packet from NL */ inc(next_frame_to_send); /* invert sender's sequence number */ } } s.info = buffer; /* construct outbound frame */ s.seq = next_frame_to_send; /* insert sequence number into it */ s.ack = 1 - frame_expected; /* seq number of last received frame */ to_physical_layer(&s); /* transmit a frame */ start_timer(s.seq); /* start the timer running */ } }
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 3939
ExamplesExamples
Tanenbaum’s Fig. 3.14
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4040
Protocol.hProtocol.h: : functionsfunctions declarationsdeclarations ((partpart 2)2) /* Stop the clock and disable the timeout event. */ void stop_timer(seq_nr k); /* Start an auxiliary timer and enable the ack_timeout event. */ void start_ack_timer(void); /* Stop the auxiliary timer and disable the ack_timeout event. */ void stop_ack_timer(void); /* Allow the network layer to cause a network_layer_ready event. */ void enable_network_layer(void); /* Forbid the network layer from causing a network_layer_ready event. */ void disable_network_layer(void);
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4141
PipelinePipeline protocolsprotocols: : gogo--backback--n n (1/4)(1/4)/* Protocol 5 (pipelining) */
#include "protocol.h"#define MAX_SEQ 7 /* should be 2^n - 1 */
typedef enum {frame_arrival, cksum_err, timeout, network_layer_ready} event_type;
static boolean between(seq_nr a, seq_nr b, seq_nr c){
/* Return true if (a <=b < c circularly; false otherwise. */if (((a <= b) && (b < c)) || ((c < a) && (a <= b)) || ((b < c) && (c < a)))
return(true);else
return(false);}
static void send_data(seq_nr frame_nr, seq_nr frame_expected, packet buffer[]){
/* Construct and send a data frame. */frame s;
s.info = buffer[frame_nr]; /* insert packet into frame */s.seq = frame_nr; /* insert sequence number into frame */s.ack = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1); /* piggyback ack */to_physical_layer(&s); /* transmit the frame */start_timer(frame_nr); /* start the timer running */
}
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4242
PipelinePipeline protocolsprotocols: : gogo--backback--n n (2/4)(2/4)void protocol5(void){
seq_nr next_frame_to_send; /* MAX_SEQ > 1; used for outbound stream */seq_nr ack_expected; /* oldest frame as yet unacknowledged */seq_nr frame_expected; /* next frame expected on inbound stream */frame r; /* scratch variable */packet buffer[MAX_SEQ+1]; /* buffers for the outbound stream */seq_nr nbuffered; /* # output buffers currently in use */seq_nr i; /* used to index into the buffer array */event_type event;
enable_network_layer(); /* allow network_layer_ready events */ack_expected = 0; /* next ack expected inbound */next_frame_to_send = 0; /* next frame going out */frame_expected = 0; /* number of frame expected inbound */nbuffered = 0; /* initially no packets are buffered */
void protocol5(void){
seq_nr next_frame_to_send; /* MAX_SEQ > 1; used for outbound stream */seq_nr ack_expected; /* oldest frame as yet unacknowledged */seq_nr frame_expected; /* next frame expected on inbound stream */frame r; /* scratch variable */packet buffer[MAX_SEQ+1]; /* buffers for the outbound stream */seq_nr nbuffered; /* # output buffers currently in use */seq_nr i; /* used to index into the buffer array */event_type event;
enable_network_layer(); /* allow network_layer_ready events */ack_expected = 0; /* next ack expected inbound */next_frame_to_send = 0; /* next frame going out */frame_expected = 0; /* number of frame expected inbound */nbuffered = 0; /* initially no packets are buffered */
nnAcknowledgedframes
frame_expected
wwRR
nn
Acknowledgedframes
wwTT
5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 TxTx
RxRx3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3
MAX_SEQ
nbuffered
ack_expectednext_frame_to_send
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4343
PipelinePipeline protocolsprotocols: : gogo--backback--n n (3/4)(3/4)
while (true) {wait_for_event(&event); /* four possibilities: see event_type above */
switch(event) { case network_layer_ready: /* the network layer has a packet to send */
/* Accept, save, and transmit a new frame. */from_network_layer(&buffer[next_frame_to_send]); /* fetch new packet */nbuffered = nbuffered + 1; /* expand the sender's window */send_data(next_frame_to_send, frame_expected, buffer); /* transmit the frame */inc(next_frame_to_send); /* advance sender's upper window edge */break;
case frame_arrival: /* a data or control frame has arrived */from_physical_layer(&r); /* get incoming frame from physical layer */if (r.seq == frame_expected) {
/* Frames are accepted only in order. */to_network_layer(&r.info); /* pass packet to network layer */inc(frame_expected); /* advance lower edge of receiver's window */
}
/* Ack n implies n - 1, n - 2, etc. Check for this. */while (between(ack_expected, r.ack, next_frame_to_send)) {
/* Handle piggybacked ack. */nbuffered = nbuffered - 1; /* one frame fewer buffered */stop_timer(ack_expected); /* frame arrived intact; stop timer */inc(ack_expected); /* contract sender's window */
} break;
while (true) {wait_for_event(&event); /* four possibilities: see event_type above */
switch(event) { case network_layer_ready: /* the network layer has a packet to send */
/* Accept, save, and transmit a new frame. */from_network_layer(&buffer[next_frame_to_send]); /* fetch new packet */nbuffered = nbuffered + 1; /* expand the sender's window */send_data(next_frame_to_send, frame_expected, buffer); /* transmit the frame */inc(next_frame_to_send); /* advance sender's upper window edge */break;
case frame_arrival: /* a data or control frame has arrived */from_physical_layer(&r); /* get incoming frame from physical layer */if (r.seq == frame_expected) {
/* Frames are accepted only in order. */to_network_layer(&r.info); /* pass packet to network layer */inc(frame_expected); /* advance lower edge of receiver's window */
}
/* Ack n implies n - 1, n - 2, etc. Check for this. */while (between(ack_expected, r.ack, next_frame_to_send)) {
/* Handle piggybacked ack. */nbuffered = nbuffered - 1; /* one frame fewer buffered */stop_timer(ack_expected); /* frame arrived intact; stop timer */inc(ack_expected); /* contract sender's window */
} break;
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4444
PipelinePipeline protocolsprotocols: : gogo--backback--n n (4/4)(4/4)
case cksum_err: ; /* just ignore bad frames */break;
case timeout: /* trouble; retransmit all outstanding frames */next_frame_to_send = ack_expected; /* start retransmitting here */for (i = 1; i <= nbuffered; i++) {
send_data(next_frame_to_send, frame_expected, buffer); /* resend 1 frame */inc(next_frame_to_send); /* prepare to send the next one */
}}
if (nbuffered < MAX_SEQ)enable_network_layer();
elsedisable_network_layer();
}}
case cksum_err: ; /* just ignore bad frames */break;
case timeout: /* trouble; retransmit all outstanding frames */next_frame_to_send = ack_expected; /* start retransmitting here */for (i = 1; i <= nbuffered; i++) {
send_data(next_frame_to_send, frame_expected, buffer); /* resend 1 frame */inc(next_frame_to_send); /* prepare to send the next one */
}}
if (nbuffered < MAX_SEQ)enable_network_layer();
elsedisable_network_layer();
}}
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4545
PipelinePipeline protocolsprotocols: : selectiveselective repeatrepeat (1/4)(1/4)
/* Protocol 6 (nonsequential receive) */
#define MAX_SEQ 7 /* should be 2^n - 1 */#define NR_BUFS ((MAX_SEQ + 1)/2)typedef enum {frame_arrival, cksum_err, timeout, network_layer_ready, ack_timeout} event_type;#include "protocol.h"boolean no_nak = true; /* no nak has been sent yet */seq_nr oldest_frame = MAX_SEQ+1; /* init value is for the simulator */
static boolean between(seq_nr a, seq_nr b, seq_nr c) { /* Same as between in protocol5, but shorter and more obscure. */return ((a <= b) && (b < c)) || ((c < a) && (a <= b)) || ((b < c) && (c < a));
}
static void send_frame(frame_kind fk, seq_nr frame_nr, seq_nr frame_expected, packet buffer[]){ /* Construct and send a data, ack, or nak frame. */
frame s; /* scratch variable */
s.kind = fk; /* kind == data, ack, or nak */if (fk == data) s.info = buffer[frame_nr % NR_BUFS];s.seq = frame_nr; /* only meaningful for data frames */s.ack = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1);if (fk == nak) no_nak = false; /* one nak per frame, please */to_physical_layer(&s); /* transmit the frame */if (fk == data) start_timer(frame_nr % NR_BUFS);stop_ack_timer(); /* no need for separate ack frame */
}
/* Protocol 6 (nonsequential receive) */
#define MAX_SEQ 7 /* should be 2^n - 1 */#define NR_BUFS ((MAX_SEQ + 1)/2)typedef enum {frame_arrival, cksum_err, timeout, network_layer_ready, ack_timeout} event_type;#include "protocol.h"boolean no_nak = true; /* no nak has been sent yet */seq_nr oldest_frame = MAX_SEQ+1; /* init value is for the simulator */
static boolean between(seq_nr a, seq_nr b, seq_nr c) { /* Same as between in protocol5, but shorter and more obscure. */return ((a <= b) && (b < c)) || ((c < a) && (a <= b)) || ((b < c) && (c < a));
}
static void send_frame(frame_kind fk, seq_nr frame_nr, seq_nr frame_expected, packet buffer[]){ /* Construct and send a data, ack, or nak frame. */
frame s; /* scratch variable */
s.kind = fk; /* kind == data, ack, or nak */if (fk == data) s.info = buffer[frame_nr % NR_BUFS];s.seq = frame_nr; /* only meaningful for data frames */s.ack = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1);if (fk == nak) no_nak = false; /* one nak per frame, please */to_physical_layer(&s); /* transmit the frame */if (fk == data) start_timer(frame_nr % NR_BUFS);stop_ack_timer(); /* no need for separate ack frame */
}
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4646
PipelinePipeline protocolsprotocols: : selectiveselective repeatrepeat (2/4)(2/4)void protocol6(void){
seq_nr ack_expected; /* lower edge of sender's window */seq_nr next_frame_to_send; /* upper edge of sender's window + 1 */seq_nr frame_expected; /* lower edge of receiver's window */seq_nr too_far; /* upper edge of receiver's window + 1 */int i; /* index into buffer pool */frame r; /* scratch variable */packet out_buf[NR_BUFS]; /* buffers for the outbound stream */packet in_buf[NR_BUFS]; /* buffers for the inbound stream */boolean arrived[NR_BUFS]; /* inbound bit map */seq_nr nbuffered; /* how many output buffers currently used */event_type event;
enable_network_layer(); /* initialize */ack_expected = 0; /* next ack expected on the inbound stream */next_frame_to_send = 0; /* number of next outgoing frame */frame_expected = 0; /* frame number expected */too_far = NR_BUFS; /* receiver's upper window + 1 */nbuffered = 0; /* initially no packets are buffered */
for (i = 0; i < NR_BUFS; i++) arrived[i] = false;while (true) {
wait_for_event(&event); /* five possibilities: see event_type above */switch(event) {
case network_layer_ready: /* accept, save, and transmit a new frame */nbuffered = nbuffered + 1; /* expand the window */from_network_layer(&out_buf[next_frame_to_send % NR_BUFS]); /* fetch new packet */send_frame(data, next_frame_to_send, frame_expected, out_buf); /* transmit the frame */inc(next_frame_to_send); /* advance upper window edge */break;
void protocol6(void){
seq_nr ack_expected; /* lower edge of sender's window */seq_nr next_frame_to_send; /* upper edge of sender's window + 1 */seq_nr frame_expected; /* lower edge of receiver's window */seq_nr too_far; /* upper edge of receiver's window + 1 */int i; /* index into buffer pool */frame r; /* scratch variable */packet out_buf[NR_BUFS]; /* buffers for the outbound stream */packet in_buf[NR_BUFS]; /* buffers for the inbound stream */boolean arrived[NR_BUFS]; /* inbound bit map */seq_nr nbuffered; /* how many output buffers currently used */event_type event;
enable_network_layer(); /* initialize */ack_expected = 0; /* next ack expected on the inbound stream */next_frame_to_send = 0; /* number of next outgoing frame */frame_expected = 0; /* frame number expected */too_far = NR_BUFS; /* receiver's upper window + 1 */nbuffered = 0; /* initially no packets are buffered */
for (i = 0; i < NR_BUFS; i++) arrived[i] = false;while (true) {
wait_for_event(&event); /* five possibilities: see event_type above */switch(event) {
case network_layer_ready: /* accept, save, and transmit a new frame */nbuffered = nbuffered + 1; /* expand the window */from_network_layer(&out_buf[next_frame_to_send % NR_BUFS]); /* fetch new packet */send_frame(data, next_frame_to_send, frame_expected, out_buf); /* transmit the frame */inc(next_frame_to_send); /* advance upper window edge */break;
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4747
PipelinePipeline protocolsprotocols: : selectiveselective repeatrepeat (3/4)(3/4)
case frame_arrival: /* a data or control frame has arrived */from_physical_layer(&r); /* fetch incoming frame from physical layer */if (r.kind == data) {
/* An undamaged frame has arrived. */if ((r.seq != frame_expected) && no_nak)
send_frame(nak, 0, frame_expected, out_buf); else start_ack_timer();if (between(frame_expected, r.seq, too_far) && (arrived[r.seq%NR_BUFS] == false)) {
/* Frames may be accepted in any order. */arrived[r.seq % NR_BUFS] = true; /* mark buffer as full */in_buf[r.seq % NR_BUFS] = r.info; /* insert data into buffer */while (arrived[frame_expected % NR_BUFS]) {
/* Pass frames and advance window. */to_network_layer(&in_buf[frame_expected % NR_BUFS]);no_nak = true;arrived[frame_expected % NR_BUFS] = false;inc(frame_expected); /* advance lower edge of receiver's window */inc(too_far); /* advance upper edge of receiver's window */start_ack_timer(); /* to see if (a separate ack is needed */
}}
}if((r.kind==nak) && between(ack_expected,(r.ack+1)%(MAX_SEQ+1),next_frame_to_send))
send_frame(data, (r.ack+1) % (MAX_SEQ + 1), frame_expected, out_buf);while (between(ack_expected, r.ack, next_frame_to_send)) {
nbuffered = nbuffered - 1; /* handle piggybacked ack */stop_timer(ack_expected % NR_BUFS); /* frame arrived intact */inc(ack_expected); /* advance lower edge of sender's window */
}break;
case frame_arrival: /* a data or control frame has arrived */from_physical_layer(&r); /* fetch incoming frame from physical layer */if (r.kind == data) {
/* An undamaged frame has arrived. */if ((r.seq != frame_expected) && no_nak)
send_frame(nak, 0, frame_expected, out_buf); else start_ack_timer();if (between(frame_expected, r.seq, too_far) && (arrived[r.seq%NR_BUFS] == false)) {
/* Frames may be accepted in any order. */arrived[r.seq % NR_BUFS] = true; /* mark buffer as full */in_buf[r.seq % NR_BUFS] = r.info; /* insert data into buffer */while (arrived[frame_expected % NR_BUFS]) {
/* Pass frames and advance window. */to_network_layer(&in_buf[frame_expected % NR_BUFS]);no_nak = true;arrived[frame_expected % NR_BUFS] = false;inc(frame_expected); /* advance lower edge of receiver's window */inc(too_far); /* advance upper edge of receiver's window */start_ack_timer(); /* to see if (a separate ack is needed */
}}
}if((r.kind==nak) && between(ack_expected,(r.ack+1)%(MAX_SEQ+1),next_frame_to_send))
send_frame(data, (r.ack+1) % (MAX_SEQ + 1), frame_expected, out_buf);while (between(ack_expected, r.ack, next_frame_to_send)) {
nbuffered = nbuffered - 1; /* handle piggybacked ack */stop_timer(ack_expected % NR_BUFS); /* frame arrived intact */inc(ack_expected); /* advance lower edge of sender's window */
}break;
Comp
uter N
etwor
ks (2
005/2
006)
ht
tp://
www.
rede
s.upv
.es/re
desf
i/en
unit 7unit 7 4848
PipelinePipeline protocolsprotocols: : selectiveselective repeatrepeat (4/4)(4/4)
case cksum_err: if (no_nak) send_frame(nak, 0, frame_expected, out_buf); /* damaged frame */break;
case timeout: send_frame(data, oldest_frame, frame_expected, out_buf); /* we timed out */break;
case ack_timeout: send_frame(ack,0,frame_expected, out_buf); /* ack timer expired; send ack */
}
if (nbuffered < NR_BUFS) enable_network_layer(); else disable_network_layer();}
}
case cksum_err: if (no_nak) send_frame(nak, 0, frame_expected, out_buf); /* damaged frame */break;
case timeout: send_frame(data, oldest_frame, frame_expected, out_buf); /* we timed out */break;
case ack_timeout: send_frame(ack,0,frame_expected, out_buf); /* ack timer expired; send ack */
}
if (nbuffered < NR_BUFS) enable_network_layer(); else disable_network_layer();}
}