Ishonchli ma'lumotlarni uzatish asoslari

Ishonchli ma'lumotlarni uzatish asoslari

Kimlarga izlaydi Tarmoqlar va protokollarni tushunishga bag'ishlangan.

Qisqacha

Maqolada ishonchli ma'lumotlarni uzatish asoslari muhokama qilinadi, misollar amalga oshiriladi Go, shu jumladan UDP va TCP. Asoslangan vaqt, два, uchta va "Kompyuter tarmoqlari. Yuqoridan pastga yondashuv" kitoblari, aks holda hamma faqat Tannenbaum va Oliferovni muhokama qiladi.

Transport qatlami protokoli

Turli xostlarda ishlaydigan dastur jarayonlari o'rtasida mantiqiy aloqani ta'minlaydi. Ilova nuqtai nazaridan mantiqiy ulanish jarayonlarni bevosita bog'laydigan kanalga o'xshaydi.

Ishonchli ma'lumotlarni uzatish asoslari

Transport qatlami protokollari oxirgi tizimlar tomonidan qo'llab-quvvatlanadi, lekin tarmoq marshrutizatorlari tomonidan qo'llab-quvvatlanmaydi (shundan tashqari - DPI). Yuboruvchi tomonda, transport qatlami jo'natuvchi dastur jarayonidan olgan dastur qatlami ma'lumotlarini segmentlar deb ataladigan transport qatlami paketlariga aylantiradi.

Ishonchli ma'lumotlarni uzatish asoslari

Bu amaliy qatlam xabarlarini bo'laklarga bo'lish (agar kerak bo'lsa) va ularning har biriga transport qatlami sarlavhasini qo'shish orqali amalga oshiriladi.

Ishonchli ma'lumotlarni uzatish asoslari

Keyinchalik transport qatlami segmentni jo'natuvchining tarmoq qatlamiga o'tkazadi, u erda segment tarmoq qatlami paketiga (ma'lumotlarga) joylashtiriladi va yuboriladi. Qabul qiluvchi tomonda tarmoq qatlami datagramdan transport qatlami segmentini ajratib oladi va uni transport qatlamiga uzatadi. Keyinchalik, transport qatlami qabul qilingan segmentni qayta ishlaydi, shunda uning ma'lumotlari qabul qiluvchi dastur uchun mavjud bo'ladi.

Ishonchli ma'lumotlarni uzatish asoslari

Ishonchli ma'lumotlarni uzatish tamoyillari

To'liq xavfsiz kanal orqali ishonchli ma'lumotlarni uzatish

Eng oddiy holat. Yuboruvchi tomon shunchaki yuqori qatlamdan ma'lumotlarni oladi, uni o'z ichiga olgan paketni yaratadi va uni kanalga yuboradi.

Server

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 + надежный канал
    }
}

Xaridor

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)
    }
}

Mumkin bo'lgan xatolar bilan kanal orqali ishonchli ma'lumotlarni uzatish

Keyingi qadam, barcha uzatilgan paketlar yuborilgan tartibda qabul qilinishini taxmin qilishdir, ammo kanal ba'zan ma'lumotlarni buzilishlar bilan uzatganligi sababli ulardagi bitlar buzilgan bo'lishi mumkin.

Ishonchli ma'lumotlarni uzatish asoslari

Bunday holda, quyidagi mexanizmlar qo'llaniladi:

  • xatolarni aniqlash;
  • fikr-mulohaza;
  • qayta uzatish.

Bir necha marta takrorlash uchun o'xshash mexanizmlarga ega bo'lgan ishonchli ma'lumotlarni uzatish protokollari Avtomatik takrorlash so'rovi (ARQ) protokollari deb ataladi.
Bundan tashqari, qabul qiluvchi tomon oxirgi paketni o'tkazish natijalari to'g'risida hech qanday ma'lumot olmaganida, kvitantsiyalarda xatolik yuzaga kelishi mumkinligini ko'rib chiqishga arziydi.
TCP-da ham qo'llaniladigan ushbu muammoning echimi ma'lumotlar paketiga paketning tartib raqamini o'z ichiga olgan yangi maydon qo'shishdir.

Ishonchli ma'lumotlarni uzatish asoslari

Paket buzilishi va yo'qolishi mumkin bo'lgan ishonchsiz kanal orqali ishonchli ma'lumotlarni uzatish

Buzilish bilan birga, afsuski, tarmoqda paket yo'qolishi mavjud.
Va bu muammoni hal qilish uchun mexanizmlar talab qilinadi:

  • paketni yo'qotish faktini aniqlash;
  • yo'qolgan paketlarni qabul qiluvchi tomonga qayta yetkazib berish.

Bundan tashqari, paketning yo'qolishiga qo'shimcha ravishda, kvitansiyani yo'qotish yoki hech narsa yo'qolmasa, uni sezilarli kechikish bilan etkazib berish imkoniyatini ta'minlash kerak. Barcha holatlarda xuddi shu narsa amalga oshiriladi: paket qayta uzatiladi. Vaqtni nazorat qilish uchun ushbu mexanizm kutish oralig'ining oxirini aniqlash imkonini beruvchi ortga hisoblash taymeridan foydalanadi. Shunday qilib, paketda to'r TCPKeepAlive sukut bo'yicha 15 soniyaga o'rnatiladi:

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

Yuboruvchi tomon har safar paket uzatilganda (birinchi va ikkinchi marta) taymerni ishga tushirishi, taymerdagi uzilishlarni hal qilishi va uni to'xtatishi kerak.

Shunday qilib, biz ishonchli ma'lumotlarni uzatish protokollarining asosiy tushunchalari bilan tanishdik:

  • nazorat summalari;
  • paketlarning tartib raqamlari;
  • taymerlar;
  • ijobiy va salbiy tushumlar.

Lekin bu hammasi emas!

Quvur liniyasi bilan ishonchli ma'lumotlarni uzatish protokoli

Biz allaqachon ko'rib chiqqan variantda ishonchli etkazib berish protokoli juda samarasiz. RTT ortishi bilan aloqa kanali tomonidan taqdim etilgan uzatishni "sekinlashtira" boshlaydi. Uning samaradorligini oshirish va aloqa kanali sig'imidan yaxshiroq foydalanish uchun quvur liniyasi qo'llaniladi.

Ishonchli ma'lumotlarni uzatish asoslari

Quvurlardan foydalanish quyidagilarga olib keladi:

  • ketma-ketlik raqamlari diapazonini ko'paytirish, chunki barcha yuborilgan paketlar (qayta uzatishdan tashqari) yagona aniqlanishi kerak;
  • uzatuvchi va qabul qiluvchi tomonlarda buferlarni ko'paytirish zarurati.

Tartib raqamlari diapazoni va bufer o'lchamiga bo'lgan talablar protokolning paket buzilishi, yo'qolishi va kechikishiga javoban bajaradigan harakatlariga bog'liq. Quvurlarni o'tkazishda xatolarni tuzatishning ikkita usuli mavjud:

  • N paketni qaytarib berish;
  • tanlab takrorlash.

Orqaga qaytish N paketlar - toymasin oyna protokoli

Ishonchli ma'lumotlarni uzatish asoslari

Yuboruvchi uch turdagi hodisani qo'llab-quvvatlashi kerak:

  • yuqori darajadagi protokol orqali qo'ng'iroq qilish. Ma'lumotni jo'natish funktsiyasi "yuqoridan" deb atalganda, jo'natuvchi tomon birinchi navbatda oynani to'ldirish darajasini tekshiradi (ya'ni, kvitansiyalarni olishni kutayotgan N yuborilgan xabarlarning mavjudligi). Agar oyna bo'sh bo'lsa, yangi paket yaratiladi va uzatiladi va o'zgaruvchan qiymatlar yangilanadi. Aks holda, jo'natuvchi tomon ma'lumotlarni yuqori qatlamga qaytaradi va bu oyna to'lganligining yashirin belgisidir. Odatda yuqori qatlam ma'lumotni bir muncha vaqt o'tgach yana uzatishga harakat qiladi. Haqiqiy dasturda jo'natuvchi ma'lumotlarni buferlashi mumkin (uni darhol jo'natish o'rniga) yoki sinxronizatsiya mexanizmiga (semafor yoki bayroq kabi) ega bo'lishi mumkin, bu esa yuqori qatlamga yuborish funksiyasini faqat oyna bo'sh bo'lganda chaqirishga imkon beradi. .
  • tasdiqlashni qabul qilish. Protokolda N ketma-ketlik raqami bo'lgan paket uchun N dan oldin ketma-ketlik raqamlari bo'lgan barcha paketlar muvaffaqiyatli qabul qilinganligini ko'rsatadigan umumiy tasdiq beriladi.
  • kutish oralig'i tugadi. Paketlar va tushumlarning yo'qolishi va kechikish faktlarini aniqlash uchun protokol taymerdan foydalanadi. Vaqt tugashi oralig'i tugasa, jo'natuvchi tomon barcha yuborilgan tasdiqlanmagan paketlarni qayta yuboradi.

Tanlangan takrorlash

Deraza o'lchami va o'tkazish qobiliyatining tarqalishini kechiktirish mahsuloti katta bo'lsa, ko'p sonli paketlar quvur liniyasida bo'lishi mumkin. Bunday holatda, bitta paket xatosi ko'p sonli paketlarni qayta uzatishga olib kelishi mumkin, ularning aksariyati talab qilinmaydi.

misol

Eng yaxshisi nazariy amaliy amalga oshirishda amaliyotlar to'planadi TCP. Va agar kimdir eng yaxshi bilsa - xush kelibsiz.

Server

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"))
    }
}

Xaridor

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)
    }
}

xulosa

Ishonchli ma'lumotlarni uzatish va ulardan foydalanishni ta'minlash mexanizmlari

mexanizm
Ilova, sharh

Tekshirish summasi
Uzatilgan paketdagi bit xatolarini aniqlash uchun foydalaniladi

Taymer
Vaqt tugashi oralig'ini hisoblab chiqadi va uning qachon tugaganligini ko'rsatadi. Ikkinchisi, uzatish paytida paket yoki uning kvitansiyasi katta ehtimollik bilan yo'qolishini anglatadi. Agar paket kechikish bilan yetkazib berilsa, lekin yo'qolmasa (tavt oralig'i muddatidan oldin tugashi) yoki kvitansiya yo'qolsa, qayta uzatish qabul qiluvchi tomonda dublikat paketga olib keladi.

Tartib raqam
Yuboruvchidan qabul qiluvchiga uzatiladigan ma'lumotlar paketlarini ketma-ket raqamlash uchun ishlatiladi. Qabul qilingan paketlarning tartib raqamlaridagi bo'shliqlar qabul qiluvchiga paketlarning yo'qolishini aniqlash imkonini beradi. Paketlarning bir xil tartib raqamlari paketlar bir-birining dublikati ekanligini bildiradi

Tasdiqlash
Qabul qiluvchi tomon tomonidan yaratilgan va jo'natuvchi tomon tegishli paket yoki paketlar guruhi muvaffaqiyatli qabul qilinganligini bildiradi. Odatda tasdiq muvaffaqiyatli qabul qilingan paketlarning tartib raqamlarini o'z ichiga oladi. Protokolga qarab, individual va guruh tasdiqlashlari farqlanadi

Salbiy tasdiqlash
Qabul qiluvchi tomonidan jo'natuvchiga paket noto'g'ri olinganligi haqida xabar berish uchun foydalaniladi. Salbiy tasdiq odatda to'g'ri qabul qilinmagan paketning tartib raqamini o'z ichiga oladi

Deraza, konveyerizatsiya
Paketlarni uzatish uchun ishlatilishi mumkin bo'lgan tartib raqamlari oralig'ini cheklang. Ko‘p tarmoqqa uzatish va qo‘l siqish, tasdiqlashni kutish bilan solishtirganda protokol o‘tkazuvchanligini sezilarli darajada oshirishi mumkin. Ko'rib turganimizdek, oyna o'lchamini qabul qiluvchi tomonning qabul qilish va buferlash imkoniyatlari, shuningdek tarmoq yuklash darajasi asosida hisoblash mumkin.

Tarmoq uchun Go dan foydalanishning boshqa misollari

В omborlar.

Manba: www.habr.com

a Izoh qo'shish