Güvenilir Veri Aktarımının Temelleri

Güvenilir Veri Aktarımının Temelleri

olanlara arıyor Ağları ve protokolleri anlamaya adanmıştır.

kısaca

Makale güvenilir veri aktarımının temellerini tartışıyor, örnekler uyguluyor GoUDP ve TCP dahil. Dayalı zaman, iki, üç ve "Bilgisayar Ağları. Yukarıdan Aşağıya Yaklaşım" kitapları, aksi takdirde herkes yalnızca Tannenbaum ve Oliferov'u tartışıyor.

Taşıma katmanı protokolü

Farklı ana bilgisayarlarda çalışan uygulama işlemleri arasında mantıksal bir bağlantı sağlar. Uygulama açısından bakıldığında mantıksal bir bağlantı, süreçleri doğrudan birbirine bağlayan bir kanala benzer.

Güvenilir Veri Aktarımının Temelleri

Taşıma katmanı protokolleri uç sistemler tarafından desteklenir ancak ağ yönlendiricileri tarafından desteklenmez (hariç - DPI). Gönderici tarafında, taşıma katmanı, gönderen uygulama sürecinden aldığı uygulama katmanı verilerini, segment adı verilen taşıma katmanı paketlerine dönüştürür.

Güvenilir Veri Aktarımının Temelleri

Bu, uygulama katmanı mesajlarını parçalara bölerek (gerekirse) ve her birine bir taşıma katmanı başlığı ekleyerek yapılır.

Güvenilir Veri Aktarımının Temelleri

Taşıma katmanı daha sonra segmenti gönderenin ağ katmanına geçirir, burada segment bir ağ katmanı paketi (datagram) içinde kapsüllenir ve gönderilir. Alıcı uçta ağ katmanı, taşıma katmanı segmentini datagramdan çıkarır ve bunu taşıma katmanına iletir. Daha sonra taşıma katmanı, alınan segmenti işleyerek verilerinin alıcı uygulama tarafından kullanılabilir olmasını sağlar.

Güvenilir Veri Aktarımının Temelleri

Güvenilir veri iletiminin ilkeleri

Tamamen güvenli bir kanal üzerinden güvenilir veri iletimi

En basit durum. Gönderen taraf basitçe üst katmandan veriyi alır, onu içeren bir paket oluşturur ve bunu kanala gönderir.

Sunucu

package main

import (
    "log"
    "net"
)

func main() {
    // IP-адрес сервера и порт
    serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
    if err != nil {
        log.Fatal(err)
    }

    // создаем сокет с портом
    serverConn, err := net.ListenUDP("udp", serverAddr)
    if err != nil {
        log.Fatal(err)
    }
    // отложенное закрытие соединения
    defer serverConn.Close()

    // создаем буфер для данных
    buf := make([]byte, 1024)

    // ждем соединение
    for {
        // читаем запрос
        n, addr, err := serverConn.ReadFromUDP(buf)
        // передаем данные в ВЕРХНИЙ уровень: в нашем случае stdout
        println(string(buf[0:n]), " form ", addr.IP.String())
        if err != nil {
            log.Fatal(err)
        }
        // ответа нет, т.к. это UDP + надежный канал
    }
}

Müşteri

package main

import (
    "fmt"
    "log"
    "net"
    "time"
)

func main() {
    // IP-адрес сервера и порт
    serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
    if err != nil {
        log.Fatal(err)
    }
    // локальный IP-адрес и порт
    localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
    if err != nil {
        log.Fatal(err)
    }
    // установка соединения
    conn, err := net.DialUDP("udp", localAddr, serverAddr)
    if err != nil {
        log.Fatal(err)
    }
    // отложенное закрытие соединения
    defer conn.Close()

    for {
        // получение данных от ВЕРХНЕГО уровня
        fmt.Print("Введите строчное предложение > ")
        var msg string
        _, err := fmt.Scanf("%s", &msg)
        if err != nil {
            log.Fatal(err)
        }
        // передается поток байт, а не строка
        buf := []byte(msg)
        // запись (передача) в соединение
        _, err = conn.Write(buf)
        if err != nil {
            log.Fatal(err)
        }
        // 1 секундочку
        time.Sleep(time.Second * 1)
    }
}

Olası hatalarla bir kanal üzerinden güvenilir veri iletimi

Bir sonraki adım, iletilen tüm paketlerin gönderildikleri sırayla alındığını varsaymaktır, ancak kanalın bazen verileri çarpık olarak iletmesi nedeniyle içlerindeki bitler bozulmuş olabilir.

Güvenilir Veri Aktarımının Temelleri

Bu durumda aşağıdaki mekanizmalar kullanılır:

  • hata tespiti;
  • geri bildirim;
  • yeniden iletim.

İletimi birden çok kez tekrarlamak için benzer mekanizmalara sahip güvenilir veri aktarım protokollerine Otomatik Tekrarlama İsteği (ARQ) protokolleri adı verilir.
Ek olarak, alıcı tarafın son paketin aktarımının sonuçları hakkında herhangi bir bilgi alamayacağı durumlarda, makbuzlarda hata olasılığını dikkate almakta fayda vardır.
TCP'de de kullanılan bu sorunun çözümü veri paketine paketin sıra numarasını içeren yeni bir alan eklemektir.

Güvenilir Veri Aktarımının Temelleri

Paket bozulmasına ve kaybına bağlı olarak güvenilmez bir kanal üzerinden güvenilir veri iletimi

Distorsiyonun yanı sıra maalesef ağda paket kaybı da yaşanıyor.
Ve bu sorunu çözmek için mekanizmalar gereklidir:

  • paket kaybı gerçeğinin belirlenmesi;
  • Kayıp paketlerin alıcı tarafa yeniden teslim edilmesi.

Ek olarak, paketin kaybolmasına ek olarak, makbuzun kaybolması veya hiçbir şeyin kaybolmaması durumunda teslimatın önemli bir gecikmeyle teslim edilmesi olasılığının da sağlanması gerekir. Her durumda aynı şey yapılır: paket yeniden iletilir. Bu mekanizma, zamanı kontrol etmek için, bekleme aralığının sonunu belirlemenize olanak tanıyan bir geri sayım sayacı kullanır. Yani pakette net TCPKeepAlive varsayılan olarak 15 saniyeye ayarlıdır:

// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
    defaultTCPKeepAlive = 15 * time.Second
)

Gönderen tarafın, bir paket her iletildiğinde (hem birinci hem de ikinci kez) bir zamanlayıcı başlatması, zamanlayıcıdan gelen kesintileri ele alması ve onu durdurması gerekir.

Böylece güvenilir veri aktarım protokollerinin temel kavramlarına aşina olduk:

  • sağlama toplamları;
  • paketlerin sıra numaraları;
  • zamanlayıcılar;
  • olumlu ve olumsuz girişler.

Ama hepsi bu değil!

Ardışık düzen ile güvenilir veri aktarım protokolü

Daha önce ele aldığımız varyantta güvenilir dağıtım protokolü oldukça verimsizdir. RTT arttıkça iletişim kanalının sağladığı iletimi "yavaşlatmaya" başlar. Verimliliğini artırmak ve iletişim kanalı kapasitesini daha iyi kullanmak için boru hattı kullanılır.

Güvenilir Veri Aktarımının Temelleri

Boru hattı kullanımı şunlara yol açar:

  • gönderilen tüm paketlerin (yeniden iletimler hariç) benzersiz bir şekilde tanımlanması gerektiğinden sıra numaraları aralığının arttırılması;
  • verici ve alıcı taraflardaki tamponların arttırılması ihtiyacı.

Sıra numarası aralığı ve arabellek boyutu gereksinimleri, protokolün paket bozulmasına, kaybına ve gecikmesine yanıt olarak gerçekleştirdiği eylemlere bağlıdır. Pipelining durumunda hataları düzeltmek için iki yöntem vardır:

  • N paketini geri döndür;
  • seçici tekrar

N paketlerine geri dönme - kayan pencere protokolü

Güvenilir Veri Aktarımının Temelleri

Gönderenin üç tür olayı desteklemesi gerekir:

  • daha yüksek seviyeli bir protokolle çağrı yapın. Veri gönderme işlevi "yukarıdan" çağrıldığında, gönderen taraf ilk önce pencerenin doluluk derecesini (yani, alındıların alınmasını bekleyen N adet gönderilmiş mesajın varlığını) kontrol eder. Pencere boşsa yeni bir paket oluşturulup iletilir ve değişken değerleri güncellenir. Aksi takdirde gönderen taraf verileri üst katmana döndürür ve bu, pencerenin dolu olduğunun örtülü bir göstergesidir. Tipik olarak üst katman bir süre sonra verileri tekrar iletmeye çalışacaktır. Gerçek bir uygulamada, gönderen muhtemelen verileri ya arabelleğe alır (hemen göndermek yerine) ya da üst katmanın gönderme işlevini yalnızca pencere boş olduğunda çağırmasına izin verecek bir senkronizasyon mekanizmasına (semafor veya bayrak gibi) sahiptir. .
  • onay alıyor. Protokolde sıra numarası N olan bir paket için, sıra numarası N'den önce gelen tüm paketlerin başarıyla alındığını belirten genel bir onay verilir.
  • bekleme aralığı sona erdi. Paketlerin ve alımların kayıpları ve gecikmeleriyle ilgili gerçekleri belirlemek için protokol bir zamanlayıcı kullanır. Zaman aşımı süresi dolarsa, gönderen taraf gönderilen tüm onaylanmamış paketleri yeniden gönderir.

Seçici tekrar

Pencere boyutu ve üretim-yayılım gecikme çarpımı büyük olduğunda, çok sayıda paket satış hattında olabilir. Böyle bir durumda tek bir paket hatası, çoğu gerekli olmayan çok sayıda paketin yeniden iletilmesine neden olabilir.

Örnek

Üst teorik uygulamalar pratik uygulamada toplanır TCP. Ve eğer birisi bunun en iyisini biliyorsa - karşılama.

Sunucu

package main

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "strings"
)

func main() {
    // создаем сокет с портом 
    ln, err := net.Listen("tcp", ":8081")
    if err != nil {
        log.Fatalln(err)
    }
    // ожидание вызова
    conn, _ := ln.Accept()

    for {
        // считывание данных
        msg, err := bufio.NewReader(conn).ReadString('n')
        if err != nil {
            log.Fatalln(err)
        }
        // вывод сообщения в stdout
        fmt.Print("Message Received:", string(msg))
        // перевод строки в верхний регистр
        newMsg := strings.ToUpper(msg)
        // отправка данных
        conn.Write([]byte(newMsg + "n"))
    }
}

Müşteri

package main

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "os"
)

func main() {
    // установка соединения
    conn, err := net.Dial("tcp", "127.0.0.1:8081")
    if err != nil {
        log.Fatalln(err)
    }

    for {
        // считывание данных с stdin
        reader := bufio.NewReader(os.Stdin)
        fmt.Print("Text to send: ")
        // построчно
        text, err := reader.ReadString('n')
        if err != nil {
            log.Fatalln(err)
        }
        // отправка
        fmt.Fprintf(conn, text+"n")
        // прием
        msg, err := bufio.NewReader(conn).ReadString('n')
        if err != nil {
            log.Fatalln(err)
        }
        // вывод полученного ответа
        fmt.Print("Msg from Server: " + msg)
    }
}

Aviator apk

Güvenilir veri aktarımı ve kullanımını sağlayacak mekanizmalar

Mekanizma
Başvuru, yorum

Toplamı kontrol et
İletilen paketteki bit hatalarını tespit etmek için kullanılır

Zamanlayıcı
Zaman aşımı aralığını geri sayar ve sürenin dolduğunu gösterir. İkincisi, yüksek olasılıkla paketin veya alınmasının iletim sırasında kaybolması anlamına gelir. Bir paket gecikmeli olarak teslim edilir ancak kaybolmazsa (zaman aşımı aralığının erken sona ermesi) veya bir alındı ​​bilgisi kaybolursa, yeniden iletim, alıcı tarafta paketin kopyalanmasına neden olur

Seri numarası
Göndericiden alıcıya iletilen veri paketlerinin sıralı numaralandırılması için kullanılır. Alınan paketlerin sıra numaralarındaki boşluklar, alıcının paket kaybını tespit etmesine olanak tanır. Aynı paket sıra numaraları, paketlerin birbirinin kopyası olduğu anlamına gelir

Onay
Alıcı uç tarafından oluşturulur ve gönderen uca karşılık gelen paketin veya paket grubunun başarıyla alındığını belirtir. Tipik olarak onay, başarıyla alınan paketlerin sıra numaralarını içerir. Protokole bağlı olarak bireysel ve grup onayları ayırt edilir

Olumsuz onay
Alıcı tarafından göndericiye paketin yanlış alındığını bildirmek için kullanılır. Olumsuz bir alındı ​​bildirimi genellikle doğru şekilde alınmayan paketin sıra numarasını içerir.

Pencere, konveyörizasyon
Paketleri iletmek için kullanılabilecek sıra numarası aralığını sınırlayın. Çok noktaya yayın ve el sıkışma, onay beklemeye kıyasla protokol verimini önemli ölçüde artırabilir. Göreceğimiz gibi, pencere boyutu, alıcı ucun alım ve ara belleğe alma özelliklerinin yanı sıra ağ yük seviyesine göre hesaplanabilir.

Ağ oluşturmak için Go kullanımına ilişkin daha fazla örnek

В depolar.

Kaynak: habr.com

Yorum ekle