Zvinokosha zveReliable Data Transfer

Zvinokosha zveReliable Data Transfer

Kune avo anotsvaka Yakatsaurirwa kunzwisisa network uye maprotocol.

Pfupi

Chinyorwa chinokurukura izvo zvekutanga zveakavimbika data kutapurirana, shandisa mienzaniso pa Go, kusanganisira UDP uye TCP. Maererano ne nguva, два, vatatu uye mabhuku "Computer Networks. Top-Down Approach", kana zvisina kudaro munhu wose ari kukurukura chete Tannenbaum naOliferov.

Transport layer protocol

Inopa kubatana kunonzwisisika pakati pemashandisirwo ekushandisa ari kushanda pane akasiyana mauto. Kubva pamaonero ekushandisa, kubatanidza zvine musoro kunoratidzika senge chiteshi chinobatanidza zvakananga maitiro.

Zvinokosha zveReliable Data Transfer

Transport layer protocol inotsigirwa nemagumo masisitimu, asi kwete netiweki routers (kunze kwe - DPI) Padivi reanotumira, iyo yekufambisa layer inoshandura iyo application layer data yainogamuchira kubva pakutumira application process kuita yekutakura layer mapaketi anonzi zvikamu.

Zvinokosha zveReliable Data Transfer

Izvi zvinoitwa nekutsemura (kana zvichidikanwa) iyo application layer meseji kuita zvidimbu uye nekuwedzera yekutakura layer yemusoro kune yega yega.

Zvinokosha zveReliable Data Transfer

Iyo yekufambisa layer inobva yapfuudza chikamu kune anotumira network layer, uko chikamu chakavharirwa mune network layer packet (datagram) uye inotumirwa. Pakupera kwekugamuchira, iyo network layer inobvisa chikamu chekutakura chekutakura kubva kudhatagram uye kuchipfuudza kusvika kune yekutakura. Tevere, iyo yekufambisa layer inobata chikamu chakagamuchirwa kuitira kuti data rayo riwanikwe kune rinogamuchira application.

Zvinokosha zveReliable Data Transfer

Nheyo dzekutepfenyura data

Yakavimbika data kutapurirana pamusoro yakachengeteka zvachose chiteshi

Nyaya iri nyore. Rutivi rwekutumira runongogashira iyo data kubva kumusoro, inogadzira pakiti ine iyo, uye inotumira kune chiteshi.

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

Mutengi

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

Yakavimbika data kutapurirana pamusoro chiteshi pamwe zvikanganiso zvinogona kuitika

Nhanho inotevera ndeyekufungidzira kuti mapaketi ese anotapurirwa anogamuchirwa muhurongwa hwaakatumirwa, asi zvimedu zviri mazviri zvinogona kushatiswa nekuda kwekuti chiteshi dzimwe nguva chinotumira data nekukanganisa.

Zvinokosha zveReliable Data Transfer

Muchiitiko ichi, nzira dzinotevera dzinoshandiswa:

  • kuona kukanganisa;
  • mhinduro;
  • retransmission.

Mapuroteni akavimbika ekufambisa data ane nzira dzakafanana dzekudzokorora kutapurirana kakawanda anodaidzwa kuti Automatic Repeat reQuest (ARQ) protocol.
Pamusoro pezvo, zvakakosha kufunga nezve mukana wekukanganisa mumarisiti, apo bato rinogamuchira risingazogamuchire chero ruzivo nezve mhedzisiro yekuendeswa kwepaketi yekupedzisira.
Mhinduro yedambudziko iri, inoshandiswawo muTCP, ndeyekuwedzera munda mutsva kune data packet ine nhamba yekutevedzana kwepakiti.

Zvinokosha zveReliable Data Transfer

Yakavimbika kufambiswa kwedata pane isingavimbike chiteshi pasi pekukanganiswa kwepaketi uye kurasikirwa

Pamwe pamwe nekukanganisa, zvinosuruvarisa, kune kurasikirwa kwepakeji mune network.
Uye kugadzirisa dambudziko iri, nzira dzinodiwa:

  • kusarudza chokwadi chekurasikirwa kwepakiti;
  • kuendesazve mapaketi akarasika kune ari kugamuchira bato.

Uyezve, kunze kwekurasikirwa kwepakiti, zvinodikanwa kupa mukana wekurasikirwa kwerisiti kana, kana pasina chakarasika, kuendesa kwayo nekunonoka kukuru. Muzviitiko zvese, chinhu chimwe chete chinoitwa: iyo packet inotumirwazve. Kuti udzore nguva, iyi mechanic inoshandisa countdown timer, iyo inokutendera kuti uone kupera kwekumirira. Saka mune package mambure TCPKeepAlive yakaiswa kumasekonzi gumi nemashanu nekukasira:

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

Rutivi rwekutumira runoda kutanga timer pese parinofambiswa pakiti (zvekutanga nekechipiri), bata zvinovhiringa kubva kune timer woimisa.

Saka, isu tave kujairana neakakosha pfungwa dzeakavimbika data data protocol:

  • checksums;
  • kutevedzana nhamba dzepakeji;
  • timers;
  • maresiti akanaka uye asina kunaka.

Asi handizvo zvoga!

Yakavimbika data yekufambisa protocol ine pipelining

Mumusiyano watakatoona, iyo yakavimbika yekuendesa protocol haina kunyatso shanda. Inotanga "kuderera" kutapurirana kunopiwa nechiteshi chekukurukurirana sezvo RTT inowedzera. Kuwedzera kushanda kwayo uye kushandisa zvirinani chiteshi chekutaurirana, pipelining inoshandiswa.

Zvinokosha zveReliable Data Transfer

Kushandiswa kwepipelining kunotungamirira kune:

  • kuwedzera huwandu hwenhamba dzekutevedzana, sezvo ese akatumirwa mapaketi (kunze kwekudzoreredza) anofanirwa kuzivikanwa zvakasiyana;
  • kukosha kwekuwedzera mabuffers pamativi ekutumira uye ekugamuchira.

Huwandu hwekutevedzana kwehuwandu uye buffer saizi zvinodiwa zvinoenderana nezviito zvinotorwa neprotocol mukupindura huwori hwepakeji, kurasikirwa, uye kunonoka. Panyaya yepipelining, pane nzira mbiri dzekugadzirisa zvikanganiso:

  • dzosera N mapaketi kumashure;
  • kudzokorora kusarudzwa.

Kudzokera N mapaketi - inotsvedza hwindo protocol

Zvinokosha zveReliable Data Transfer

Anotumira anofanira kutsigira marudzi matatu ezviitiko:

  • kufona neprotocol yepamusoro. Kana basa rekutumira data richinzi "kubva kumusoro", rutivi rwekutumira runotanga kutarisa dhigirii rekuzadza kwehwindo (kureva, kuvapo kweN yakatumira mameseji akamirira kugamuchirwa kwemasiti). Kana iyo hwindo isina chinhu, pakiti nyowani inogadzirwa uye inofambiswa, uye iwo akasiyana maitiro anovandudzwa. Zvikasadaro, divi rekutumira rinodzosa data kune yekumusoro layer, uye ichi chiratidzo chakajeka chekuti hwindo rakazara. Kazhinji iyo yekumusoro layer inoedza kufambisa iyo data zvakare mushure menguva yakati. Muchishandiso chaicho, mutumi anogona kunge akanganisa data (panzvimbo yekuitumira nekukasika) kana kuve neyakawiriranisa michina (senge semaphore kana mureza) inobvumira iyo yekumusoro layer kuti ifonere basa rekutumira chete kana hwindo risina chinhu. .
  • kugamuchira simbiso. Muprotocol, yepakiti ine nhamba yekutevedzana N, kubvuma kwese kunopihwa kunoratidza kuti mapaketi ese ane manhamba ekutevedzana anotangira N akagamuchirwa zvinobudirira.
  • nguva yekumirira yapera. Kuti uone chokwadi chekurasikirwa uye kunonoka kwemapakiti uye risiti, iyo protocol inoshandisa timer. Kana nguva yekupedza nguva ikapera, divi rekutumira rinotumirazve ese akatumirwa mapaketi asina kuzivikanwa.

Kudzokorora kusarudzwa

Kana saizi yehwindo uye kuburitsa-kuparidzirwa kunonoka chigadzirwa kwakakura, nhamba huru yemapakiti inogona kunge iri mupombi. Muchiitiko chakadaro, kukanganisa kwepakiti imwe chete kunogona kuita kuti nhamba huru yemapakiti idzoserwe zvakare, mazhinji ayo aisadiwa.

Muenzaniso:

Zvakanakisa theoretical maitiro anounganidzwa mukuita kunoshanda TCP. Uye kana mumwe munhu anoziva nzira yakanakisisa - Mauya.

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

Mutengi

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

mhedziso

Mechanismes ekuona yakavimbika kuendesa data uye kushandiswa

Mechanism
Application, comment

Tarisa huwandu
Inoshandiswa kuona zvikanganiso zvishoma mupaketi inotumirwa

Nguva
Inoverengera pasi nguva yekupera uye inoratidza kana yapera. Iyo yekupedzisira inoreva kuti nehupamhi hwepamusoro hwekugona kwepaketi kana risiti yayo inorasika panguva yekufambisa. Kana pakiti ikaunzwa nekunonoka, asi isina kurasika (kupera nguva isati yakwana yenguva yekupedza nguva), kana risiti yakarasika, kuendesazve kunotungamirira kune yakapetwa pakiti padivi rekugamuchira.

Siriyero nhamba
Inoshandiswa kuita manhamba ekutevedzana kwemapaketi edata anofambiswa kubva kune anotumira kuenda kune anoagamuchira. Magetsi munhamba dzekutevedzana dzemapaketi akagamuchirwa anobvumira mugamuchiri kuti aone kurasikirwa kwepaketi. Idzo nhamba dzepaketi dzekutevedzana dzinoreva kuti mapaketi anodzokororwa ega ega

iko kusimbiswa
Yakagadzirwa nekuguma kwekugamuchira uye ichiratidza kune inotumira kuguma kuti inoenderana pakiti kana boka remapakiti rakagamuchirwa zvinobudirira. Kazhinji chibvumirano chine nhamba dzekutevedzana dzepaketi dzakagamuchirwa zvinobudirira. Zvichienderana neprotocol, kusimbiswa kwemunhu neboka kunosiyaniswa

Negative simbiso
Inoshandiswa nemugamuchiri kuzivisa mutumiri kuti pakiti yakagamuchirwa zvisiri izvo. Kubvuma kusina kunaka kunowanzobatanidza nhamba yekutevedzana kwepakiti isina kugamuchirwa zvakanaka

Hwindo, conveyorization
Deredza huwandu hwenhamba dzenhevedzano dzinogona kushandiswa kutumira mapaketi. Multicast uye kubata maoko kunogona kuwedzera zvakanyanya protocol throughput zvichienzaniswa nekumirira kubvuma. Sezvatichaona, saizi yehwindo inogona kuverengerwa zvichienderana nekugashira uye buffering kugona kweiyo yekupedzisira yekugamuchira, pamwe neiyo network yekuremerwa nhanho.

Mimwe mienzaniso yekushandisa Go for networking

В repositories.

Source: www.habr.com

Voeg