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, (e.g., by app.). Passed data to deliver to receiver upper layer deliver_data(): called by rdt to deliver data to upper send side receive side udt_send(): called by rdt, to transfer packet over unreliable channel to receiver 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 state: bir sonraki durum bu durumdayken oluşan sonraki olayla belirlenir state 1 Olay (event) durum geçişine neden olur Durum geçişi sırasında işlem yapılır olay işlem state 2 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 call from packet = make_pkt(data) udt_send(packet) call from below rdt_rcv(packet) extract (packet,data) deliver_data(data) sender receiver 6/101 3
rdt 2.0: bit hatası olan kanal ile çalışma Kanalda paket içindeki bitlerde bozulma olabilir Bit hatalarını kontrol etmek için checksum kullanılır Hatalar nasıl düzeltilir? 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 sndpkt = make_pkt(data, checksum) call from isack(rcvpkt) sender ACK or NAK isnak(rcvpkt) receiver corrupt(rcvpkt) udt_send(nak) call from below notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ack) 8/101 4
rdt2.0: hata olmadığı zaman çalışma sndpkt = make_pkt(data, checksum) call from isack(rcvpkt) ACK or NAK isnak(rcvpkt) corrupt(rcvpkt) udt_send(nak) call from below notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ack) 9/101 rdt2.0: hata durumu sndpkt = make_pkt(data, checksum) call from isack(rcvpkt) ACK or NAK isnak(rcvpkt) corrupt(rcvpkt) udt_send(nak) call from below notcorrupt(rcvpkt) extract(rcvpkt,data) deliver_data(data) udt_send(ack) 10/101 5
rdt2.0 da karşılaşılan problemler ACK/NAK bozulursa? Gönderici alıcıda ne olduğunu bilemez Retransmit yapılmaz: duplicate olabilir Duplicate lerin seçilmesi: 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 && notcorrupt(rcvpkt) && isack(rcvpkt) ( corrupt(rcvpkt) isnak(rcvpkt) ) sndpkt = make_pkt(0, data, checksum) call 0 from ACK 1 or NAK 1 ACK 0 or NAK 0 call 1 from (corrupt(rcvpkt) isnak(rcvpkt) ) && notcorrupt(rcvpkt) && isack(rcvpkt) sndpkt = make_pkt(1, data, checksum) sender 12/101 6
rdt2.1: gönderici bozulan ACK/NAK ları belirler notcorrupt(rcvpkt) && has_seq0(rcvpkt) (corrupt(rcvpkt) sndpkt = make_pkt(nak, chksum) not corrupt(rcvpkt) && has_seq1(rcvpkt) sndpkt = make_pkt(ack, chksum) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ack, chksum) 0 from below 1 from below notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ack, chksum) (corrupt(rcvpkt) sndpkt = make_pkt(nak, chksum) not corrupt(rcvpkt) && has_seq0(rcvpkt) sndpkt = make_pkt(ack, chksum) 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 && notcorrupt(rcvpkt) && isack(rcvpkt,1) ( corrupt(rcvpkt) isack(rcvpkt,0)) sndpkt = make_pkt(0, data, checksum) call 0 from ACK 1 or NAK 1 ACK 0 or NAK 0 call 1 from (corrupt(rcvpkt) isack(rcvpkt,1)) && notcorrupt(rcvpkt) && isack(rcvpkt,0) sndpkt = make_pkt(1, data, checksum) sender 16/101 8
rdt2.2: alıcı notcorrupt(rcvpkt) && has_seq0(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ack0, chksum) (corrupt(rcvpkt) has_seq1(rcvpkt)) 0 from below 1 from below (corrupt(rcvpkt) has_seq0(rcvpkt)) notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ack1, chksum) 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 call 0from && notcorrupt(rcvpkt) && isack(rcvpkt,1) stop_timer timeout start_timer (corrupt(rcvpkt) isack(rcvpkt,0) ) sndpkt = make_pkt(0, data, checksum) start_timer Wait for ACK1 Wait for ACK0 call 1 from sndpkt = make_pkt(1, data, checksum) start_timer (corrupt(rcvpkt) isack(rcvpkt,1) ) timeout start_timer && notcorrupt(rcvpkt) && isack(rcvpkt,0) stop_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. T iletim = (paket uzunluğu, bit) R (iletim oranı, bps) = 8kb/pkt 10 9 b/s = 8 μs U gönderici = / R RTT + / R =.008 30.008 = 0.00027 microsec 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 Paketin ilk biti iletildi, t = 0 Paketin son biti iletildi, t = / R gönderici alıcı RTT Paketin ilk biti geldi Paketin son biti geldi, ACK gönder ACK geldi, sonraki paketi gönder, t = RTT + / R U = gönderici / R RTT + / R =.008 30.008 = 0.00027 microsec 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 Paketin ilk biti iletildi, t = 0 Paketin son biti iletildi, t = / R gönderici RTT ACK geldi, sonraki paketi gönder, t = RTT + / R alıcı 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 Kullanım oranı 3 kat arttı U = gönderici 3 * / R RTT + / R =.024 30.008 = 0.0008 microsecon 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 base=1 nextseqnum=1 && corrupt(rcvpkt) 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 notcorrupt(rcvpkt) base = getacknum(rcvpkt)+1 If (base == nextseqnum) stop_timer else start_timer timeout start_timer udt_send(sndpkt[base]) udt_send(sndpkt[base+1]) udt_send(sndpkt[nextseqnum-1]) 30/101 15
GBN: alıcı default expectedseqnum=1 Wait sndpkt = make_pkt(expectedseqnum,ack,chksum) && notcurrupt(rcvpkt) && hasseqnum(rcvpkt,expectedseqnum) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(expectedseqnum,ack,chksum) 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 Gelen paketler buffer a alınır Gerekiyorsa üst katmana sıralanarak gönderilir Gönderici sadece ACK almadığı paketler için retransmit yapar 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 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 alıcı pkt n [rcvbase, rcvbase+n-1] arasında ise 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