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
© Copyright 2025 Paperzz