UDP Üzerine Multihoming + RDT (Python)
-
Sayın müridler
Başlıkan anlaşıldığı üzere multi homing olan güvenilir veri transferi gerçekleştirmemiz gerekiyor udp kullanarak.
Mininet ortamında çalışıyoruz. Topoloji şu şekilde
-----s0---s1-----
h1 --| |--h2
-----s2---s3-----
Veriyi iki hat üzerinden de gönderip hızlı bir şekilde karşıya geçmesini sağlamak gerekiyor. Yalnız kafalarına esen bir zamanda s0-s1 arasındaki bağlantıyı kesecekler. Bunu nasıl tespit edebilirim? Çok düşündüm ama bir yol bulamadım. Kesildiğinde sadece alttan devam etmek gerekiyor.
Şuana kadar yaklaşımım şu oldu.
iki tarafta da ikişer tane soket açtım.
h1 den gönderme yapacağım. Hız önemli olduğu için Go-Back-N uygulamayı düşünüyorum.İlk başta,
readable,writeable,error = select(inputSockets,outputSockets,[],timeout)şeklinde o an kim yazabiliyor kim okuyabiliyor alayım ona göre davranayım dedim fakat karşı taraf hiçbir şey göndermese bile timeout olmuyordu. O yüzden
readable,writeable,error = select(inputSockets,outputSockets,[],smalltimeout)
readable2,writeable2,error2 = select(inputSockets,[],[],timeout)
buna çevirdim. Amacım ilkinde yazabilen soketleri almak, ikincide de okunabilen yoksa timeout'a düşmesini sağlamaktı. Fakat bağlantıyı mininette link s0 s1 down yaparak kırsam da writeable listesinde hep iki soket de duruyor. Bunun çalışması gerekirdi ben mi yanlış birşey yaptım? Zaten beklenen buydu derseniz de öneriniz var mı? -
Son olarak aşağıdaki yönteme karar verdim. Tecrübeli arkadaşlar yorum yaparsa sevinirim.
Her iki tarafta da ikişer soket olsun biri üst yol biri alt yol için. Gönderen tarafta her soket için ayrı zaman değişkenleri olsun ve o sokete gelen en son ACK'ın zamanını tutsun. İki taraf için de ayrı Go-Back-N implement edeyim. Dosyanın yarısını biri diğer yarısını diğeri göndersin. Kendi içinde reliable data transfer yapsınlar.Her turda select çağırılacak. Eğer timeout'a düşerse ikisine de ACK gelmemiştir. İkisinden de windowu gönder.
Eğer readable bir tane ise zamanı ölç ve ACK gelmeyenin son ACK zamanı ile karşılaştır. Eğer timeout değerinden büyükse windowu tekrar gönder. Gelen normal devam etsin. Değilse normal devam et. Eğer ikisine de ACK gelmişse time değerlerini yenile normal devam et. Sadece bir tane ACK geldiğinde bu aşağıdakine gelmişse üsttekinin zamanını kontrol et 10*timeout'tan büyük bir fark varsa kopmuştur artık oradan gönderme. Aşağıyı bitir, sonra yukarıda kalanları da aşağıdan gönder.Bu algoritma için düşünceleriniz ne?
-
Mezun olamadiniz gitti. Hadi hayırlı olsun darısı basima :) up diyelim
-
ZoRKaYa bunu yazdı
Mezun olamadiniz gitti. Hadi hayırlı olsun darısı basima :) up diyelim
Oluyoruz inşallah :D Yukarıda anlattığım gibi yaptım. 50 MB dosyayı karşıya attım. md5 ile kontrol ettim. sıkıntı yok.
Darısı senin başına :D -
Udp de zaren datagram oldugundan checksum yoktur ondanda timeout a dusmez normal olarak tcp olsaydi duserdi senin metodlada olur ama arada packet kacirmaman lazim bence 2 sinede es zamanli bas datayi kopan kopsun kopmayan almaya devam edecektir udp te
