en computer networks - redes de computadores · ~note: 1 hz != 1 bit/s in general normally depends...

48
Unit 7: Link layer protocols Computer Networks (2005/2006) http://www.redes.upv.es/redesfi/en unit 7 unit 7 1 1 Computer Networks Models and metrics Stop and Wait Protocol. Efficiency and channel utilization Sliding window protocol. Using data windows and timers Error control. Go-back-n and selective retransmission. Implementations.

Upload: others

Post on 20-May-2020

2 views

Category:

Documents


0 download

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();}

}