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 2024 Paperzz