Documente Academic
Documente Profesional
Documente Cultură
La baza protocoalelor pentru nivelul (de control al) legăturii de date (DLC) stă
principiul cererii de repetare automată [Automatic Repeat reQuest
(ARQ)], care constă în detectarea, de către receptor (destinatar), a cadrelor ce conţin
erori şi cererea ca, în acest caz, emiţătorul (sursa) să retransmită cadrele eronate.
Înainte de a prezenta aceste protocoale, vom face unele ipoteze cu privire la
modelul comunicaţiei:
1. Nivelul fizic, nivelul (de control al) legăturii de date şi nivelul de reţea
sunt considerate procese independente ce comunică trecându-şi unul altuia
mesaje. În unele cazuri, procesele din nivelul fizic şi cele din nivelul legăturii de
date vor fi rulate de un microprocesor din interiorul unui chip special de I/O, iar
procesele din nivelul de reţea vor fi rulate de unitatea centrală, dar sunt posibile şi
alte implementări (de exemplu: toate trei procesele într-un singur chip I/O;
procesele din nivelurile fizic şi legăturii de date ca proceduri apelate de procesele
din nivelul de reţea, etc.). În orice caz, tratarea celor trei niveluri ca procese separate
face abordarea problemelor mai clară din punct de vedere conceptual şi, în plus,
serveşte la evidenţierea independenţei nivelurilor arhitecturii reţelei.
2. O ipoteză esenţială este aceea că maşina (calculatorul) A vrea să
transmită un şir lung de date către maşina B, utilizând un serviciu fiabil, bazat pe
conexiune (mai târziu se va considera şi cazul când B vrea să transmită şi el,
simultan, către A). Se presupune că A posedă o rezervă infinită de date de
transmis, deci că nu se află nici o dată în situaţia de a aştepta pregătirea datelor
pentru transmisie; când DLC de la A aşteaptă date, nivelul său de reţea este
întotdeauna pregătit să i le furnizeze (şi această restricţie va fi înlăturată ulterior).
3. Din punct de vedere al DLC, pachetul ce vine de la nivelul de reţea,
prin interfaţa dintre ele, constituie date pure, fiecare bit al acestuia trebuind să fie
livrat nivelului de reţea al destinatarului. Faptul că nivelul de reţea al destinatarului
poate interpreta o parte a pachetului drept antet nu îl interesează pe DLC. Pachetul
de la nivelul de reţea, ajuns la DLC, este încapsulat cu un antet şi un marcaj
terminal (ce conţin informaţiile de control) şi apoi transmis la DLC al partenerului
(prin intermediul nivelului fizic şi al liniei). Dacă blocul (cadrul) astfel obţinut
ajunge fără erori la destinatar, DLC de aici verifică şi utilizează informaţiile de
control (din antet) şi, dacă totul este în ordine, datele din cadru (adică pachetul) sunt
trecute nivelului de reţea. În nici un caz nu se pasează nivelului de reţea antetul
cadrului (sau vreo parte din el). În acest fel, protocoalele nivelurilor de reţea şi
de legătură de date devin complet separate. Aceasta permite, pe de o parte,
independenţa nivelului de reţea faţă de soluţia de implementare a nivelului DLC
(schimbarea unuia din ele nu implică schimbarea celuilalt, atâta timp cât schimbarea
nu încalcă regulile de colaborare stabilite) şi, pe de altă parte, simplificarea
substanţială a proiectării
(soft-ului) protocoalelor şi evoluţia lor independentă (cu condiţia asigurării unei
interfeţe rigide între aceste două niveluri).
1
4. Se admite că există o bibliotecă de proceduri de simulare a
protocoalelor DLC, precum pentru trecerea biţilor unui cadru de la nivelul
legăturii de date la nivelul fizic al emiţătorului - să o numim aici to_
physical_layer - ca şi pentru preluarea de către nivelul legăturii de date a biţilor
cadrului recepţionat de la nivelul fizic - să-i zicem from_ physical_layer. Hard-ul
de la emiţător calculează şi ataşează suma de control, astfel încât soft-ul DLC nu
se ocupă de această problemă. Când un cadru ajunge la receptor, hard-ul acestuia din
urmă verifică suma de control. Dacă aceasta este incorectă (ceea ce înseamnă
existenţa a cel puţin unei erori de transmisie), o procedură de aşteptare - să o numim
aici wait_for_event(&event) - a receptorului returnează valoarea unei variabile -
event - care indică apariţia unui eveniment, aici: suma de control eronată pentru
cadrul recepţionat - să admitem event = cksum_err. La detectarea unor erori în
cadru, se cere retransmisia respectivului cadru. Dacă blocul sosit este fără alterări,
DLC este de asemenea informat - event = frame_arrival -, astfel încât îl poate
prelua pentru inspectare - utilizând procedura from_ physical_layer. Există de
asemenea procedurile from_network_layer - pentru preluarea pachetului de la
nivelul de reţea al emiţătorului - şi to_network_layer - pentru pasarea pachetului
către nivelul de reţea al receptorului.
5. În realitate, DLC nu stă pur şi simplu să aştepte într-o buclă a
procedurii wait până ce apare un eveniment (aşa cum am sugerat), ci va primi o
întrerupere care-l va opri din activitatea curentă pentru a se ocupa de cadrul sosit.
Totuşi, pentru izolarea subproblemei care face obiectul acestui paragraf, vom ignora
detaliile privind activităţile paralele din DLC şi vom presupune că el este dedicat
permanent asigurării canalului virtual de transmisie.
6. Dată fiind posibilitatea retransmisiei, antetul şi marcajul terminal
asociate unui anumit pachet pot fi aceleaşi sau nu. Vom presupune că DLC de la
receptor recunoaşte începutul şi sfârşitul fiecărui cadru, putând deci aplica
corect CRC (sau altă tehnică) pentru detectarea erorilor.
7. Vom presupune de asemenea (presupunere nu tocmai realistă) că toate
cadrele cu erori pot fi detectate la recepţie. În cele ce urmează vom numi cadrele
fără erori de transmisie cadre fără erori [error-free frame] iar pe cele cu erori
de transmisie - cadre eronate [error frame]. Reformulând ipoteza, vom zice că
receptorul poate distinge întotdeauna cadrele eronate de cele fără erori.
8. Se va presupune că fiecare cadru transmis este întârziat cu un timp
arbitrar şi variabil până să ajungă la receptor, iar unele cadre se pot “pierde”,
neajungând nici o dată la destinaţie. Dar cadrele care ajung la destinaţie, vor
ajunge în aceeaşi ordine ca la transmisie - cu sau fără erori.
Fig. 1 exemplifică aceste situaţii pe un model de transmisie a cadrelor între
două maşini (calculatoare). Dreptunghiurile de la maşina A indică, prin lungimea lor,
durata de emisie a fiecărui cadru. Săgeţile indică duratele de propagare ale cadrelor
până la maşina B iar vârfurile săgeţilor indică momentul în care un cadru a fost
recepţionat complet (când se poate calcula CRC şi cadrul este acceptat sau nu).
2
1 2 3 4 5 C a d r e
A t r a n s m i s e
t d i n A
( e r o a r e d e
t r a n s m i s i e )
( c a d r u M o m e n t e l e
p i e r d u t ) s o s i r i i c o m
B a c a d r e l o r
î n B
F i g . 1
3
/* Structuri de date şi proceduri utilizate în protocoalele simulate */
#define MAX_PKT 1024 /* determină dimensiunea în octeţi a pachetului */
typedef enum {false, true} boolean; /* tip boolean */
typedef unsigned int seq_nr; /* număr de ordine al pachetului sau de ack */
typedef struct {unsigned char data[MAX_PKT];} packet; /* definiţia pachetului */
typedef enum {data, ack, nak} frame_kind; /* definiţia tipurilor de cadre */
typedef struct { /* structura cadrelor de la nivelul legăturii de date */
frame_kind kind; /* felul cadrului */
seq_nr seq; /* numărul de ordine al pachetului din cadru */
seq_nr ack; /* numărul de ordine al pachetului confirmat */
packet info; /* pachetul din cadru */
} frame;
/* Aşteaptă producerea unui eveniment; întoarce tipul acestuia în variabila event */
void wait_for_event (event_type *event);
/* Preia un pachet de la nivelul de reţea pentru a-l transmite */
void from_network_layer(packet *p);
/* Livrează nivelului de reţea destinatar pachetul din cadrul recepţionat */
void to_network_layer(packet *p);
/* Preia biţii cadrului sosiţi de la nivelul fizic şi îi copiază în r */
void from_physical_layer(frame *r);
/* Livrează biţii cadrului către nivelul fizic pentru transmisie */
void to_physical_layer(frame *s);
/* Porneşte ceasul şi activează evenimentul timeout (sfârşit pauză de aşteptare) */
void start_timer(seq_nr k);
/* Opreşte ceasul şi dezactivează evenimentul timeout */
void stop_timer(seq_nr k);
/* Porneşte un ceas auxiliar şi activează evenimentul ack_timeout (confirmare sfârşit pauză de
aşteptare) */
void start_ack_timeout(void);
/* Opreşte ceasul auxiliar şi dezactivează evenimentul ack_timeout */
void stop_ack_timeout(void);
/* Permite nivelului de reţea emiţător să provoace evenimentul network_layer_ready (nivelul de
reţea gata) */
void enable_network_layer (void);
/* Interzice nivelului de reţea emiţător să provoace evenimentul network_layer_ready */
void enable_network_layer (void);
/* Macroinstrucţiunea inc este expandată in-line: îl incrementează circular pe k */
#define inc(k) if (MAX_SEQ) k = k + 1; else k = 0
Procedurile de mai sus sunt rutine de bibliotecă ale căror detalii depind de
implementare şi al căror mod de lucru intern nu ne interesează aici. Procedura
wait_for_event stă într-o buclă, aşteptând să se întâmple un eveniment - după cum
am menţionat anterior. Procedurile to_network_layer şi from_network_layer,
to_physical_layer şi from_physical_layer au fost şi ele menţionate. Pentru cazul
pierderii unor cadre pe canalul fizic, nivelul legăturii de date va trebui să pornească un
contor de timp/ceas intern de fiecare dată când trimite un cadru. Dacă nu se primeşte
4
confirmare de recepţie până la expirarea unei pauze de aşteptare [timeout]
predefinite, nivelul legăturii de date va primi un semnal de întrerupere. În protocoalele
simulate mai departe, aceasta se asigură prin procedura wait_for_event care
întoarce event = timeout. Procedurile start_timer şi stop_timer servesc la
pornirea şi respectiv oprirea contorului (ceasului) de timp. Procedurile
start_ack_timer şi stop_ack_timer sunt folosite pentru a controla un contor
auxiliar de timp, utilizat pentru generarea confirmării recepţiei pachetelor în anumite
condiţii. Procedurile enable_network_layer sunt utilizate în protocoalele mai
evoluate, în care nivelul legăturii de date poate preveni “inundarea” sa cu pachete de
către nivelul de reţea, dezactivând acest din urmă nivel; când nivelul de reţea este
activat - fapt indicat de event = network_layer_ready -, i se permite să întrerupă
pentru a transmite un pachet.
5
void sender1(void)
{
frame s; /* registru tampon (buffer) pentru cadrul de transmis */
packet buffer; /* buffer pentru pachetul de transmis */
while (true) { /* la nesfârşit */
from_network_layer(&buffer); /* preia un pachet de transmis */
s.info = buffer; /* îl copiază în buffer pentru transmisie */
to_physical_layer(&s); /* îl trimite nivelului fizic */
}
}
void receiver1(void)
{
frame r; /* buffer pentru cadrul de recepţionat */
event_type event; /* realizat de rutina wait, dar neutilizat aici */
while (true) {
wait_for_event(&event); /* singurul eveniment posibil este sosirea unui cadru */
from_physical_layer(&r); /* preia cadrul sosit */
to_network_layer(&r.info); /* predă pachetul nivelului de reţea */
}
}
Vom renunţa acum la cea mai nerealistă restricţie impusă protocolului prezentat
anterior şi anume capacitatea nivelului de reţea de la destinatar de a prelucra datele
sosite cu o viteză infinită (sau, echivalent, prezenţa la nivelul DLC de la receptor a
unui buffer de dimensiune infinită, care să poată stoca toate cadrele sosite şi care îşi
aşteptă rândul să fie preluate de nivelul de reţea de aici).
Principala problemă căreia protocolul trebuie să-i facă faţă este aceea de a
preveni ca emiţătorul să înece cu date receptorul (adică să-i transmită date cu o viteză
mai mare decât cea cu care receptorul poate prelucra datele sosite). În esenţă, dacă
receptorul are nevoie de un timp t ca să execute procedurile from_physical_layer
plus to_network_layer, atunci emiţătorul trebuie să transmită cu o viteză medie mai
mică de 1 cadru în intervalul t. Mai mult, dacă admitem că hard-ul receptorului
nu efectuează nici stocarea automată în buffer, nici gestionarea şirului de aşteptare al
cadrelor sosite, emiţătorul nu trebuie să transmită nici o dată un nou cadru până ce
precedentul nu a fost preluat de procedura from_physical_layer - căci, altfel, s-ar
stoca peste cadrul precedent.
În anumite circumstanţe restrânse (de exemplu, pentru o transmisie asincronă şi
un nivel DLC la receptor complet dedicat prelucrării informaţiilor sosite pe unica
linie convergentă în acel nod), ar fi posibil ca emiţătorul să insereze pur şi simplu o
întârziere în precedentul protocol, pentru a-l încetini suficient ca să nu mai înece
receptorul. Dar, de cele mai multe ori, în practică, fiece nivel DLC operează cu mai
multe linii care converg în acel nod, iar intervalul de timp dintre sosirea unui cadru şi
momentul prelucrării sale poate varia în limite largi. Dacă proiectantul reţelei ar putea
calcula durata cea mai lungă posibilă de prelucrare la receptor, atunci el ar putea
programa viteza de transmisie aemiţătorului la o asemenea viteză joasă încât, chiar
dacă fiecare cadru ar suferi întârzierea maximă, nu s-ar întâmpla o depăşire a
capacităţii de prelucrare a receptorului. Dar o asemenea soluţie ar duce la o utilizare a
6
lărgimii de bandă mult sub valoarea optimă (cu excepţia situaţiei când cazul cel mai
favorabil şi cazul cel mai defavorabil ar fi foarte apropiate între ele - adică atunci când
domeniul de variaţie al timpului de reacţie al nivelului DLC al receptorului ar fi
foarte restrâns).
O soluţie mai bună - prin gradul de generalitate al aplicabilităţii sale - o
constituie instalarea unei reacţii de la receptor la emiţător, prin care nivelul DLC
receptor trimite, după ce a livrat un pachet nivelului său de reţea, un cadru special,
de confirmare [acknowledgement], către nivelul DLC al emiţătorului,
permiţându-i să transmită următorul cadru; cât priveşte nivelul DLC al emiţătorului,
el va trebui să aştepte, după transmiterea unui cadru, un anumit timp (fixat prin
protocol) până ce primeşte cadrul de confirmare. Protocoalele în care emiţătorul
transmite un cadru şi apoi aşteaptă o confirmare a ajungerii pachetului la destinaţie
mai înainte de a transmite următorul cadru se numesc protocoale de tip pas-cu-pas
[stop-and-wait].
Menţionăm că, în ipotezele considerate până aici, nivelul DLC al emiţătorului
nu are nevoie să inspecteze cadrul de confirmare, căci nu există decât o singură
posibilitate, iar, întrucât doar sosirea cadrului de confirmare la emiţător are importanţă
(nu şi conţinutul său), receptorul nici nu ar avea nevoie să depună vreo informaţie în
cadrul de confirmare.
Observaţie : Chiar pentru un trafic de date de tip unidirecţional, vor fi şi cadre
(cele de confirmare) care circulă în sens invers. Deci, canalul fizic de comunicaţie
între cele două calculatoare trebuie să permită o circulaţie în ambele sensuri (cel puţin
pe rând - deci de tip semiduplex).
Să renunţăm acum şi la ipoteza unui canal fizic ce nu induce erori de transmisie
- ceea ce, în sfârşit, corespunde realităţii.
Într-un astfel de canal fizic, cadrele pot fi alterate sau pierdute complet. Vom
păstra, însă, ipoteza că un cadru alterat va fi detectat ca eronat de către hard-ul de la
receptor (prin suma de control). Dacă, totuşi, cadrul alterat este astfel încât suma de
control este corectă, acest protocol - ca, de altfel, toate celelalte protocoale de la acest
nivel - nu va lucra corect (adică va livra pachete incorecte nivelului de reţea).
Strategia protocolului pas-cu-pas, în cazul unui canal fizic supus la
perturbaţii, va fi următoarea:
Primul pachet de la A către B este trimis cu primul cadru şi, apoi,
nivelul DLC de la A aşteaptă o confirmare; dacă acest cadru ajunge la B fără
erori, B trimite lui A un cadru de confirmare (denotat cu “ack ”), iar dacă
respectivul cadru cu date ajunge cu eroare, B trimite lui A un cadru de
confirmare negativă [negative acknowledgement] (denotat cu “nack ”);
întrucât erorile pot apare şi în transmisia de la A la B, dar şi în transmisia de la B
spre A, cadrul de confirmare (ack sau nack) este protejat prin CRC.
Dacă B primeşte un cadru cu date fără eroare iar cadrul de confirmare
(ack) ajunge la A fără erori, atunci A poate transmite un nou pachet înt-un
cadru. În schimb, dacă apar erori detectabile fie la transmisia cadrului cu
date, fie pe cadrul ack/nack, A va retransmite pachetul într-un nou cadru.
În fine, dacă fie cadrul cu date, fie ack sau nack returnate sunt pierdute, A
va retransmite vechiul pachet la expirarea pauzei de aşteptare stabilite.
O astfel de strategie poate prezenta o disfuncţionalitate - după cum se ilustrează
în figura de mai jos:
7
0 0
A
t
a c k
B
P a c h eP t au cl h 0 e t u l 0 s a u 1
F i g . 2
S N 0 0 1 2
A
t
a c k a c k a c k
B
P a c h e t u l 0
F i g . 3
8
Pentru a evita aceste situaţii, nivelul DLC receptor (B) va returna pe reacţie
nu o simplă ack sau nack, ci numărul de ordine al următorului pachet aşteptat -
eliminându-se astfel ambiguitatea privind pachetul care se confirmă.
Observaţie : S-ar putea utiliza convenţia (echivalentă) ca să se returneze
numărul de ordine al ultimului pachet primit, dar nu se procedează astfel în practică.
Nodul receptor (B) poate solicita acest următor pachet după primirea fiecărui
pachet - la intervale periodice sau la anumite intervale de timp alese arbitrar - printr-
un număr de ordine cerut [request number (RN)].
Observaţie : În numeroase aplicaţii, în afară de traficul de la A spre B, există
şi un trafic în sens invers (de la B spre A). În astfel de cazuri, cadrele de la B către
A, conţinând cereri [request] de noi pachete de la A destinate lui B, trebuie
intercalate cu cadrele ce transportă date de la A spre B. Însă, cu excepţia efectului
său asupra momentelor transmiterii cererilor de pachete (emise de B către A),
traficul de la B spre A nu afectează strategia pas-cu-pas utilizată pentru traficul
de la A spre B; ca urmare, vom ignora traficul în sens invers (cu excepţia
recunoaşterii faptului că cererile de noi pachete pot fi întârziate).
Un exemplu de funcţionare a acestei strategii este dat în Fig. 4, unde s-a
presupus că pachetul 0 a fost repetat - probabil din cauza pauzei de aşteptare prea
scurte de la nodul A; nodul A întârzie retransmiterea pachetului 1 cerut din nou -
fapt ce nu afectează corectitudinea protocolului, dar evită retransmisiile inutile.
S N 0 0 1 2 3
A
t
B
R N 1 1 2 3
P a c h 0 e t u l e 1 x t r a s 2 3
F i g . 4
9
3 - Transmite pachetul cu numărul de ordine SN într-un cadru ce va
conţine SN în câmpul pentru numărul de ordine al pachetului transmis.
4 - Dacă se primeşte de la B un cadru fără eroare, conţinând un RN
> SN, incrementează SN până ce SN = RN şi trece la pasul 2; dacă
nu se primeşte un astfel de cadru într-un anumit interval de timp (pauza
de aşteptare fixată), se trece la pasul 3.
‚ La receptor (nodul B):
1 - Iniţializează RN = 0 şi repetă la nesfârşit paşii 2 şi 3.
2 - Ori de câte ori se primeşte de la A un cadru fără eroare şi
conţinând
SN = RN, pasează pachetul primit nivelului său de reţea şi
incrementează RN.
3 - La momente arbitrare, dar într-un interval de timp limitat după
recepţionarea de la A a unui cadru cu date corect, transmite un cadru lui
A, conţinând RN în câmpul aferent.
Structura cadrelor utilizate este:
Marcaj terminal
Antet
SN RN Pachet CRC
Fig. 5
10
de lungă pentru a permite confirmărilor întârziate să sosească, evitând trimiterea de
dubluri provocatoare de ambiguitate (căci, în caz contrar, emiţătorul va considera, în
mod greşit, că a venit confirmarea ultimului cadru transmis şi nu confirmarea
cadrului precedent, iar, dacă următorul cadru transmis se pierde, dar vine confirmarea
dublurii, emiţătorul nu va încerca retransmisia acestui din urmă cadru). Deci, se va
păstra ipoteza unei alternanţe stricte a transmisiei de cadre cu confirmările de la
receptor, prin alegerea unei valori suficient de mari a duratei pauzei de aşteptare.
Acest protocol diferă de precedentul prin aceea că atât emiţătorul cât şi
receptorul posedă o variabilă a cărei valoare este memorizată atâta timp cât nivelul
DLC este în starea de aşteptare. Emiţătorul păstrează numărul de ordine al
următorului cadru de transmis în next_frame_to_send; receptorul păstrează
numărul de ordine al următorului cadru aşteptat în frame_expected. Fiecare
calculator are o scurtă fază de iniţializare înainte de a intra în bucla infinită.
După transmiterea unui cadru, emiţătorul îşi declanşează contorul de timp
(ceasul). Dacă acesta era deja pornit, el va fi resetat pentru a permite o nouă pauză de
aşteptare completă. Intervalul de timp trebuie ales astfel încât să permită cadrului să
ajungă la receptor, receptorului să îl prelucreze - chiar şi în cel mai dezavantajos caz -
şi confirmării să se propage înapoi până la emiţător. Numai la expirarea acestui timp
(pauza de aşteptare) se va putea admite că s-a pierdut fie cadrul transmis, fie
confirmarea sa şi se va putea transmite dublura respectivului cadru.
După transmiterea unui cadru şi pornirea ceasului său, emiţătorul aşteaptă să
apară un eveniment. Există trei posibilităţi: să sosească o confirmare nealterată; să
sosească o confirmare alterată; să expire pauza de aşteptare fixată la ceas.
Dacă vine o confirmare nealterată, emiţătorul preia următorul pachet de la
nivelul său de reţea şi îl pune în buffer, suprascriind pachetul anterior; apoi face să
avanseze (circular) numărul de ordine (adică din 0 face 1 sau vice-versa). Dacă vine
o confirmare alterată sau nu primeşte nici o confirmare, nu va modifica nici conţinutul
buffer-ului, nici numărul de ordine, aşa că se va transmite dublura ultimului cadru.
/* Protocol PAR */
#define MAX_SEQ 1 /* în acest protocol MAX_SEQ = 1 */
typedef enum {frame_arrival, cksum_err, timeout} event_type; /* evenimentele posibile */
#include “protocol.h”
void sender2(void)
{
seq_nr next_frame_to_send; /* numărul de ordine al următorului cadru de transmis */
frame s; /* variabil\ temporar\ */
packet buffer; /* registru tampon (buffer) pentru pachetul de transmis */
event_type event;
next_frame_to_send = 0; /* iniţializare numere de ordine pentru transmisie */
from_network_layer(&buffer); /* preia primul pachet */
while (true) {
s.info = buffer; /* preia pachetul şi îl pune în cadru */
s.seq = next_frame_to_send; /* inserează în antetul cadrului numărul de ordine */
to_physical_layer(&s); /* pasează cadrul nivelului fizic pentru a-l transmite */
start_timer(s.seq); /* pornirea ceasului pentru pauza de aşteptare */
wait_for_event(&event); /* aşteaptă frame_arrival sau cksum_err sau timeout */
if (event == frame_arrival) {
from_network_layer(&buffer); /* preia următorul pachet de transmis */
inc(next_frame_to_send); /* inversează conţinutul numărului de ordine */
}
}
}
void receiver2(void)
{
11
seq_nr frame_expected; /* numărul de ordine al cadrului aşteptat la recepţie */
frame r, s; /* variabile temporare */
packet buffer; /* registru tampon (buffer) pentru pachetul de transmis */
event_type event;
frame_expected = 0; /* iniţializare numere de ordine pentru recepţie */
while (true) {
wait_for_event(&event); /* aşteaptă frame_arrival sau cksum_err */
if (event == frame_arrival) { /* a sosit un cadru corect */
from_physical_layer(&r); /* preia cadrul nou sosit de la nivelul fizic */
if (r.seq == frame_expected) { /* este cadrul aşteptat */
to_network_layer(&r.info); /* trece pachetul din cadru nivelului de reţea */
inc(frame_expected); /* inversează conţinutul numărului de ordine */
}
}
to_physical_layer(&s); /* nu e utilizat nici unul din câmpuri */
}
}
12
O îmbunătăţire a acestei soluţii o constituie tehnica de transmisie numită
ataşare [piggybacking]: confirmările de la B sunt deliberat întârziate până când
nivelul de reţea de la B are de transmis un pachet; atunci se ataşează confirmarea la
coada cadrului ce transportă către A respectivul pachet emis de B - de fapt se
înscrie RN în câmpul destinat confirmării din antetul cadrului cu date plecat de la
B.
Principalul avantaj al acestei metode îl constituie mai buna utilizare a lărgimii
de bandă disponibile pentru canalul fizic (câmpul ack din antetul cadrului consumă
doar câţiva biţi, în timp ce un cadru de confirmare separat ar necesita un antet,
confirmarea şi o sumă de control). În plus, mai puţine cadre transmise înseamnă mai
puţine întreruperi pentru cadre sosite şi, eventual (în funcţie de modul de organizare al
soft-ului de la recepţie), un buffer de volum mai mic la receptor.
Dar tehnica ataşării introduce şi o complicaţie care nu apărea la confirmările
trimise separat: durata cât DLC de la receptor trebuie să aştepte un pachet de la
nivelul său de reţea pentru a-i putea ataşa confirmarea. Dacă acest timp depăşeşte
pauza de aşteptare de la emiţător, cadrul va fi retransmis în mod inutil, creând
complicaţii. Soluţia este următoarea: DLC de la receptor aşteaptă, după primirea
unui cadru cu date corect, un anumit interval de timp (de ordinul milisecundelor);
dacă în acest timp vine un pachet de la nivelul lui de reţea, îi ataşează confirmarea, iar
în caz contrar (la expirarea acestui interval de aşteptare) va trimite un cadru separat de
confirmare.
Se poate dovedi cu uşurinţă că frecvenţa posibilă de transmisie a cadrelor este
mai mică la tehnica ataşării decât la cea cu confirmări separate.
Fie un astfel de protocol pas-cu-pas (PAR) cu trafic în ambele sensuri între
nodurile A şi B. Vom presupune că toate cadrele cu date au aceeaşi lungime şi necesită o
aceeaşi durată de emisie D, cadrele de confirmare necesită o aceeaşi durată de emisie C,
iar propagarea pe linie a cadrelor se face cu o întârziere egală T. Vom admite că atât A cât
şi B au un şir infinit de pachete de transmis, că nu apar erori de transmisie şi că pauza de
aşteptare după care se face retransmisia unui cadru este foarte mare. Vom presupune, de
asemenea, că fiecare nod trimite noi pachete şi confirmări cu frecvenţa maximă posibilă,
conform protocolului pas-cu-pas. Se constată imediat că frecvenţa de transmitere a
cadrelor în fiece sens este:
f =
1
D + C + 2T [s ]
-1
fp =
1
2D + 2T [s ]
-1
13
(ceea ce este întotdeauna adevărat), atunci
f p < f,
p
Performanţele unui protocol sunt:
A) Corectitudinea [correctness] care se traduce prin faptul că un flux
incontinuu de pachete poate fi acceptat de la nivelul de reţea al emiţătorului (A) şi
livrat nivelului de reţea de la receptor (B) în aceeaşi ordine ca la emisie şi fără
dubluri sau pierderi de pachete. Corectitudinea unui protocol are 2 componente:
a) siguran\a în func\ionare [safety], care înseamnă că protocolul
nu produce rezultate incorecte în nici o situaţie - adică nu livrează nici o dată
nivelului de reţea de la recepţie (B) un pachet în afara ordinii corecte;
b) durata de viaţă nelimitată [liveness], prin aceasta
înţelegându-se că poate produce rezultat la nesfârşit, fără să intre într-o
situaţie de blocare - adică este capabil să accepte incontinuu pachete în A şi să
le livreze în B.
B) Eficienţa (utilizării canalului) [(channel) efficiency], care exprimă
cât din lărgimea de bandă a canalului se foloseşte pentru transmisia unui cadru - ca
medie statistică -, ţinând cont de retransmisii şi de pauza de aşteptare a confirmării.
Ne vom ocupa acum de performanţele protocolului pas-cu-pas (PAR) cu
numerotarea cadrelor emise şi cu cereri de cadre cu număr de ordine specificat.
Pentru analiza corectitudinii acestui algoritm, vom menţine ipotezele:
• toate cadrele afectate de erori sunt detectate de CRC de la receptor
• fiecare cadru ajunge la destinaţie fără erori cu o probabilitate
pe ≤ q (q > 0)
14
S N i i i i t3
A
t1
t
t2
B
R N i i + 1 i + 1
P a c h e t u l e i x t r a s
F i g . 6
Fie t2 momentul când pachetul este recepţionat fără eroare şi livrat nivelului
de reţea de la B (în caz că acest eveniment nu apare, se ia t2 = ∞). Similar, fie t3
momentul în care SN din A este incrementat la valoarea SN = i +1 (dacă acest
eveniment nu se produce nici o dată, se adoptă t3 = ∞).
Vom observa că nu putem avea certitudinea că nivelul de reţea din A va
furniza întotdeauna pachete într-un anumit interval finit de timp, aşa încât noţiunea de
durată de viaţă nelimitată poate reclama, aici, numai o întârziere finită dacă există
pachete de trimis.
Fie RN(t) valoarea variabilei RN de la nodul B şi fie SN(t) valoarea
corespunzătoare a variabilei SN la nodul A. Din algoritm rezultă direct că SN(t)
şi RN(t) nu sunt funcţii descrescătoare în timp. De asemenea, întrucât SN(t) este
cel mai mare număr de ordine de pachet cerut de B, cerere (de confirmare) ajunsă la
A până la momentul t, rezultă că
SN(t) ≤ RN(t). (1)
Admiţând că pachetul cu numărul de ordine i nu a fost transmis nici o dată
înainte de t1 , atunci (conform proprietăţii de siguranţă în funcţionare)
RN(t1) ≤ i .
Cum
SN(t1) = i ,
rezultă că
SN(t1) = RN(t1) = i .
Conform definiţiilor lui t2 şi t3 , RN(t) va fi incrementat la valoarea
RN = i +1 la momentul t2 , iar SN(t) va fi incrementat la valoarea SN = i +1 la
momentul t3 . Ţinând cont de inegalitatea (1), rezultă că
t2 < t3 .
Nodul A transmite repetat pachetul cu numărul de ordine i , cu intervale de
timp finite între transmisiile succesive, de la momentul t1 şi până când el este
recepţionat prima dată fără eroare - adică până la momentul t2 . Dată fiind
probabilitatea q ca fiece retransmisie să fie recepţionată corect şi ţinând seama că
retransmisiile se fac la intervale finite de timp, va avea loc finalmente o recepţie fără
15
eroare la momentul finit t2 . Nodul B va transmite atunci cadrul purtând RN = i
+1 de la momentul t2 şi până când el va fi recepţionat fără eroare în nodul A -
adică la momentul t3 . Întrucât nodul A transmite şi el cadre în acest timp,
intervalul de timp între transmisiile succesive din B este finit şi, cum
q>0,
va exista în final momentul finit t3 . Deci intervalul [t1 , t3] este finit. Am obţinut
aşadar că:
t1 < t2 < t3
[t1 , t3] este finit.
Repetând raţionamentul pentru i = 0, 1, ... rezultă că fiecare pachet va fi
transmis corect într-un anumit interval de timp finit, deci algoritmul are o durată de
viaţă nelimitată.
B) Vom analiza acum eficacitatea utilizării canalului fizic de către acest
protocol (sau, cum i se zice mai pe scurt - deşi nu tocmai corect, eficienţa
protocolului). Eficienţa unui protocol este influenţată de mai mulţi factori, printre care
esenţiali sunt:
• lungimea fixă sau variabilă a unui cadru
• utilizarea sau nu a tehnicii ataşării confirmărilor la traficul de date în sens
invers
• tipul transmisiei - semiduplex sau duplex - pe linie
• caracteristicile statistice ale erorilor de transmisie.
Pentru deducerea eficienţei protocoalelor vom folosi următoarele notaţii:
d = numărul de biţi de date (ai pachetului) din cadru
h = numărul de biţi din antetul cadrului
l (= d + h ) = lungimea totală (în biţi) a cadrului
a = numărul de biţi ai cadrului de confirmare
C = capacitatea (viteza max. de transmisie a) canalului [biţi/s]
p = probabilitatea ca un bit recepţionat să fie eronat
q = probabilitatea ca un cadru cu date sau confirmarea sa să
se piardă ori să fie alterate
p1 = probabilitatea ca un cadru cu date să se piardă ori să fie
alterat
p2 = probabilitatea ca un cadru de confirmare să se piardă ori
să fie alterat
r = numărul mediu de retransmisii pentru un cadru cu date
T = durata de aşteptare a confirmării
τ = durata întreruperii şi servirii + timpul de propagare
S = eficacitatea utilizării canalului fizic
w = lărgimea ferestrei (se va explica în paragraful următor).
Mai înainte de a lua în consideraţie efectul erorilor de transmisie, să vedem care
este eficacitatea utilizării unui canal fizic “perfect”. Să considerăm momentul t = 0
când emiţătorul începe să transmită cadre. La momentul l /C a fost transmis ultimul
bit. La momentul (l /C) + τ , ultimul bit al cadrului a ajuns la receptor, întreruperea
16
a fost servită şi receptorul este gata să înceapă să transmită cadrul de confirmare. La
momentul (l /C) + τ + (a/C) a fost transmis ultimul bit al cadrului de confirmare.
La momentul (l /C) + τ + (a/C) + τ , emiţătorul a procesat confirmarea şi este
gata să transmită următorul cadru cu date. Lărgimea de bandă ocupată de acest cadru
va fi
C ⋅ [(l /C) + (a/C) + 2τ ] = l + a + 2Cτ .
Fie d numărul de biţi de date (ai pachetului) efectiv transmişi. Eficacitatea utilizării
canalului fizic va fi atunci:
d
S = .
h + d + a + 2Cτ
Dacă antetul şi confirmările sunt neglijabile, lărgimea de bandă este mică, iar duratele
de propagare şi servire sunt scurte, atunci eficacitatea utilizării canalului va fi mare;
iar în caz contrar, va fi mai modestă. Oricum, este clar că eficacitatea utilizării
canalului pentru un protocol de tip pas-cu-pas va fi mult sub 100 %, chiar şi
pentru un canal (fizic) fără erori de transmisie.
Să considerăm acum şi efectul erorilor de transmisie. Dacă un cadru este alterat
sau pierdut, emiţătorul va aştepta un timp T după transmiterea ultimului bit al
cadrului până să reia transmisia. Deci o transmisie fără succes va utiliza l + CT biţi
din capacitatea de transmisie. Întrucât numărul mediu de retransmisii pentru un cadru
este r, capacitatea totală a canalului fizic utilizată pentru transmisia a r cadre
eronate şi a unui cadru corect va fi:
r (l + CT ) + (l + a + 2Cτ ) .
Să determinăm şi numărul mediu de retransmisii pentru un cadru.
Un cadru se consideră transmis corect dacă atât datele cât şi confirmarea sunt
recepţionate corect.. Probabilitatea unei transmisii cu succes este
(1 - p2) (1 - p1) .
Deci probabilitatea unei transmisii fără succes va fi
q = 1 - (1 - p2) (1 - p1) .
Probabilitatea de a avea nevoie de k încercări de transmisie (deci k - 1
retransmisii) este
(1 - q ) q k - 1 .
Aceasta conduce la un număr probabil de transmisii pentru un cadru
1
1- q
şi, deci, la un număr probabil de retransmisii
1 q
r ≅ - 1= .
1- q 1- q
Aşadar, eficacitatea utilizării canalului fizic va fi
17
d
S=
q
(l + CT ) + (l + a + 2 C τ) .
1- q
Dacă timpul de servire al receptorului are o valoare mică, emiţătorul îşi poate
stabili durata pauzei de aşteptare T puţin peste timpul necesar sosirii confirmării,
adică
a
T ≅ + 2τ
C
şi rezultă:
d 1
S = ⋅ (1- p1)(1- p2) ⋅ .
h +d CT
1+
h +d
Primul factor reprezintă pierderea din cauza surplusului de biţi (de
control) [overhead] din antet. Cel de al doilea factor reprezintă pierderea din
cauza erorilor de transmisie. Cel de al treilea factor reprezintă pierderea cauzată de
algoritmul pas-cu-pas.
În continuare vom căuta un model care să redea legătura dintre probabilitatea
ca un cadru să fie eronat (q ) şi lungimea lui (l ). Vom presupune (nu tocmai
realist) că fiece bit are o probabilitate p de a fi alterat în cursul transmisiei,
independent de biţii precedenţi şi cei ulteriori. În această ipoteză şi pentru
a=h ,
rezultă
d 1 (1)
S = ⋅ (1- p)h +d (1 - p)h ⋅ .
h +d CT
1+
h +d
Apare acum, firesc, întrebarea: este dimensiunea optimă a cadrului? Dacă
lungimea cadrelor este prea mică, S va fi scăzută din cauza surplusului de biţi din
antet; dacă l este prea mare, probabilitatea ca un cadru să fie recepţionat fără eroare
va fi scăzută, deci S va scădea din cauza retransmisiilor multiple. Este clar că
valoarea optimă pentru l va depinde de dimensiunea antetului, frecvenţa erorilor,
lărgimea de bandă primară şi durata pauzei de a]teptare. Pentru găsirea valorii
optime, se va anula derivata parţială a lui S (din (1)) în raport cu d :
∂S
=0
∂d
obţinând
h + CT 4
d opt = 1- - 1 .
2 (h + CT ) ⋅ ln(1 - p)
Dacă p are o valoare foarte mică - ceea ce este deseori adevărat -, vom putea
face aproximaţia
ln(1 - p) ≅ - e .
18
În plus, o valoare mică a lui p înseamnă că putem neglija termenii 1 de sub
radical şi de după radical, obţinând:
h + CT
d opt ≅ . (2)
p
Vom remarca faptul că h + CT reprezintă surplusul cauzat de antete şi de
pauzele de aşteptare. Pe măsură ce calitatea liniei se îmbunăţeşte (adică p ÿ 0), d opt
creşte. Dacă nu există erori, singurul surplus provine de la antete şi de la protocolul
pas-cu-pas - ambele reclamând o lungime cât mai mare a cadrului. Pe de altă parte,
o frecvenţă mare a erorilor cere micşorarea lungimii cadrului, pentru a evita
retransmiterea unor cadre lungi.
Pentru a analiza eficacitatea utilizării canalului pentru dimensiuni ale cadrului
apropiate de cea optimă, să introducem notaţia
∆
d = x ⋅ d opt
(1 + α) ( h + CT ) 4 αh
d opt = ⋅ 1- - 1 .
2α (1 + α) 2 ( h + CT )
19
3 Protocoale cu fereastră glisantă
20
K Observaţii:
1) După m deplasări (unde m este numărul de biţi pentru SN), o
fereastră de dimensiune n poate conţine aceleaşi numere de ordine ca iniţial (nu e
nevoie de o incrementare permanentă a numerelor de ordine - care ar complica şi
“înscrierea” ei). De aceea se poate vorbi de “rotaţia ferestrei”.
2) O fereastră receptoare de dimensiune 1 înseamnă că nivelul DLC
receptor acceptă cadrele doar în ordine, dar pentru n > 1 nu se întâmplă aşa;
oricum, nivelul de reţea receptor primeşte întotdeauna pachetele în ordinea corectă,
indiferent de dimensiunea ferestrei.
Iată un exemplu cu n = 1 pentru un număr de ordine pe 3 biţi (de la 0 la 7).
Iniţial, nu există cadre de transmis, deci limitele inferioară şi superioară ale
ferestrei sunt egale.
7 0 7 0 7 0 7 0
6 1 6 1 6 1 6 1
E m is ie
5 2 5 2 5 2 5 2
4 3 4 3 4 3 4 3
7 0 7 0 7 0 7 0
6 1 6 1 6 1 6 1
R e c e p ţ ie
5 2 5 2 5 2 5 2
4 3 4 3 4 3 4 3
I ţn i Di a u p l ă t r a Dn s u mp ăi s ir ae cD e u p p ţ ăi a r e c e p ţ i a
p r i m u l u i p c r a i md r u u l u ip cr ia m d er ui c o n f i r m ă r i
F i g . 7
Cazul n =1, deşi prezintă o serie de avantaje faţă de protocolul pas-cu-pas
(este bidirecţional şi mai robust - adică suportă orice combinaţie de erori şi pauze
de aşteptare fără a provoca pierderi sau dublări de pachete), prezintă şi un neajuns.
Până acum am făcut presupunerea tacită că timpul necesar unui cadru pentru a ajunge
la destinaţie plus timpul de transmitere a confirmării constituie o durată neglijabilă
- ceea ce este fals. Iar timpul de propagare dus-întors poate avea implicaţii
importante asupra eficienţei de utilizare a lărgimii de bandă.
Astfel, de exemplu, să considerăm un canal de satelit de capacitate 50
[kbiţi/s], cu o durată de propagare dus-întors de 500 [ms]. Se vor transmite, cu
ajutorul protocolului cu fereastră glisantă de lărgime n = 1, cadre de lungime l
= 1000 biţi. La t = 0, emiţătorul începe să transmită primul cadru. La t = 20 [ms],
cadrul a fost complet transmis. În cele mai bune condiţii (adică fără aşteptare pentru
servire la recepţie şi pentru un cadru de confirmare scurt), cadrul cu date emis va
ajunge de abia la t = 270 [ms], iar confirmarea va ajunge la emiţător de abia la t =
520 [ms]. Aceasta înseamnă că emiţătorul a fost blocat pe 500/520 = 96 % din
timpul total - cu alte cuvinte, a folosit doar 4 % din lărgimea de bandă disponibilă.
21
Este clar că o combinaţie între un timp lung de propagare, o lărgime de bandă
mare şi o lungime mică a cadrelor duce la un rezultat dezastruos în ceea ce priveşte
eficacitatea utilizării canalului. Cauza o constituie algoritmul de transmisie, care cere
ca emiţătorul să aştepte confirmarea unui cadru înainte de a-l putea transmite pe
următorul. Soluţia o constituie permisiune ca emiţătorul să transmită n > 1 cadre
înainte de a fi blocat în aşteptarea confirmării. Alegând convenabil lărgimea n a
ferestrei, emiţătorul va fi capabil să transmită continuu cadre pe o durată egală cu
timpul de propagare dus-întors, fără să umple fereastra.
În cazul exemplului de mai sus, va trebui ca n ≥ 26. Dacă emiţătorul începe
să transmită primul cadru la t = 0, atunci la t = 520 [ms] el a terminat de transmis
cele 26 cadre (n = 26) şi tocmai primeşte confirmarea pentru cadrul cu numărul de
ordine 0. Apoi, confirmările vor sosi la fiecare 20 [ms], astfel încât emiţătorul va
avea permanent permisiunea să transmită (dacă are ce transmite). În orice moment
vor exista 25 sau 26 de cadre transmise şi neconfirmate încă. Deci dimensiunea
maximă a ferestrei de emisie este de 26.
Această tehnică de transmisie este numită pompare (pe conductă) /
bandă de asamblare [pipelining]. Dacă avem o capacitate a canalului fizic de
C [biţi/s] ]i o dimensiune a cadrului de l [biţi], iar durata de propagare dus-întors
este de 2τ [s], timpul necesar transmiterii unui cadru va fi l /C [s]. După ce a fost
transmis ultimul bit al cadrului, există un interval de timp de τ [s] până ce acest
bit să ajungă la receptor şi (presupunând că timpul de aşteptare şi de servire la
receptor ≅ 0) încă τ [s] pentru ca să primească confirmarea. La protocolul pas-
cu-pas, linia este ocupată timp de l /C şi este liberă timp de 2 τ , rezultând un
grad (eficacitate) de utilizare a liniei de l /(l + 2Cτ ). Dacă l < 2Cτ , rezultă S < 50
%. Dar, întrucât, în realitate, avem τ > 0 pentru propagarea înapoi a confirmării,
metoda pompării poate fi utilizată, în principiu, pentru a folosi linia în acest timp,
dar dacă τ este mic, complexitatea introdusă suplimentar de această metodă de
transmitere nu este justificată.
Pomparea cadrelor pe o linie nefiabilă ridică unele probleme serioase,
precum: ce se întâmplă dacă se pierde sau se alterează un cadru din mijlocul unui
şir lung de cadre? Este posibil ca un şir lung de cadre (pentru o fereastră de emisie
de dimensiuni mari) să sosească la recepţie mai înainte ca emiţătorul să fie înştiinţat
că vreun cadru n-a ajuns corect. Evident, un cadru alterat va fi refuzat la recepţie.
Dar ce trebuie să facă receptorul cu cadrele sosite corect după cadrul alterat? (A nu
se uita că nivelul DLC al receptorului trebuie să livreze în ordine pachetele către
nivelul său de reţea).
Există două metode de a face faţă erorilor de transmisie la tehnica pomp`rii
cadrelor:
22
următorul pachet pe care trebuie să-l livreze nivelului său de reţea. Dacă fereastra de
emisie se umple înainte ca pauza de aşteptare să expire, “conducta” de cadre va
începe să se golească. În final, pauza de aşteptere se va termina şi emiţătorul va
retransmite toate cadrele neconfirmate, în ordine, începând cu cel alterat sau pierdut.
Să analizăm mai amănunţit efectele erorilor de transmisie asupra acestui
algoritm, pentru cazul n = 4:
F e r e a [ 0 s i s t , r i] ae 3 [1 , ] 4 [2 , ] 5
d e e m
S N 0 1 2 3 4 1 2 3 4
A
t
B
R N 0 1 1 1 1 1 2 3
P a c h 0 e t u l e x t r a s 1 2 3
F i g . 8
F e r e a [ s0 i s t r, a
d e e m i ]e 3 [2 , ] 6 [4 , [5 ] 7 , ] 8
S N 0 1 2 3 4 5 2 4 5
A
t
B
R N 0 1 2 3 4 5 6
P a c h 0 e t u1 l 2 e 3x t r 4a s 5
F i g . 9
23
Primul cadru de confirmare, purtând SN = 1, este alterat în transmisie, dar nu
crează probleme, căci este urmat de o confirmare (RN = 2) care ajunge corect şi
această confirmare ajunge la A mai înainte ca pachetul cu numărul de ordine 3
(ultimul pachet al ferestrei curente de emisie) să fi fost complet transmis şi ca pauza
de aşteptare să fi expirat - ceea ce se traduce la A ca o confirmare a ajungerii corecte
la B a pachetelor 1 şi 2. Cel de al doilea cadru de confirmare alterat (purtând RN
= 3) provoacă retransmisia, întrucât următorul cadru de confirmare (având RN = 4)
este întârziat până când A îşi transmite întreaga fereastră şi îşi epuizează pauza de
aşteptare; aceasta face ca A să se întoarcă cu transmisia de la pachetul 2.
K Observaţii: Se constată că - aşa cum stau lucrurile în exemplul ales -, în
cazul unei ferestre de emisie de lungime mică şi a unor cadre cu date lungi de la B
la care să se ataşeze confirmările, o eroare a confirmării poate întârzia confirmările
până când ultimul pachet al ferestrei de emisie de la A este transmis, făcând ca
emiţătorul A să aştepte sau să se întoarcă pentru retransmisie. Mai observăm că,
atunci când o confirmare întârziată ajunge la emiţător, acesta poate executa un salt
înainte (în cazul exemplului, de la pachetul 3 la pachetul 5).
Este posibil să apară retransmisii chiar în absenţa erorilor de transmisie.
Acesta se întâmplă în cazul unor cadre lungi într-un sens (de la A spre B) şi a
unor cereri de pachete ajungând la emiţător (în A) cu întârziere. Iată un astfel de
caz:
F e r e a [ 0 s i s t , r i ] ae 3 [1 , ] 4 [3 , ] [4 6 , ] 7
d e e m
S N 0 1 2 3 4 1 3 4 5
A
t
B
R N 0 1 3 4 5
P a c h 0 e t u1 l2 e 3 x t r 4 a s
F i g . 1 0
Cererea RN = 1 ajunge la timp pentru a permite pachetului 4 să fie trimis,
dar, după trimiterea pachetului cu SN = 4, nodul A termină pauza de aşteptare şi
se întoarce la pachetul 1.
Dăm mai jos regulile pentru protocolul întoarce cu n înapoi -
presupunând că SN şi RN sunt numere întregi ce pot creşte nelimitat (în
practică, ele sunt modulo m):
- Regulile nu privesc iniţializarea protocolului: vom presupune că, iniţial, nu
sunt cadre de transmis pe linie, că nodul A începe să transmită pachetul 0 şi că
nodul B aşteaptă pachetul 0 (vom aborda mai încolo modul de iniţializare).
- Emiţătorul utilizează variabilele SNmin şi SNmax pentru fereastră (SNmin
este cel mai mic număr de ordine al unui pachet care nu a fost încă confirmat şi
reprezintă limita inferioară a ferestrei de emisie; iar SNmax denotă numărul de
ordine al următorului pachet ce va fi preluat de la nivelul de reţea). Deci nivelul
DLC de la emiţător va încerca să transmită pachetele de la cel cu numărul de ordine
SNmin până la cel cu numărul de ordine SNmax - 1 (păstrate în buffere pentru
eventuala retransmisie).
24
Iat` acum algoritmul întoarce cu n înapoi :
| La emi\`tor (nodul A):
1 - Iniţializează SNmin = SNmax = 0
2 - Execută paşii 3, 4 şi 5 repetat, în orice ordine. Pot exista
întârzieri arbitrare - dar limitate - între momentul când sunt
satisfăcute condiţiile pentru un pas şi momentul când pasul este
executat.
3 - Dacă
SNmax < SNmin + n
şi dacă este disponibil un pachet de la nivelul de reţea, acceptă un
nou pachet în DLC, îi atribuie numărul de ordine SNmax şi
incrementează SNmax .
4 - Dacă se primeşte un cadru fără eroare de la B, conţinând
RN > SNmin ,
atunci creşte SNmin până când
SNmin = RN .
5 - Dacă
SNmin < SNmax
şi nu există nici un cadru aflat în curs de transmisie, se alege un
număr
SN ∈ [SNmin , SNmax) ;
se transmite pachetul cu numărul de ordine SN într-un cadru,
punând valoarea lui SN în antetul lui, în câmpul rezervat
numărului de ordine. Se permite cel mult o întârziere limitată între
transmisiile la intervale succesive ale pachetului cu SNmin , dacă
SNmin nu se modifică.
‚ La receptor (nodul B):
1 - Iniţializează RN = 0 şi repetă la nesfârşit paşii 2 şi 3.
2 - Ori de câte ori se primeşte un cadru fără erori de la A, conţinând
SN = RN ,
livrează pachetul sosit nivelului de reţea şi incrementează RN .
3 - La momente arbitrare, dar cu întârzieri limitate după primirea
oricărui cadru fără erori de la A, transmite un cadru către A,
conţinând RN în câmpul pentru numărul de ordine cerut.
Există mai multe metode convenţionale de a stabili temporizările şi ordinea
diferitelor operaţii din algoritmul dat.
Cel mai simplu ar fi ca nodul A să iniţializeze un ceas ori de câte ori
transmite un pachet. Dacă timpul fixat la ceas expiră înainte de sosirea confirmării
pentru acel pachet (adică înainte ca SNmin să depăşească numărul de ordine al
acestui pachet), pachetul va fi retransmis. Câteodată, la utilizarea acestei metode,
emiţătorul, după ce se întoarce şi retransmite pachetul cu SNmin , retransmite
25
automat şi următoarele pachete până la cel cu numărul SNmax - 1, indiferent dacă
se primesc sau nu confirmările cu cererile pentru următoarele pachete.
De exemplu, în cazul prezentat de erori la cadrele de confirmare pentru
protocolul revenire cu 4, emiţătorul ar fi putut trimite pachetul 4 după pachetul
3, în loc de pachetul 5. În conformitate cu algoritmul prezentat, aceasta corespunde
situaţiei ca emiţătorul să întârzie executarea pasului 4 atunci când se află în cursul
retransmiterii ferestrei de pachete.
O altă posibilitate o constituie cea ca A să revină la începutul ferestrei după
transmiterea tuturor pachetelor din fereastră.
De asemenea este posibil ca A să răspundă unei cereri specifice a lui B
pentru retransmisie. O astfel de comunicaţie între A şi B poate fi considerată ca
parte a acestei clase de protocoale, ghidând selecţiile posibile din algoritm.
K Observaţie: Revenirea cu n reprezintă, în fond, o clasă de
protocoale (algoritmi), căci nici temporizările, nici modurile de organizare a
retransmisiilor nu sunt precizate. Mai mult, nu se fixează nici modul de alegere a
pachetelor într-o fereastră.
Cea mai simplă metodă de temporizare la nodul B este ataşarea valorii
curente a RN la cadrele cu date transmise către A (piggybacking), iar când B nu
are date de transmis lui A, să trimită un cadru de confirmare izolat, conţinând RN,
după fiecare recepţie a unui cadru cu date nealterat trimis de A.
Dăm în cele ce urmează un protocol de tip revenire cu n ce poate
transmite o fereastră de lărgime w = MAX_SEQ şi în ipoteza că nivelul de reţea
de la emisie nu are pregătit un pachet în orice moment, ci acesta provoacă un
eveniment de tip Network_Layer_Ready când are un pachet de transmis. La
acest protocol, nivelul DLC de la emisie va împiedica nivelul său de reţea să-i mai
trimită pachete după ce fereastra s-a umplut (de fapt, buffer-ul), permiţându-i să reia
trimiterea de pachete atunci când în fereastră s-a făcut loc (prin transmiterea cu succes
a unui număr de cadre de la începutul ferestrei); aceasta se realizează prin intermediul
funcţiilor disable_network_layer şi respectiv enable_network_layer. Pe de
altă parte, nivelul DLC receptor acceptă cadrele în ordine; cadrele ce urmează după
un cadru alterat de eroare nu mai sunt preluate. În acest protocol s-a adoptat o valoare
MAX_SEQ = 7 (dar ea poate fi schimbată cu orice valoare impară).
/* Protocol Go_back_n */
#define MAX_SEQ 7 /* trebuie să fie 2ˆn = 1 */
typedef enum {frame_arrival, cksum_err, timeout, network_layer_ready} event_type;
/* evenimentele posibile */
#include “protocol.h”
static boolean between(seq_nr a, seq_nr b, seq_nr c)
{
/* întoarce adevărat dacă a < = b < c circular şi fals în caz contrar */
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[ ])
26
{
/* construieşte şi trimite un cadru cu date */
frame s; /* variabilă temporară */
s.info = buffer[frame_nr]; /* inserează pachetul în cadru */
s.seq = frame_nr; /* inserează numărul de ordine al pachetului în cadru */
s.ack = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1); /* ataşează confirmarea */
to_physical_layer(&s); /* transmite cadrul */
start_timer(frame_nr); /* porneşte ceasul pentru pauza de aşteptare */
}
void gobackn(void)
{
seq_nr next_frame_to_send; /* numărul de ordine al următorului cadru de transmis */
seq_nr ack_expected; /* cel mai vechi cadru încă neconfirmat */
seq_nr frame_expected; /* următorul cadru aşteptat la recepţie */
frame r; /* variabilă auxiliară */
packet buffer[MAX_SEQ]; /* buffer pentru cadrele de la emisie */
seq_nr nbuffered; /* număr buffer-e utilizate la emiţător */
seq_nr I; /* index în vectorul de buffer-e */
event_type event;
enable_network_layer(); /* permite evenimente networ_layer_ready */
ack_expected = 0; /* următoarea confirmare aşteptată */
next_frame_to_send = 0; (* următorul cadru transmis */
frame_expected = 0; /* numărul cadrului aşteptet să sosească */
nbuffered = 0; /* iniţial, în buffer-e nu există nici un pachet */
while true {
wait_for_event(&event); /* cele 4 evenimente posibile - vezi event_type */
27
switch(event) {
case network_layer_ready: /* nivelul de reţea emiţător are un pachet de transmis */
/* acceptă, salvează şi transmite un nou cadru */
from_network_layer(&buffer[next_frame_to_send]); /* preia noul pachet */
nbuffered = nbuffered + 1; /* deplasează fereastra de emisie */
send_data(next_frame_to_send, frame_expected, buffer); /* transmite cadrul */
inc(next_frame_to_send); /* deplasează limita super. a ferestrei de emisie */
case frame_arrival: /* a sosit un cadru cu date sau de control */
from_physical_layer(&r); /* preia cadrul din biţii sosiţi la nivelul fizic */
if (r.seq == frame_expected) {
/* cadrele sunt acceptate doar în ordine */
to_network_layer(&r.info); /* pasează pachetul nivelului de reţea */
inc(frame_expected); /* deplasează limita infer. a ferestrei de emisie */
}
/* confirmarea pachetului n implică confirmările pachetelor n-1, n-2, etc. */
/* se verifică acest lucru */
while (between(ack_expected, r.ack, next_frame_to_send)) {
/* tratează confirmarea ataşată */
nbuffered = nbuffered - 1; /* se eliberează un cadru din buffer */
stop_timer(ack_expected); /* cadrul a sosit nealterat; opreşte ceasul */
inc(ack_expected); /* micşoreză fereastra de emisie */
}
case cksum_err: ; /* cadrele eronate sunt ignorate */
case timeout: /* a expirat pauza de aşteptare; se retransmit */
/* toate cadrele neconfirmate */
next_frame_to_send = ack_expected; /* retransmisia începe de aici */
for (i=1; i<=nbuffered; i++) {
send_data(next_frame_to_send, frame_expected, buffer); /* retransm. 1 cadru */
inc(next_frame_to_send); /* pregăteşte transmiterea următorului cadru */
}
}
if (nbuffered < MAX_SEQ)
enable_network_layer();
else
disable_network_layer();
}
}
Vom observa că, în fiece moment, sunt gata de transmis MAX_SEQ cadre (şi
nu MAX_SEQ + 1 !!), chiar dacă există MAX_SEQ + 1 numere de ordine
(SN): 0, 1, 2, ... , MAX_SEQ .
Pentru a înţelege această restricţie, să considerăm următorul scenariu pentru
MAX_SEQ = 7:
1 - Emiţătorul transmite cadrele de la 0 la 7;
2 - O confirmare, ataşată la un cadru cu date, vine în fine la emiţător;
3 - Emiţătorul transmite alte 8 cadre, cu numerele de ordine 0 ÷ 7;
4 - Soseşte o nouă confirmare (ataşată) pentru cadrul numărul 7.
Se pune întrebarea: cele 8 cadre din al doilea lot au ajuns toate corect sau s-au
pierdut toate (căci toate cadrele ajunse după un cadru eronat sunt ignorate) ? În ambele
cazuri, receptorul trimitea confirmarea pentru numărul 7 şi emiţătorul nu are cum să
28
afle ce s-a întâmplat. De aceea numărul maxim de cadre transmise trebuie limitat la
MAX_SEQ .
Fiecare cadru trebuie asociat unui alt ceas, căci pauza de aşteptare pentru el
poate fi diferită de cele pentru celelalte cadre. Aceste ceasutri pot fi uşor simulate
prin soft, utilizând un singur ceas hard care provoacă periodic întreruperi. Pauzele
de aşteptare formează o listă legată, pentru fiecare “nod ” din listă indicându-se câte
tacturi sunt până la expirarea pauzei de aşteptare, numărul cadrului pentru care se
marchează timpul şi un pointer către următorul nod.
Iată un exemplu:
1 0 : 0 T 0i m : p 0 u l0 r e . a 0l
5 1 8 2 6 3
P o i n t e r c ă t r e u r m ă t o a r e a p a u z ă d e a ş t e
N r . d e o r d i n e a l c a d r u l u i p e n t r u c a r e s
P e r i o a d e r ă m a s e
a )
1 0 : 0 0 : 0 0 . 5
8 2 6 3
b )
F i g . 1 1
Fie un ceas cu perioada de 100 [ms]. Fie timpul iniţial real 10.00:00.0. Să
admitem că vor exista 3 pauze de aşteptare: respectiv până la 10:00:00.5, 10:00:01.3
şi 10:00:01.9. La fiecare perioadă a ceasului hard, timpul real este actualizat şi ceasul
din capul listei este decrementat. Când contorul de perioade (tacturi) ajunge la 0,
pauza de aşteptare s-a terminat şi nodul este eliminat din listă (vezi fig. b)).
Deşi metoda necesită scanarea listei la apelarea funcţiilor start_timer şi
stop_timer, ea nu reclamă multe operaţiuni pentru fiecare tact.
29
Să analizăm acum performanţele protocolului de tip revenire cu n.
Dacă SN şi RN sunt numere întregi nemărginite, demonstrarea
corectitudinii protocolului este similară cu cea pentru protocolul pas cu pas: vom
presupune şi aici că toate cadrele alterate sunt depistate de CRC de la recepţie, că
fiece cadru ajunge la destinaţie corect cu o probabilitate ≥ q > 0 şi că sistemul este
iniţializat corect (nu există, iniţial, cadre în curs de transmisie, iar nodurile A şi B
încep amândouă cu pasul 1 din algoritmul lor).
Proprietatea de siguranţă a protocolului de tip revenire cu n este exact
aceeaşi ca la protocolul pas cu pas: în speţă, nodul B livrează pachetele, în
ordine, nivelului său de reţea, utilizând RN pentru a urmări viitorul pachet aşteptat.
Pentru a demonstra durata de viaţă nelimitată, să admitem că, la A, la un
anumit moment t1 , avem
SNmin = i .
F e r e a s t r a [i , n +i - 1 ] [i + 2n +, +i 1 ]
d e e m i s i e
S N i i + 1i i + 1i i + i1 + 2
A
t1 t3 t
t2
B
R N i i i + i 1+ 2
P a c h e t u l e x t r ia si + 1
F i g . 1 2
30
întrucât pachetul i s-ar fi putut să fie recepţionat fără eroare şi livrat nivelului de
reţea din B mai înainte de momentul t1 şi chiar mai înainte ca SNmin să fi devenit
egal cu i .
Conform algoritmului, A transmite pachetul i în mod repetat, cu întârzieri
finite între retransmisiile succesive, de la t1 până la t3 .
Dacă
t1 < t2 ,
rezultă că
RN(t ) = 1 pentru t ∈ [t1 , t2]
astfel încât prima recepţionare fără erori a pachetului i după momentul t1 va fi
acceptată, pachetul fiind livrat nivelului de reţea din B. Întrucât t2 < t3 , A va
retransmite pachetul i până când acesta va fi confirmat. Întrucât există o
probabilitate q > 0 ca fiece retransmisie să fie recepţionată corect, iar retransmisiile
se fac la intervale finite, rezultă că intervalul de la t1 la t2 este finit. Nodul B -
indiferent dacă t1 < t2 sau vice versa - transmite cadre conţinând RN ≥ i + 1, de
la momentul t2 până când un astfel de cadru este recepţionat corect în A (la
momentul t3). Cum A transmite şi el cadre în acest interval, întârzierea între
transmisiile succesive de la B va fi finită şi, întrucât q > 0, rezultă că intervalul de
timp de la t2 la t3 va fi finit.
Aşadar am obţinut că t3 este finit iar t1 < t3 şi t2 < t3 . Utilizând acest fapt
pentru fiecare valoare succesivă a lui SNmin , rezultă că fiece pachet este transmis
cu o întârziere finită - deci algoritmul are o durată de viaţă nelimitată.
Observaţie: Vom remarca faptul că, în demonstraţia de mai sus, nu s-a făcut
nici o presupunere privitoare la circulaţia în ordine a cadrelor pe linie - deci
algoritmul revine cu n lucrează corect chiar în cazul în care cadrele circulă fără
o anumită ordine. Aşadar, algoritmul se poate folosi şi la nivelul de transport al
reţelelor de calculatoare. În acest caz, rolul nivelului legăturii de date va fi luat de
subreţea, iar rolul cadrului va fi jucat de pachet. În reţelele de calculatoare
transmiţând cu metoda datagramelor, pachetele circulă fără vreo ordine până la
destinatar - deci generalitatea algoritmului revine (întoare înapoi ) cu n se
dovedeşte foarte utilă.
p
Vom dovedi acum corectitudinea protocolului revine cu n şi în cazul
când SN şi RN sunt numere modulo m, cu m > n - dacă se păstrează condiţia ca,
pe linie, cadrele să circule în ordine.
Să analizăm, însă, mai întâi, cu atenţie, ordinea evenimentelor atunci când SN
şi RN sunt întregi nemărginiţi.
Fie transmisia unui cadru oarecare de la A spre B. Să presupunem că acest
cadru începe să fie generat la momentul t1 în A şi este recepţionat în B la
momentul t2 .
31
F e r e a s t r a
d e e m i [s i , i n e + i - 1 ]
S N S N
A
t1 t
t0 t2
B
R N i
F i g . 1 3
32
Prin urmare, algoritmul lucrează corect.
Să analizăm acum ordinea confirmărilor (RN) aferente ferestrei de emisia din
A - utilizând numere întregi obişnuite (nemărginite).
F e r e a s t r a
d e e m i [s i , i n e + i - 1 ]
A
t2 t
t0 t1
B
R N i R N
F i g . 1 4
Se constată imediat că
RN ∈ [SNmin (t2) , SNmin (t2) + n] (7)
33
nou pachet în nivelul DLC, îi atribuie numărul de ordine snmax şi
incrementează snmax la (snmax + 1) (mod m) .
4’ - Dacă se primeşte un cadru fără eroare de la B, conţinând o
confirmare cu numărul de ordine aşteptat r n şi
(rn - snmin) (mod m ) ≤ (snmax - snmin) (mod m ) ,
atunci face
snmin = rn .
5’ - Dacă
snmin ≠ snmax
şi nu există nici un cadru aflat în curs de transmisie, se alege un
număr sn astfel încât
(sn - snmin) (mod m ) < (snmax - snmin) (mod m );
se transmite pachetul cu numărul de ordine sn într-un cadru,
punând valoarea lui sn în antetul lui, în câmpul rezervat numărului
de ordine de la emisie (“SN”). Se permite cel mult o întârziere
limitată între transmisiile la intervale succesive ale pachetului cu
snmin , dacă snmin nu se modifică.
‚ La receptor (nodul B):
1’ - Iniţializează r n = 0 şi repetă la nesfârşit paşii 2’ şi 3’.
2’ - Ori de câte ori se primeşte un cadru fără erori de la A, conţinând
sn = r n ,
livrează pachetul sosit nivelului de reţea şi incrementează r n la
(rn + 1) (mod m) .
3’ - La momente arbitrare, dar cu întârzieri limitate după primirea
oricărui cadru fără erori de la A, transmite un cadru către A,
conţinând r n în câmpul pentru numărul de ordine cerut (“RN”).
p
Vom analiza în continuare eficacitatea utilizării canalului de către algoritmul
întoarce (revine) cu n înapoi. Vom considera cazul ataşării confirmărilor la
cadrele cu date în sens invers, astfel încât vom ignora aceste confirmări. De
asemenea vom presupune, pentru simplitatea analizei, că timpul de prelucrare a
întreruperii este neglijabil, deci că τ reprezintă doar durata de propagare într-un
sens.
Precizăm că retransmisiile şi întârzierile cauzate de epuizarea pauzei de
aşteptare apar în algoritmul întoarce (revine) cu n înapoi din următoarele 3
motive:
1) Lărgimea ferestrei de emisie şi lungimea mai mare a cadrelor în sens
invers decât a celor în sens direct.
2) Erorile ce afectează cadrele cu date.
3) Erorile ca afectează cadrele de confirmare.
Le vom analiza pe rând.
34
1 - A) Lărgimea ferestrei (w) de emisie. Distingem cazurile:
a) Fereastra este destul de largă astfel încât emiţătorul poate
transmite cu viteză maximă, întrucât confirmările sosesc înainte ca fereastra
de emisie să se umple.
Durata de transmisie a unui cadru este l /C , astfel încât emiţătorul
poate continua transmisia pe durata w l /C , dup` care trebuie să se oprească
dacă primul cadru nu a fost confirmat. Prima confirmare poate sosi la 2τ
dup` ce primul cadru a fost transmis, deci confirmarea ajunge la momentul l
/C + 2τ (am presupus că primul cadru se construieşte de la momentul t0 =
0). Emiţătorul va putea transmite permanent dacă
wl l
≥ + 2τ
C C
deci pentru o lărgime a ferestrei de emisie
2C τ
w ≥ 1+ .
l
Atunci
d
S = .
h+d
b) Dacă fereastra de emisie este îngustă, emiţătorul va trebui să se
oprească la un moment dat, aşteptând prima confirmare. Apoi va putea
transmite încă un cadru, aşteptând confirmarea lui, etc. Fiece ciclu consumă
un timp l /C + 2τ , servind w cadre (respectiv wd biţi de date). Rezultă că
wd
S= .
l + 2C τ
Aşadar, pentru
2C τ
w < 1+ ,
l
rezultă
d w
S= ⋅
h +d 2Cτ .
1+
h +d
1 - B) Probabilitatea retransmisiilor cauzate de cadrele lungi care circulă
în sens invers poate fi scăzută prin creşterea parametrului n . Din p`cate, valoarea
normală a modulului m în protocoalele standard este m = 8, ceea ce restrânge
valoarea numărului n la maximum 7.
Iată un exemplu în care - chiar pentru τ = 0 - cadrele care circulă în sens
invers, având o lungime de peste 3 ori mai mare ca a celor care circulă în sens
direct, pot cauza retransmisii pentru n = 7.
35
S N 0 1 2 3 4 5 6 0
A
t
B
R N 0 0 3 6
F i g . 1 5
36
3) Când apar erori la transmisia în sens invers (la confirmare), confirmarea
este amânată până la următorul cadru care circulă spre A. Această scădere a
eficacităţii de utilizare a liniei într-un sens din cauza erorilor în celălalt sens poate
fi evitată alegând lărgimea w a ferestrei de emisie (respectiv valoarea n) destul de
mare.
2) Să urmărim acum efectul erorilor asupra cadelor cu date. Dacă n este
destul de mare pentru a evita retransmisiile sau întârzierile cauzate de duratele lungi
de propagare şi de cadrele lungi sau de apariţia de erori în sensul opus şi dacă
nivelul DLC emiţător aşteaptă terminarea ferestrei pentru a putea retransmite, atunci
se vor retransmite multe pachete pentru fiecare eroare apărută la transmisia în sens
direct. Soluţia uzuală la această problemă o constituie utilizarea pauzelor de
aşteptare. În versiunea sa cea mai simplă, dacă un pachet nu este confirmat pe durata
unei anumite pauze de aşteptare ce urmează transmisiei, pachetul va fi retransmis.
Perioada de aşteptare trebuie aleasă destul de lungă pentru a include durata de
propagare dus-întors şi durata de prelucrare, plus durata de transmisie pentru două
pachete de lungime maximă în sensul invers (spre A) - unul pentru cadrul în tranzit,
când se recepţionează un pachet, şi unul pentru a transporta noul RN. O versiune
mai sofisticată este aceea în care nivelul DLC emiţător (când se cunosc duratele de
propagare şi de prelucrare) poate determina care cadru în sens invers va trebui să
poarte confirmarea pentru un anume pachet; el se întoarce înapoi dacă acest cadru
este fără eroare şi nu livrează confirmarea.
Creşterea eficacităţii de utilizare a liniei şi scăderea întârzierilor se pot obţine
efectuând întoarcerea înapoi rapid la apariţia unei erori în sensul direct, dar
evitând retransmisiile cauzate de cadre lungi şi erori în sensul invers. O posibilitate
o constituie aceea ca nivelul DLC receptor să transmită înapoi un cadru scurt de
supraveghere la recepţionarea unui cadru alterat, fapt ce permite emiţătorului să se
întoarcă înapoi mult mai devreme decât în cazul când RN ar fi ataşat la un cadru
mai lung în sens opus.
37
cadre incontinuu, că n este destul de mare pentru ca A să nu se întoarcă înapoi
în absenţa reacţiei şi că A se întoarce întotdeauna înapoi la următorul cadru, după
ce a aflat că, la recepţie, cadrul aşteptat a ajuns alterat.
Se poate arăta (invităm cititorul să demonstreze) că:
γ ≥ 1 + p (β + γ ) .
Se observă că eficacitatea utilizării liniei este:
1
S =
γ
deci
1- p
S ≤
1+ p β
Se constată că, pentru linii nefiabile (p de valori mari) sau linii de mare
viteză ori de legături prin satelit ( β de valori foarte mari), S va avea o valoare
mică - irosindu-se astfel lărgimea de bandă.
Pentru a remedia aceste neajunsuri se foloseşte o altă subclasă a
protocoalelor cu fereastră glisantă - repetarea selectivă [selective repeat].
La aceste protocoale, nivelul DLC receptor memorează toate cadrele corecte sosite
după un cadru eronat (sau pierdut). Când emiţătorul află că un cadru din fereastra de
emisie nu a ajuns corect la destinaţie, el va retransmite numai acel cadru (nu şi
succesoarele lui). Dacă retransmisia reuşeşte, nivelul DLC receptor va dispune
acum de o secvenţă de cadre corecte, în ordine, pe care le poate pasa rapid nivelului
său de reţea, confirmând numărul de ordine (cel mai mare) al ultimului pachet
recepţionat corect.
Deci, un astfel de protocol va accepta şi pachete care nu sunt la rând
(ordonate), dar au fost cerute să fie retransmise. Va existra, ca la protocolul revine
(întoarce înapoi) cu n, o fereastră de emisie de lărgime n, indicând cu cât o
poate lua înainte A cu transmisia pachetelor faţă de pachetul cu numărul de ordine
cel mai mic nerecepţionat încă corect în B. Dar fereastra de la recepţie va fi acum
mai largă decât 1. Orice cadru aparţinând acestei ferestre poate fi acceptat şi
memorat (în buffer) până când toate cadrele precedente şi-au descărcat pachetele în
nivelul de reţea receptor. Fereastra de emisie începe cu lărgimea 0 şi creşte până la
n ; fereastra de recepţie este de lărgime fixă, egală cu n.
Recepţionarea nesecvenţială a cadrelor ridică însă o problemă care nu apărea
la protocoalele în care cadrele erau acceptate doar în ordine. Să ilustrăm această
problemă printr-un exemplu:
Să presupunem că m = 3, deci n = 7.
Nodul A transmite cadrele cu pachetele cu numere de ordine de la 0 la 6.
Între timp, fereastra receptorului permite acceptarea oricărui cadru cu numărul
de ordine de la 0 la 6 (inclusiv). Dacă toate cele 7 cadre transmise ajung corect,
receptorul le va confirma şi îşi va glisa fereastra, permiţând recepţionarea cadrelor
cu numerele de ordine: 7, 0, 1, 2, 3, 4 sau 5. Toate cele 7 buffere sunt marcate
drept goale.
Să presupunem că toate confirmările sunt alterate. Emiţătorul îşi va termina
pauza de aşteptare şi va retransmite cadrul cu pachetul cu nr. 0. Când acest cadru
ajunge la receptor, el este verificat dacă aparţine ferestrei de recepţie. El va aparţine
38
noii ferestre, deci va fi acceptat. Receptorul va transmite (prin ataşare) confirmarea
pentru cadrul cu pachetul nr. 6 - întrucât au fost recepţionate pachetele 0 ÷ 6.
Emiţătorul va traduce situaţia ca o transmisie reuşită a cadrelor, avansând
fereastra de emisie şi transmiţând cadrele cu pachetele 7, 0, 1, 2, 3, 4 şi 5.
Cadrul cu SN = 7 va fi acceptat de receptor, pachetul din el fiind pasat nivelului de
reţea. Apoi, imediat, nivelul DLC receptor va verifica dacă are deja un cadru
corect cu pachetul cu numărul 0; va constata că îl are şi va pasa pachetul din acest
cadru nivelului său de reţea. Astfel, nivelul de reţea receptor va primi un pachet
incorect, deci protocolul va da greş.
Cauza care stă la baza acestei incorectitudini este faptul că, după ce receptorul
îşi avansează fereastra, noul interval de numere de ordine valide se suprapune cu cel
vechi. Următorul lot de cadre poate fi ori de dubluri (dacă toate confirmările s-au
pierdut) ori de cadre noi (dacă toate confirmările au fost recepţionate corect) şi
receptorul nu are cum să distingă aceste două situaţii.
Calea de rezolvare a acestei dileme constă în a ne asigura că, după ce
receptorul a avansat fereastra sa, nu există o suprapunere cu fereastra anterioară.
Pentru a fi siguri că nu există suprapunere, dimensiunea maximă a ferestrei va trebui
să fie egală cu cel puţin jumătate din valoarea lui m , adică
m ≥ 2n ; (∗ ∗ )
ţinând cont că
MAX_SEQ = m + 1
]i
w =n ,
se ia în practic`
MAX_ SEQ + 1
w = .
2
De exemplu, pentru m = 4, obţinem MAX_SEQ = 15 şi rezultă că doar
n = 8 cadre pot fi transmise într-o fereastră. Astfel, dacă receptorul a acceptat cadrele
0, ... , 7 şi avansează fereastra pentru a permite acceptarea cadrelor 8, ... , 15, el va
recunoaşte fără dubii dacă următoarele cadre sunt retransmisii (ale cadrelor 0, ... , 7)
sau cadre noi (8, ... , 12).
Acest rezultat se obţine şi din relaţiile (1) şi (2) de la analiza corectitudinii
protocolului întoarce înapoi (revine) cu n, deduse în ipoteza că un cadru generat
în A la t1 este recepţionat în B la t2 ; vom avea:
SN ∈ [RN(t2) - n , RN(t2) + n - 1] . (∗ ∗ ∗
Dacă numerele de ordine sunt construite modulo m şi pachetele )sunt
acceptate în fereastra [RN(t2) , RN(t2) + n - 1] , este necesar ca B să distingă
valorile lui SN în întreaga mulţime (∗ ∗ ∗ ). Rezultă de aici condiţia (∗ ∗ ).
Cu această schimbare, corectitudinea acestei clase de protocoale - de tip
repetare selectivă - se p`streaz`.
O problemă importantă pentru implementarea acestui tip de protocoale este
obţinerea unei eficacităţi maxime de utilizare a canalului.
39
Se observă că, oricare ar fi protocolul cu fereastră glisantă utilizat, numai
cadrele sosite fără eroare în B pot livra pachetele nivelului de reţea receptor şi, deci,
numărul probabil de pachete livrate în medie lui B de un cadru trimis din A este
mărginit de
S≤ 1-p
(unde p este probabilitatea ca un cadru să ajungă alterat).
Un protocol ideal de tip repetare selectivă ar avea o viteză maximă de
transmisie egală cu 1 - p.
Să remarcăm, mai întâi, că utilizarea numai a RN pentru a furniza informaţii
de confirmare nu este prea eficientă, întrucât, dacă apar mai multe cadre eronate
într-un interval de propagare dus-întors, nodul A nu poate afla despre al 2-lea
cadru eronat până când nu trece un timp egal cu durata de propagare dus-întors
după retransmiterea primului cadru alterat.
Există mai multe modalităţi de a furniza informaţii suplimentare de confirmare
necesare lui A:
• o metodă este aceea ca B să trimită către A cel mai mic număr de
ordine de pachet nerecepţionat corect încă - număr de ordine care trebuie să fie mai
mare decât pβ (numărul probabil de cadre eronate în perioada de propagare dus-
întors), dar care este limitat de informaţia de control (antet) necesară şi pe reacţie;
• o altă posibilitate o constituie transmiterea RN plus k biţi
suplimentari (k = const.), fiece bit furnizând o ack/nack pentru fiecare din cele k
pachete ce urmează după cel cu numărul de ordine RN.
Să presupunem acum că reacţia (cadrele de confirmare) aduce în A suficientă
informaţie pentru ca emiţătorul să poată determina, după o aşteptare de β cadre,
dacă un pachet a fost sau nu recepţionat cu succes. Algoritmul tipic pentru A este,
deci, să repete transmisia pachetelor de îndată ce constată că transmisia lor
anterioară a fost afectată de erori; dacă A descoperă mai multe cadre eronate din
fereastra de emisie, el le va retransmite în ordinea numerelor de ordine ale pachetelor
ce le conţin. Când nu se solicită retransmisii, A continuă să transmită noi pachete,
până la cel cu numărul SMmax - 1. Când atinge această limită, A poate aştepta pe
durata unei anumite pauze de aşteptare fixate sau să se întoarcă imediat înapoi la
cadrul cu pachetul nr. SNmin , pentru a transmite pachetele neconfirmate.
Nodul A acţionează ca un sistem ideal de repetare selectivă până când este
forţat să aştepte sau să se întoarcă înapoi de la SMmax - 1. Când aceasta se
întâmplă, pachetul cu nr. SNmin trebuie să se fi transmis eronat de cca. n /β ori.
Deci, mărind suficient de mult n, probabilitatea unei întoarceri înapoi poate fi
redusă până la valori neglijabile. Dar valorile mari pentru n introduc 2 dificultăţi
(presupunând că pachetele trebuie reordonate la nivelul DLC receptor):
- trebuie asigurată la B o memorie pentru toate pachetele acceptate după cel
cu nr. RN;
- numărul mare de pachete stocate vor fi toate întârziate în aşteptarea celui cu
nr. RN.
p
Iată un program de simulare pentru un protocol de tip repetare selectivă
în care, pentru fiecare cadru transmis este asociat un ceas şi, la expirarea respectivei
pauze de aşteptare, se retransmite doar cadrul cu pachetul respectiv. Fereastra de
40
emisie începe co lărgimea 0 şi creşte până la dimensiunea predefinită MAX_SEQ ;
fereastra de recepţie are dimensiunea fixă MAX_SEQ. Receptorul are câte un buffer
rezervat pentru fiecare număr de ordine din fereastră, iar fiecărui buffer îi este asociat
un bit arrived (“sosit”) care indică dacă buffer-ul este plin sau gol; pentru fiecare
cadru sosit, o funcţie numită between (“în_fereastră”) verifică dacă numărul de
ordine aparţine ferestrei şi, dacă acest lucru este adevărat şi cadrul nu a fost încă
primit, îl acceptă şi îl stochează - indiferent dacă el conţine sau nu următorul pachet
aşteptat de nivelul de reţea receptor (fireşte, el va fi păstrat fără a fi livrat nivelului de
reţea, până când toate pachetele cu numerele de ordine precedente au fost livrate, în
ordinea corectă, nivelului de reţea).
/* Protocol Nonsequential receive */
#define MAX_SEQ 7 /* trebuie să fie 2ˆn = 1 */
#define NR_BUFS ((MAX_SEQ + 1)/2)
typedef enum {frame_arrival, cksum_err, timeout, network_layer_ready, ack_timeout}
event_type; /* evenimentele posibile */
#include “protocol.h”
boolean no_nak = true; /* nu s-a transmis încă nici o confirmare negativă */
static boolean between(seq_nr a, seq_nr b, seq_nr c)
{
/* asem\n\tor cu between din Protocolul Go back n, dar mai scurt */
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[ ])
{
/* construie[te [i trimite un cadru cu date de ack sau de nak */
frame s; /* variabilă temporară */
s.kind = fk; /* kind == data, ack sau nak */
if (fk == data) s.info - buffer[frame_nr % NR_BUFS];
s.seq = frame_nr; /* inserează numărul de ordine al pachetului în cadru */
s.ack = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1); /* ataşează confirmarea */
if (fk == nak) no_nak = false; /* doar o nak pentru un cadru */
to_physical_layer(&s); /* transmite cadrul */
if (fk == data) start_timer(frame_nr % NR_BUFS);
/* porneşte ceasul pt. pauza de aşteptare */
stop_ack_timer(); /* nu este nevoie de un cadru separat de ack */
}
void selectrep(void)
{
seq_nr = ack_expected; /* limita inferioară a ferestrei emiţătorului */
seq_nr = next_frame_to_send; /* limita superioară a ferestrei emiţătorului + 1 */
seq_nr frame_expected; /* limita inferioară a ferestrei receptorului */
seq_nr too_far; /* limita superioară a ferestrei receptorului + 1 */
seq_nr oldest_frame; /* cărui cadru i-a expirat pauza de aşteptare ? */
int i; /* indice de buffer */
frame r; /* variabilă auxiliară */
packet out_buffer[NR_BUFS]; /* buffer pentru cadrele de la emisie */
packet in_buffer[NR_BUFS]; /* buffer pentru cadrele de la recepţie */
boolean arrived[NR_BUFS]; /* configuraţie de biţi asociată buffer-lor la recepţie */
seq_nr nbuffered; /* număr buffer-e utilizate la emiţător */
event_type event;
enable_network_layer(); /* permite evenimente networ_layer_ready */
ack_expected = 0; /* următoarea confirmare aşteptată */
next_frame_to_send = 0; (* numărul următorului cadru transmis */
41
frame_expected = 0; /* numărul cadrului aşteptat să sosească */
too_far = NR_BUFS;
nbuffered = 0; /* iniţial, în buffer-e nu există nici un pachet */
for (i = 0; i < NR_BUFS; i++) arrived[i] = false;
wait_for_event(); /* cele 5 evenimente posibile - vezi event_type */
switch(event) {
case network_layer_ready: /* nivelul de reţea emiţător are un pachet de transmis */
/* accept\, salvează şi transmite un nou cadru */
nbuffered = nbuffered + 1; /* extinde fereastra de emisie */
from_network _layer(&out _buf[next_frame_to_send % NR_BUFS]); /* preia pachet */
send_frame(data, next_frame_to_send, frame_expected, out_buf); /* trimite cadru */
inc(next_frame_to_send); /* deplasează limita super. a ferestrei de emisie */
case frame_arrival: /* a sosit un cadru cu date sau de control */
from_physical_layer(&r); /* preia cadrul din biţii sosiţi la nivelul fizic */
if (r.kind == data) {
/* a sosit un cadru nealterat */
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)) {
/* cadrele pot fi acceptate în orice ordine */
arrived[r.seq % NR_BUFS] = true; /* marchează buffer-ul ca fiind plin */
in_buf[r.seq % NR_BUFS] = r.info; /* introduce datele în buffer */
while (arrived[frame_expected % NR_BUFS] {
/* predă cadrele şi avansează fereastra */
to_network_layer(&in_buf[frame_expected % NR_BUFS]);
no_nak = true;
arrived[frame_expected % NR_BUFS] = false;
inc(frame_expected); /* avansează limita infer. a ferestrei receptorului */
inc(too_far); /* avansează limita super. a ferestrei receptorului */
start_ack_timer(); /* stabileşte dacă e necesară o ack separat\ */
}
}
}
42
O problemă cu acest protocol o constituie numărul necesar de buffer-e de la
receptor. Este clar că receptorul nu va accepta nici o dată cadre cu număr de ordine
mai mic decât limita inferioară a ferestrei sau cu număr de ordine mai mare decât
limita superioară a ferestrei. Deci, numărul de buffer-e necesar este egal cu
dimensiunea ferestrei (nu cu intervalul de numere de ordine valide !).
De exemplu, pentru m = 4 sunt necesare 8 buffer-e (numerotate de la 0 la
7). Când soseşte cadrul i , el este depus în buffer-ul nr. i mod 8. Se va observa că,
deşi cadrele i şi (i + 8) mod 8 “concurează” pentru acelaşi buffer, ele nu se află
nici o dată simultan în aceeaşi fereastră (căci aceasta ar implica o lărgime a ferestrei
cel puţin egală cu 9).
Cantitatea necesară de memorie poate fi micşorată la n - β fără probleme,
întrucât, de fiecare dată când apare o întoarcere înapoi la SNmax - 1, nodul A nu
mai poate transmite noi pachete dincolo de SNmax - 1 pe durata unei perioade de
propagare dus-întors. Deci el ar putea, foarte bine, să retransmită pachetele încă
neconfirmate de la SNmax - β până la SNmax - 1. Aceasta înseamnă că B nu
trebuie să salveze aceste pachete.
Numărul necesar de contoare de timp este egal cu numărul de buffer-e (nu cu
intervalul de numere de ordine valide !). Există câte un contor de timp asociat fiecărui
buffer. Când timpul contorului expiră, se retransmite conţinutul buffer-ului.
Spre diferenţă de protocolul Go_back_n - la care, dacă traficul într-un sens
este mare iar în sens invers este inexistent, sunt trimise doar MAX_SEQ cadre,
după care protocolul se blochează - la protocolul Nonsequential receive acest
lucru nu se petrece. După sosirea unui cadru dintr-o secvenţă, este pornit un ceas
(contor de timp) auxiliar prin start_ack_timer. Dacă nu apare trafic în sens invers
până la expirarea timpului fixat la acest ceas, se va trimite un cadru de confirmare
separat. Întreruperea provocată de acest ceas auxiliar este evenimentul ack_timeout.
În acest fel, lipsa unui trafic în sens invers, la care să se ataşeze confirmările, nu mai
constituie un impediment. Este esenţial ca intervalul de timp fixat la acest contor
auxiliar să fie mult mai scurt decât cel al pauzei de aşteptare, asigurându-se asfel că o
confirmare pentru un cadru corect recepţionat soseşte înainte de retransmiterea
cadrului din cauza expirării pauzei de aşteptare.
Protocolul tip repetare selectivă (Nonsequential receive) utilizează o
strategie mai eficientă de tratare a erorilor decât protoculul tip revenire cu n
Go_back_n. Ori de câte ori receptorul constată o eroare, el trimite o confirmare
negativă (nak) către emiţător. Cadrul cu nak reprezintă o cerere de retransmitere a
cadrului cu date specificat în nak. Transmiterea unei nak se face în două situaţii:
când se primeşte un cadru alterat sau când soseşte un cadru fără eroare dar nu cel
aşteptat (posibil un cadru “pierdut”). Pentru a evita apariţia de cereri multiple de
retransmisie a aceluiaşi cadru “pierdut”, receptorul va ţine evidenţa dacă s-a transmis
deja o nak pentru un anumit cadru. Variabila no_nak are valoarea adevărat dacă
nu s-a trimis încă nici o nak pentru cadrul aşteptat (frame_expected ). Dacă nak
este alterată sau se pierde, nu este grav, întrucât emiţătorul îşi va termina pauza de
aşteptare şi va retransmite oricum cadrul care lipsea la recepţie. Dacă un cadru eronat
soseşte după ce o nak a fost transmisă şi pierdută, no_nak va lua valoarea
adevărat şi va porni contorul de timp auxiliar; la expirarea timpului acestuia, va fi
trimisă o ack pentru resincronizarea emiţătorului cu starea curentă a receptorului.
43
În unele situaţii, intervalul de timp necesar pentru propagarea cadrului şi a
confirmării, plus cel pentru procesarea cadrelor cu date la receptor şi elaborarea
confirmării este (relativ) constant. Atunci, emiţătorul îşi poate regla pauza de
aşteptare astfel încât să fie cu puţin mai mare decât intervalul (probabil) normal
dintre momentul transmisiei cadrului şi cel al recepţionării confirmării sale. Dar
dacă acest interval de timp este puternic variabil, emiţătorul este pus în situaţia să
aleagă între două alternative: o pauză de aşteptare mică, riscând astfel retransmisii
inutile şi risipind lărgimea de bandă, sau o pauză de aşteptare mare, rămânând astfel
inactiv o bună bucată de timp după producerea unei erori de transmisie şi risipind şi
în acest caz lărgimea de bandă. Dacă traficul în sens invers este sporadic, durata până
la confirmare va fi neregulată - scurtă când există trafic în sens invers şi lungă în caz
contrar. Şi durata diferită de prelucrare de la receptor poate crea probleme în acest
sens. În general, atunci când abaterea standard a intervalului de timp până la
confirmare este mică în comparaţie cu intervalul însuşi, ceasul poate fi reglat pentru o
pauză de aşteptare scurtă şi nak nu sunt utile; în caz contrar, ceasul trebuie reglat
pentru o pauză de aşteptare mai mare, iar nak pot accelera în mod substanţial
retransmisia cadrelor alterate sau pierdute.
O problemă strâns legată de pauza de aşteptare şi de nak-uri este aceea de a
determina care anume cadru a provocat espirarea pauzei de aşteptare. În protoculu
tip revenire cu n (Go_back_n), acest cadru era întotdeauna confirmarea aşteptată
(ack_expected ), căci ea era mereu cel mai vechi cadru. În protocolul tip repetare
selectivă (Nonsequential receive) nu exist` o modalitate simplă de a determina
cadrul care a produs expirarea pauzei de aşteptare. Într-adevăr, să presupunem că au
fost transmise cadrele 0 ÷ 4, ceea ce înseamnă că lista cadrelor transmise şi
neconfirmate încă, în ordinea de la cel mai vechi la cel mai recent, este 0, 1, 2, 3, 4.
Să presupunem că: pauza de aşteptare pentru cadrul 0 s-a terminat, se transmite noul
cadru 5, pauzele de aşteptare pentru cadrele 1 şi 2 expiră şi este transmis noul
cadru 6. În acest moment, lista cadrelor transmise şi neconfirmate, de la cel mai vechi
la cel mai nou cadru, este: 3, 4, 0, 5, 1, 2, 6. Dacă se pierd toate confirmările,
pauzele de aşteptare aferente celor 7 cadre vor expira în această ordine.
Fără a ne ocupa de administrarea timpului (care ar îngreuna exemplificarea),
vom presupune că variabilei oldest_frame (cel mai vechi cadru) i se atribuie
valoarea pauzei de aşteptare astfel încât să indice care este cadrul care a provocat
expirarea pauzei de aşteptare.
p
Să analizăm acum eficacitatea utilizării canalului fizic de către protocolul
repetării selective.
În cazul unei ferestre largi, transmisia se face tot continuu, dar trebuie trimise
cadre suplimentare pentru a “corecta” cadrele eronate. Am văzut că numărul probabil
de transmisii pentru un cadru este
1
1- q
w
astfel încât, pentru a recepţiona w cadre fără eroare, trebuie transmise
1- q
cadre. Rezultă că:
44
• pentru o fereastră largă şi erori de transmisie:
d
S= ⋅ (1 - q )
h+d
• pentru o fereastră îngustă şi erori de transmisie:
d w
S= ⋅ (1 - q ) ⋅
h+d 2Cτ
1+
h+d
S scăzând din cauza retransmisiilor.
Observaţie: În prezenţa erorilor, eficacitatea protocoalelor cu fereastră
glisantă este diferită, din cauza numărului diferit de cadre ce trebuie retransmise
după o eroare. Astfel, pentru protocolul cu întoarcere cu n înapoi vom avea:
• pentru o fereastră largă şi erori de transmisie:
d 1- q
S= ⋅
h + d 1 + q (w - 1)
ţinând cont că numărul maxim de cadre care pot fi transmise înainte de a
2C τ
primi o confirmare este 1 +
h +d
45
• pentru o fereastră îngustă şi erori de transmisie:
d w (1 - q )
⋅ S=
h+d 2C τ
1 + [1 + q (w - 1)]
h+d
căci trebuie retransmise w - 1 cadre de un număr de q (w - 1) ori,
2C τ
apărând pentru fiecare o întârziere egală cu 1 + .
h +d
În formulele pentru S, limita dintre ferestrele mari şi cele mici este
2C τ
. w = 1+
l
Timpul τ este timpul de propagare într-un singur sens pe canal, astfel încât,
produsul C ⋅ τ reprezintă numărul de biţi ce pot fi transmişi în acest timp, respectiv
numărul de biţi ce pot fi “conţinuţi” de cablu sau, încă, “lungimea” cablului
exprimată în biţi. Deci C τ /l este “lungimea” cablului exprimată în cadre. Aşadar,
w este cu 1 unitate mai mare decât numărul de cadre ce pot “umple” cablul în
ambele sensuri.
Dacă w este cel puţin cu o unitate mai mare decât numărul de cadre ce
încap în cablu, transmisia se poate desfăşura continuu (altfel zis: emiţătorul nu se va
bloca din cauza unei ferestre umplute în timpul necesar primului cadru să ajungă la
receptor şi să fie prelucrat acolo, plus timpul de propagare a confirmării).
Ultimul factor din expresia lui S pentru o fereastră îngustă reprezintă
raportul dintre lărgimea w a ferestrei şi lărgimea minimă a ferestrei necesare pentru
o transmisie continuă.
S S
1 , 0 1 , 0
0 , 8 0 , 8
h = 2 0 o c t e ţ i C
d = 8 0 o c t e ţ i l = 1
C = 3
l
0 , 6 f e r e a s t r ă 0 , 6
g lis a n t ă
(w = 7 )
0 , 4 0 , 4 C = 5
l
p a s - c u - p a s
0 , 2 (w = 1 ) 0 , 2 h = 2 0 o c t e ţ i
d = 8 0 o c t e ţ i
0 C 0 w
0 2 4 6 8 1 0l 0 2 4 6 8 1 0
a ) b )
F i g . 1 6
46
Din fig. a) se constată că S scade rapid cu Cτ /l pentru protocolul pas-
cu-pas, întrucât majoritatea timpului este consumat pentru aşteptarea confirmărilor.
Din fig. b) se observă că S creşte odată cu w şi că, pentru orice w, S
este mai mic pentru un cablu lung decât pentru un cablu scurt.
Observaţii:
• pentru LAN cu C = 10 [Mbiţi/s] şi lungimea cablului de 1
[km] rezultă Cτ ≅ 50 biţi şi, deci, Cτ /l << 1;
• pentru o linie transcontinentală de C = 64 [kbiţi/s] şi lungimea
cablului de 3 000 [km] rezultă Cτ ≅ 960 biţi;
• pentru un canal de satelit cu C = 64 [kbiţi/s] şi τ = 270 [ms]
rezultă Cτ ≅ 17 280 biţi şi, pentru multe cadre, vom avea Cτ /l >> 1.
47