Fundamenti ta' Trasferiment ta' Data Affidabbli

Fundamenti ta' Trasferiment ta' Data Affidabbli

Lil dawk li ifittex Iddedikat għall-fehim tan-netwerks u l-protokolli.

In breve

L-artikolu jiddiskuti l-baŜi ta 'trasmissjoni ta' data affidabbli, jimplimenta eżempji fuq Go, inklużi UDP u TCP. Ibbażat fuq ħin, два, 3 u l-kotba "Netwerks tal-Kompjuter. Approċċ Top-Down", inkella kulħadd qed jiddiskuti biss Tannenbaum u Oliferov.

Protokoll tas-saff tat-trasport

Jipprovdi konnessjoni loġika bejn proċessi ta 'applikazzjoni li jaħdmu fuq hosts differenti. Mill-perspettiva tal-applikazzjoni, konnessjoni loġika tidher qisha kanal li jgħaqqad direttament il-proċessi.

Fundamenti ta' Trasferiment ta' Data Affidabbli

Protokolli tas-saff tat-trasport huma appoġġjati minn sistemi finali, iżda mhux minn routers tan-netwerk (ħlief - DPI). Min-naħa tal-mittent, is-saff tat-trasport jikkonverti d-dejta tas-saff tal-applikazzjoni li jirċievi mill-proċess tal-applikazzjoni li jibgħat f'pakketti tas-saff tat-trasport imsejħa segmenti.

Fundamenti ta' Trasferiment ta' Data Affidabbli

Dan isir billi taqsam (jekk meħtieġ) il-messaġġi tas-saff tal-applikazzjoni fi frammenti u żżid header tas-saff tat-trasport għal kull wieħed minnhom.

Fundamenti ta' Trasferiment ta' Data Affidabbli

Is-saff tat-trasport imbagħad jgħaddi s-segment lis-saff tan-netwerk tal-mittent, fejn is-segment jiġi inkapsulat f'pakkett tas-saff tan-netwerk (datagramma) u jintbagħat. Fit-tarf li jirċievi, is-saff tan-netwerk jiġbed is-segment tas-saff tat-trasport mid-datagramma u jgħaddih sas-saff tat-trasport. Sussegwentement, is-saff tat-trasport jipproċessa s-segment riċevut sabiex id-dejta tiegħu ssir disponibbli għall-applikazzjoni li tirċievi.

Fundamenti ta' Trasferiment ta' Data Affidabbli

Prinċipji ta' trażmissjoni ta' data affidabbli

Trażmissjoni ta 'data affidabbli fuq kanal kompletament sigur

L-aktar każ sempliċi. In-naħa li tibgħat sempliċement tirċievi d-dejta mis-saff ta 'fuq, toħloq pakkett li jkun fih, u tibgħatha lill-kanal.

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

Klijent

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

Trażmissjoni ta' dejta affidabbli fuq kanal bi żbalji possibbli

Il-pass li jmiss huwa li wieħed jassumi li l-pakketti trażmessi kollha jiġu riċevuti fl-ordni li fiha ntbagħtu, iżda l-bits fihom jistgħu jkunu korrotti minħabba l-fatt li l-kanal kultant jittrasmetti data b'distorsjonijiet.

Fundamenti ta' Trasferiment ta' Data Affidabbli

F'dan il-każ, jintużaw il-mekkaniżmi li ġejjin:

  • sejbien ta' żbalji;
  • feedback;
  • trażmissjoni mill-ġdid.

Protokolli affidabbli għat-trasferiment tad-dejta li għandhom mekkaniżmi simili għar-repetizzjoni tat-trażmissjoni diversi drabi jissejħu protokolli Awtomatiċi tar-Ripetizzjoni tar-Ripetizzjoni (ARQ).
Barra minn hekk, ta 'min jikkunsidra l-possibbiltà ta' żbalji fl-irċevuti, meta l-parti li tirċievi ma tirċievi l-ebda informazzjoni dwar ir-riżultati tat-trasferiment tal-aħħar pakkett.
Is-soluzzjoni għal din il-problema, użata wkoll fit-TCP, hija li żżid qasam ġdid mal-pakkett tad-dejta li jkun fih in-numru tas-sekwenza tal-pakkett.

Fundamenti ta' Trasferiment ta' Data Affidabbli

Trażmissjoni ta' dejta affidabbli fuq kanal mhux affidabbli soġġett għal distorsjoni u telf ta' pakkett

Flimkien mad-distorsjoni, sfortunatament, hemm telf ta 'pakketti fin-netwerk.
U biex issolvi din il-problema, huma meħtieġa mekkaniżmi:

  • id-determinazzjoni tal-fatt tat-telf tal-pakkett;
  • kunsinna mill-ġdid ta' pakketti mitlufa lill-parti li tirċievi.

Barra minn hekk, minbarra t-telf tal-pakkett, huwa meħtieġ li tiġi pprovduta l-possibbiltà ta 'telf tal-irċevuta jew, jekk xejn ma jintilef, il-kunsinna tagħha b'dewmien sinifikanti. Fil-każijiet kollha, l-istess ħaġa ssir: il-pakkett jiġi trażmess mill-ġdid. Biex jikkontrolla l-ħin, dan il-mekkaniżmu juża timer tal-countdown, li jippermettilek tiddetermina t-tmiem tal-intervall ta 'stennija. Allura fil-pakkett nett TPCKeepAlive huwa ssettjat għal 15-il sekonda b'mod awtomatiku:

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

In-naħa li tibgħat jeħtieġ li tibda tajmer kull darba li jiġi trażmess pakkett (kemm l-ewwel kif ukoll it-tieni darba), jimmaniġġja l-interruzzjonijiet mit-tajmer u jwaqqafha.

Allura, sirna familjari mal-kunċetti ewlenin ta 'protokolli ta' trasferiment ta 'dejta affidabbli:

  • checksums;
  • numri ta' sekwenza ta' pakketti;
  • tajmers;
  • irċevuti pożittivi u negattivi.

Imma dan mhux kollox!

Protokoll ta 'trasferiment ta' data affidabbli b'pipelining

Fil-varjant li diġà kkunsidrajna, il-protokoll ta 'kunsinna affidabbli huwa ineffiċjenti ħafna. Jibda "jnaqqas" it-trażmissjoni pprovduta mill-kanal ta 'komunikazzjoni hekk kif l-RTT tiżdied. Biex tiżdied l-effiċjenza tagħha u tutilizza aħjar il-kapaċità tal-kanal ta 'komunikazzjoni, jintuża pipelining.

Fundamenti ta' Trasferiment ta' Data Affidabbli

L-użu tal-pipelining iwassal għal:

  • tiżdied il-firxa ta 'numri ta' sekwenza, peress li l-pakketti kollha mibgħuta (ħlief għal ritrażmissjonijiet) għandhom ikunu identifikati b'mod uniku;
  • il-ħtieġa li jiżdiedu l-buffers fuq in-naħat li jittrasmettu u li jirċievu.

Il-firxa tan-numru tas-sekwenza u r-rekwiżiti tad-daqs tal-buffer jiddependu fuq l-azzjonijiet li jieħu l-protokoll b'reazzjoni għall-korruzzjoni, it-telf u d-dewmien tal-pakketti. Fil-każ tal-pipelining, hemm żewġ metodi biex jiġu kkoreġuti l-iżbalji:

  • lura N pakketti lura;
  • ripetizzjoni selettiva.

Tmur lura N pakketti - protokoll ta 'tieqa li tiżżerżaq

Fundamenti ta' Trasferiment ta' Data Affidabbli

Min jibgħat għandu jappoġġa tliet tipi ta’ avvenimenti:

  • sejħa permezz ta’ protokoll ta’ livell ogħla. Meta l-funzjoni li tibgħat id-dejta tissejjaħ "minn fuq", in-naħa li tibgħat l-ewwel tiċċekkja l-grad ta 'mili tat-tieqa (jiġifieri, il-preżenza ta' N mibgħuta messaġġi li qed jistennew irċevuti). Jekk it-tieqa tkun vojta, jiġi ġġenerat u trażmess pakkett ġdid, u l-valuri varjabbli jiġu aġġornati. Inkella, in-naħa li tibgħat lura d-dejta lis-saff ta 'fuq, u din hija indikazzjoni impliċita li t-tieqa hija mimlija. Tipikament is-saff ta 'fuq se jipprova jittrasmetti d-data mill-ġdid wara xi żmien. F'applikazzjoni reali, il-mittent x'aktarx jew jibferja d-data (minflok jibgħatha immedjatament) jew ikollu mekkaniżmu ta' sinkronizzazzjoni (bħal semaforu jew bandiera) li jippermetti lis-saff ta 'fuq isejjaħ il-funzjoni li tibgħat biss meta t-tieqa tkun vojta. .
  • jirċievi konferma. Fil-protokoll, għal pakkett bin-numru ta 'sekwenza N, tinħareġ rikonoxximent ġenerali li jindika li l-pakketti kollha bin-numri ta' sekwenza ta 'qabel N ġew riċevuti b'suċċess.
  • l-intervall ta' stennija jkun skada. Biex tiddetermina l-fatti ta 'telf u dewmien ta' pakketti u rċevuti, il-protokoll juża tajmer. Jekk jiskadi l-intervall tal-timeout, in-naħa li tibgħat mill-ġdid il-pakketti kollha mibgħuta mhux rikonoxxuti.

Ripetizzjoni selettiva

Meta d-daqs tat-tieqa u l-prodott tad-dewmien tal-propagazzjoni tal-produzzjoni jkunu kbar, jista 'jkun hemm numru kbir ta' pakketti fil-pipeline. F'każ bħal dan, żball ta' pakkett wieħed jista' jikkawża li numru kbir ta' pakketti jiġu trażmessi mill-ġdid, li ħafna minnhom ma kinux meħtieġa.

Eżempju

L-aqwa teoretiku prattiki jinġabru fl-implimentazzjoni prattika TCP. U jekk xi ħadd jaf kif l-aħjar - merħba.

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

Klijent

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

Output

Mekkaniżmi li jiżguraw trasferiment u użu affidabbli tad-dejta

Mekkaniżmu
Applikazzjoni, kumment

Iċċekkja s-somma
Użat biex jinstabu żbalji tal-bit f'pakkett trażmess

Timer
Jgħodd l-intervall tal-timeout u jindika meta jkun skada. Dan tal-aħħar ifisser li bi grad għoli ta’ probabbiltà l-pakkett jew ir-riċevuta tiegħu jintilef waqt it-trażmissjoni. Jekk pakkett jitwassal b'dewmien, iżda ma jintilifx (skadenza prematura tal-intervall ta' timeout), jew irċevuta tintilef, it-trażmissjoni mill-ġdid twassal għal pakkett duplikat fuq in-naħa li tirċievi

Numru tas-serje
Użat għan-numerazzjoni sekwenzjali tal-pakketti tad-dejta trażmessi minn min jibgħat lir-riċevitur. Il-lakuni fin-numri tas-sekwenza tal-pakketti riċevuti jippermettu lir-riċevitur jikxef it-telf tal-pakketti. L-istess numri tas-sekwenza tal-pakketti jfissru li l-pakketti huma duplikati ta 'xulxin

Konferma
Ġenerat mit-tarf li jirċievi u li jindika lit-tarf li jibgħat li l-pakkett korrispondenti jew grupp ta 'pakketti ġie riċevut b'suċċess. Tipikament ir-rikonoxximent ikun fih in-numri tas-sekwenza ta' pakketti riċevuti b'suċċess. Skont il-protokoll, il-konfermi individwali u tal-grupp huma distinti

Konferma negattiva
Użat mir-riċevitur biex jinforma lill-mittent li l-pakkett ġie riċevut ħażin. Rikonoxximent negattiv normalment jinkludi n-numru tas-sekwenza tal-pakkett li ma ġiex riċevut b'mod korrett

Tieqa, conveyorization
Illimita l-firxa ta 'numri ta' sekwenza li jistgħu jintużaw biex jittrasmettu pakketti. Il-multicast u l-handshake jistgħu jżidu b'mod sinifikanti l-produzzjoni tal-protokoll meta mqabbla mal-istennija għal rikonoxximenti. Kif se naraw, id-daqs tat-tieqa jista 'jiġi kkalkulat abbażi tal-kapaċitajiet ta' riċeviment u buffering tat-tarf li jirċievi, kif ukoll il-livell tat-tagħbija tan-netwerk.

Aktar eżempji ta 'użu ta' Go għan-netwerking

В repożitorji.

Sors: www.habr.com

Żid kumment