Sunum dosyası - Gazi Üniversitesi

BM 402 Bilgisayar Ağları
(Computer Networks)
M.Ali Akcayol
Gazi Üniversitesi
Bilgisayar Mühendisliği Bölümü
Not: Bu dersin sunumları, ders kitabının yazarları James F. Kurose ve Keith W. Ross
tarafından sağlanan sunumlar üzerinde değişiklik yapılarak hazırlanmıştır.
Ders konuları

Reliable Data Transferin Prensipleri




Reliable data transferin performansı
Pipeline kullanan protokoller
Go-Back-N
Selective repeat
2/101
1
Reliable data transferin prensipleri

Application, transport ve data link layer’da önemlidir
Ağlarda en öncelikli 10 konunun içindedir.

Reliable data transfer (rdt) protokol daha karmaşıktır.

3/101
Reliable data transfer
rdt_send(): called from above,
(e.g., by app.). Passed data to
deliver to receiver upper layer
send
side
udt_send(): called by rdt,
to transfer packet over
unreliable channel to receiver
deliver_data(): called by
rdt to deliver data to upper
receive
side
rdt_rcv(): called when packet
arrives on rcv-side of channel
4/101
2
Reliable data transfer


reliable data transfer (rdt) protokolün gönderici ve alıcı
taraflarını geliştirelim
Data transferin tek yönlü (unidirectional) olduğunu
düşünürsek


Ancak kontrol bilgisi iki yönlü gitmektedir
Sonlu durum makineleriyle (finite state machines-FSM)
modellenebilir
Olay (event) durum geçişine neden olur
Durum geçişi sırasında işlem yapılır
state: bir sonraki durum bu
durumdayken oluşan
sonraki olayla belirlenir
state
1
state
2
olay
işlem
5/101
Rdt 1.0: reliable kanal kullanarak reliable transfer

Altyapıdaki kanal tümüyle güvenilirdir



Bit hatası yoktur
Kayıp paket yoktur
Gönderici ve alıcı için FSM:


Gönderici kanala veriyi gönderir
Alıcı kanaldan gelen veriyi okur
Wait for
call from
above
rdt_send(data)
packet = make_pkt(data)
udt_send(packet)
sender
Wait for
call from
below
rdt_rcv(packet)
extract (packet,data)
deliver_data(data)
receiver
6/101
3
rdt 2.0: bit hatası olan kanal ile çalışma

Kanalda paket içindeki bitlerde bozulma olabilir


Hatalar nasıl düzeltilir ?




Bit hatalarını kontrol etmek için checksum kullanılır
acknowledgements (ACKs): alıcı göndericiye aldığı paketin hatasız
olduğunu iletir.
negative acknowledgements (NAKs): alıcı göndericiye aldığı paketin
hatalı olduğunu bildirir.
Gönderici NAK ile bildirilen paketi tekrar gönderir.
rdt2.0 daki yenilikler (rdt1.0’a göre):


Hata denetimi
Alıcı geri bildirimi: kontrol mesajları (ACK, NAK) alıcı->gönderici
7/101
rdt2.0: FSM özellikleri
rdt_send(data)
sndpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
sender
receiver
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
8/101
4
rdt2.0: hata olmadığı zaman çalışma
rdt_send(data)
sndpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
9/101
rdt2.0: hata durumu
rdt_send(data)
sndpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
10/101
5
rdt2.0 da karşılaşılan problemler
ACK/NAK bozulursa?


Duplicate’lerin seçilmesi:
Gönderici alıcıda ne olduğunu
bilemez
Retransmit yapılmaz: duplicate
olabilir



Gönderici her pakete sequence
number ekler
Gönderici mevcut paketi
retransmit yapar ACK/NAK
bozulursa
alıcı duplicate paketleri atar
stop and wait
Gönderici bir paket gönderir,
Alıcıdan cevap bekler
11/101
rdt2.1: gönderici bozulan ACK/NAK ları belirler
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
Wait for
call 0 from
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
udt_send(sndpkt)
(corrupt(rcvpkt) ||
isNAK(rcvpkt) )
udt_send(sndpkt)
Wait for
ACK 0 or
NAK 0
L
Wait for
ACK 1 or
NAK 1
Wait for
call 1 from
above
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
sender
12/101
6
rdt2.1: gönderici bozulan ACK/NAK ları belirler
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq1(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
Wait for
0 from
below
Wait for
1 from
below
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq0(rcvpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
receiver
13/101
rdt2.1: değerlendirme
Gönderici:
 seq # pakete eklenir
 İki seq. no (0,1) yeterlidir.
 alınan ACK/NAK paketin
bozuk olup olmadığı kontrol
edilir
Alıcı:
 Gelen paket çift mi kontrol
edilir

Bulunulan durum gelen paket
için seq. No olur. (0 veya 1
olarak bekler)
14/101
7
rdt2.2: NAK kullanılmayan protokol


ACK kullanarak rdt2.1 ile aynı fonksiyonu görür
NAK yerine, alıcı en son doğru alınan paket için ACK paket
gönderir


Alıcı paketin seq numarasını bilmelidir
Alıcıdaki duplicate ACK : paketin retransmit edilmesini sağlar
15/101
rdt2.2: gönderici
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
Wait for
call 0 from
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,0))
udt_send(sndpkt)
(corrupt(rcvpkt) ||
isACK(rcvpkt,1))
udt_send(sndpkt)
Wait for
ACK 0 or
NAK 0
L
Wait for
ACK 1 or
NAK 1
Wait for
call 1 from
above
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
sender
16/101
8
rdt2.2: alıcı
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK0, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq1(rcvpkt))
Wait for
0 from
below
Wait for
1 from
below
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq0(rcvpkt))
udt_send(sndpkt)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt)
receiver
17/101
rdt3.0: Kanallarda hata ve kayıp olabilir
Yeni varsayım: Kanalda
paketler kaybolabilir (data
veya ACK)

checksum, seq. #, ACK,
retransmit yeterli olmaz.
Yaklaşım: gönderici ACK için
belirli bir süre bekler



Bu süre sonunda ACK gelmezse
retansmit yapılır
Eğer paket (veya ACK)
kaybolmamışsa ve gecikmiş
gelirse :
 Retransmit ile duplicate oluşur
ancak sıra numarasıyla
belirlenir
 Alıcı ACK gönderdiği paketin
sıra numarasını belirlemelidir
Bekleme süresi sonunu belirlemek
için aşağı doğru sayıcı gereklidir
18/101
9
rdt3.0 gönderici
rdt_send(data)
rdt_rcv(rcvpkt)
L
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
isACK(rcvpkt,1) )
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
start_timer
L
Wait
for
ACK0
Wait for
call 0from
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
timeout
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
stop_timer
stop_timer
timeout
udt_send(sndpkt)
start_timer
Wait
for
ACK1
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
isACK(rcvpkt,0) )
L
Wait for
call 1 from
above
rdt_send(data)
rdt_rcv(rcvpkt)
L
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
start_timer
19/101
rdt3.0 çalışması
20/101
10
rdt3.0 çalışması
21/101
Ders konuları

Reliable Data Transferin Prensipleri




Reliable data transferin performansı
Pipeline kullanan protokoller
Go-Back-N
Selective repeat
22/101
11
Performance of rdt3.0


rdt3.0 performansı çok düşüktür
Örnek: 1 Gbps link, 15 ms uçtan uca gecikme, 1kB paket olsun.
L (paket uzunluğu, bit)
R (iletim oranı, bps)
T iletim =
U
=
gönderici



L/R
RTT + L / R
=
=
.008
30.008
8kb/pkt
109 b/s
= 8 μs
= 0.00027
microsec
onds
U gönderici: utilization – kullanım oranı
1kB pkt her 30 ms -> 33kB/s kullanım 1 Gbps link için
Ağ protokolleri fiziksel kaynakların kullanımını sınırlar!
23/101
rdt3.0: stop-and-wait operation
gönderici
alıcı
Paketin ilk biti iletildi, t = 0
Paketin son biti iletildi, t = L / R
Paketin ilk biti geldi
Paketin son biti geldi, ACK gönder
RTT
ACK geldi, sonraki paketi
gönder, t = RTT + L / R
U
=
gönderici
L/R
RTT + L / R
=
.008
30.008
= 0.00027
microsec
onds
24/101
12
Ders konuları

Reliable Data Transferin Prensipleri




Reliable data transferin performansı
Pipeline kullanan protokoller
Go-Back-N
Selective repeat
25/101
Pipelined protocols
Pipelining: gönderici ACK gelmemiş bile olsa ard arda paket
gönderir



Sıra numarası aralığı artırılmak zorundadır
Gönderici ve alıcıda buffer gereklidir
İki temel pipeline protokol vardır: go-Back-N, selective repeat
26/101
13
Pipelining: increased utilization
gönderici
alıcı
Paketin ilk biti iletildi, t = 0
Paketin son biti iletildi, t = L
/R
Paketin ilk biti geldi
Paketin son biti geldi, ACK gönder
2.paketin son biti geldi, ACK gönder
3.paketin son biti geldi, ACK gönder
RTT
ACK geldi, sonraki paketi
gönder, t = RTT + L / R
Kullanım oranı 3 kat arttı
U
=
gönderici
3*L/R
RTT + L / R
=
.024
30.008
= 0.0008
microsecon
ds
27/101
Ders konuları

Reliable Data Transferin Prensipleri




Reliable data transferin performansı
Pipeline kullanan protokoller
Go-Back-N
Selective repeat
28/101
14
Go-Back-N
Gönderici :





k-bit sıra numarası paket başlığına eklenir
N boyutlu pencere kadar sıralı paket ardarda gönderilir
ACK(n): n.paket için gelen ACK kendisi ve öncekilerin tümü içindir. “cumulative ACK”
 Çift ACK’ları elimine edebilir
Her paket için timer başlatılır
timeout(n): n.paket için timeout olursa n ile sonraki tüm paketler
retransmit edilir
29/101
GBN: gönderici
rdt_send(data)
L
base=1
nextseqnum=1
if (nextseqnum < base+N) {
sndpkt[nextseqnum] = make_pkt(nextseqnum,data,chksum)
udt_send(sndpkt[nextseqnum])
if (base == nextseqnum)
start_timer
nextseqnum++
}
else
refuse_data(data)
Wait
rdt_rcv(rcvpkt)
&& corrupt(rcvpkt)
timeout
start_timer
udt_send(sndpkt[base])
udt_send(sndpkt[base+1])
…
udt_send(sndpkt[nextseqnum-1])
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
base = getacknum(rcvpkt)+1
If (base == nextseqnum)
stop_timer
else
start_timer
30/101
15
GBN: alıcı
default
udt_send(sndpkt)
L
Wait
expectedseqnum=1
sndpkt =
make_pkt(expectedseqnum,ACK,chksum)
rdt_rcv(rcvpkt)
&& notcurrupt(rcvpkt)
&& hasseqnum(rcvpkt,expectedseqnum)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(expectedseqnum,ACK,chksum)
udt_send(sndpkt)
expectedseqnum++
ACK-only: her zaman beklenen doğru sıradaki paket için ACK
gönderilir



Duplicate ACK olabilir
Sadece beklenen sıra numarasını bilmesi yeterlidir
(expectedseqnum)
Sırasız gelen paketler:


atılır (buffer’a alınmaz) -> alıcıda buffer yok!
En son alınan paket için tekrar ACK gönderilir
31/101
GBN çalışması
32/101
16
Ders konuları

Reliable Data Transferin Prensipleri




Reliable data transferin performansı
Pipeline kullanan protokoller
Go-Back-N
Selective repeat
33/101
Selective Repeat

Alıcı her doğru alınan paket için ayrı ayrı ACK paketi
gönderir



Gönderici sadece ACK almadığı paketler için retransmit
yapar


Gelen paketler buffer’a alınır
Gerekiyorsa üst katmana sıralanarak gönderilir
Gönderici timer’ı her gönderilen paket için ayrı ayrı başlatılır
Gönderici penceresi


N adet sıralı sayıya sahiptir
ACK alınmadan gönderilebilecek paket sayısını N ile sınırlar
34/101
17
Selective repeat: gönderici ve alıcı pencereleri
35/101
Selective repeat
gönderici
Üst katmandan paket gelince:

Pencerede sonraki sıra numarası
kullanılabiliyorsa paketi gönder
alıcı
pkt n [rcvbase, rcvbase+N-1] arasında ise


timeout(n):

n sıra numaralı paketi yeniden
gönder

ACK(n) [sendbase,sendbase+N] aralığında
ise:


n sıra numaralı paketi alındı
olarak işaretle
Eğer n pencerede ACK alınmayan
en küçük sıra numarası ise
pencereyi ilk ACK gelmeyen
pakete kadar ilerlet
ACK(n) gönder
Beklenen sırasında değilse:
buffer’a al
Beklenen sırasında ise: buffer’a
alınmış ve sıralanmış paketlerle
birlikte üst katmana gönder,
pencereyi alınmayan ilk paket
sıra numarasına ilerlet
pkt n [rcvbase-N,rcvbase-1] arasında ise

ACK(n)
diğer:

İşlem yapma
36/101
18
Selective repeat in action
37/101
Selective repeat: dilemma
Örnek:




Sıra numaraları: 0, 1, 2, 3
Pencere boyutu = 3
Alıcı iki senaryo arasında
fark algılamaz!
Çift gelen paketi yanlışlıkla
yeni paket olarak algılar
Soru: paketlere verilen sıra
numarası boyutu ile
pencere boyutu arasında
ne tür bir ilişki vardır?
38/101
19