Zofunikira pakusamutsa kwa data kodalirika

Zofunikira pakusamutsa kwa data kodalirika

Kwa iwo amene amafunafuna Odzipereka kuti amvetsetse ma network ndi ma protocol.

Mwachidule

Nkhaniyi ikufotokoza zofunikira za kutumiza deta yodalirika, imagwiritsa ntchito zitsanzo pa Go, kuphatikiza UDP ndi TCP. Kutengera nthawi, два, atatu ndi mabuku "Computer Networks. Top-Down Approach", mwinamwake aliyense akukambirana za Tannenbaum ndi Oliferov okha.

Transport layer protocol

Amapereka mgwirizano womveka pakati pa njira zogwiritsira ntchito zomwe zikuyenda pa makamu osiyanasiyana. Kuchokera pamawonedwe ogwiritsira ntchito, kulumikizana koyenera kumawoneka ngati njira yomwe imalumikiza mwachindunji njira.

Zofunikira pakusamutsa kwa data kodalirika

Transport layer protocol amathandizidwa ndi machitidwe omaliza, koma osati ndi ma routers (kupatula - DPI). Kumbali yotumiza, gawo la zoyendera limasintha zomwe amapeza kuchokera pakutumiza zotumizira kukhala mapaketi osanjikiza otchedwa magawo.

Zofunikira pakusamutsa kwa data kodalirika

Izi zimachitika pogawanitsa (ngati kuli kofunikira) mauthenga osanjikiza a pulogalamuyo kukhala tizidutswa ndikuwonjezera mutu wamtundu wa zoyendera kwa aliyense wa iwo.

Zofunikira pakusamutsa kwa data kodalirika

Gawo lazoyendetsa limadutsa gawolo kupita ku netiweki ya wotumiza, pomwe gawolo limayikidwa mu paketi ya netiweki (datagram) ndikutumizidwa. Pamapeto olandirira, gawo la netiweki limachotsa gawo lazotengera kuchokera ku datagram ndikulipititsa kumalo oyendetsa. Kenako, gawo la zoyendera limayang'anira gawo lolandilidwa kuti deta yake ipezeke ku pulogalamu yolandila.

Zofunikira pakusamutsa kwa data kodalirika

Mfundo zodalirika zotumizira deta

Kutumiza kwa data kodalirika panjira yotetezedwa kwathunthu

Mlandu wosavuta. Mbali yotumiza imangolandira deta kuchokera kumtunda wapamwamba, imapanga paketi yomwe ili nayo, ndikuyitumiza ku njira.

Seva

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

Makasitomala

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

Kutumiza kwa data kodalirika panjira yokhala ndi zolakwika zomwe zingatheke

Chotsatira ndicho kuganiza kuti mapaketi onse opatsirana amalandiridwa mu dongosolo lomwe adatumizidwa, koma ma bits omwe ali mkati mwake akhoza kuwonongeka chifukwa chakuti njira nthawi zina imatumiza deta ndi zolakwika.

Zofunikira pakusamutsa kwa data kodalirika

Pankhaniyi, njira zotsatirazi zimagwiritsidwa ntchito:

  • kuzindikira zolakwika;
  • ndemanga;
  • kutumizanso.

Ma protocol odalirika otengera deta omwe ali ndi njira zofananira zobwerezabwereza kangapo amatchedwa ma protocol a Automatic Repeat reQuest (ARQ).
Kuonjezera apo, ndi bwino kuganizira za kuthekera kwa zolakwika mumalisiti, pamene gulu lolandira silidzalandira chidziwitso chilichonse chokhudza zotsatira za kusamutsidwa kwa paketi yomaliza.
Njira yothetsera vutoli, yomwe imagwiritsidwanso ntchito mu TCP, ndikuwonjezera gawo latsopano ku paketi ya data yomwe ili ndi nambala yotsatizana ya paketi.

Zofunikira pakusamutsa kwa data kodalirika

Kutumiza kwa data kodalirika panjira yosadalirika yomwe ingasokonezedwe ndi kutayika kwa paketi

Pamodzi ndi kupotoza, mwatsoka, pali kutayika kwa paketi mu netiweki.
Ndipo pofuna kuthetsa vutoli, ndondomeko zofunika:

  • kudziwa zenizeni za kutayika kwa paketi;
  • kubweretsanso mapaketi otayika ku gulu lolandira.

Kuonjezera apo, kuwonjezera pa kutayika kwa phukusi, ndikofunikira kupereka mwayi wotaya chiphaso kapena, ngati palibe chomwe chatayika, kutumiza kwake ndikuchedwa kwambiri. Muzochitika zonse, zomwezo zimachitika: paketi imatumizidwanso. Kuti muwongolere nthawi, makinawa amagwiritsa ntchito chowerengera chowerengera, chomwe chimakulolani kudziwa kutha kwa nthawi yodikirira. Choncho mu paketi ukonde TCPKeepAlive yakhazikitsidwa kukhala masekondi 15 mwachisawawa:

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

Mbali yotumiza ikufunika kuyambitsa chowerengera nthawi iliyonse paketi ikatumizidwa (koyamba ndi kachiwiri), gwirani zosokoneza kuchokera pa chowerengera ndikuyimitsa.

Chifukwa chake, tazolowera mfundo zazikuluzikulu zama protocol odalirika osamutsa deta:

  • macheke;
  • manambala otsatizana a paketi;
  • zowerengera nthawi;
  • zabwino ndi zoipa risiti.

Koma si zokhazo!

Protocol yodalirika yosamutsa deta yokhala ndi pipelining

Muzosiyana zomwe taziganizira kale, ndondomeko yodalirika yobweretsera ndiyosagwira ntchito kwambiri. Zimayamba "kuchepetsa" kufalitsa koperekedwa ndi njira yolumikizirana pamene RTT ikuwonjezeka. Kuti awonjezere mphamvu zake komanso kugwiritsa ntchito bwino njira yolumikizirana, mapaipi amagwiritsidwa ntchito.

Zofunikira pakusamutsa kwa data kodalirika

Kugwiritsa ntchito pipelining kumabweretsa:

  • kuwonjezera kuchuluka kwa manambala otsatizana, popeza mapaketi onse otumizidwa (kupatula otumizanso) ayenera kudziwika mwapadera;
  • kufunikira kowonjezera ma buffers kumbali zotumizira ndi kulandira.

Nambala yotsatizana ndi zofunikira za kukula kwa bafa zimatengera zomwe protocol imachita potengera ziphuphu, kutayika, ndi kuchedwa. Pankhani ya pipelining, pali njira ziwiri zowongolera zolakwika:

  • bwezerani mapaketi a N mmbuyo;
  • kubwereza kosankha.

Kubwereranso N mapaketi - sliding window protocol

Zofunikira pakusamutsa kwa data kodalirika

Wotumiza ayenera kuthandizira mitundu itatu ya zochitika:

  • kuyitana ndi protocol yapamwamba. Pamene ntchito yotumiza deta imatchedwa "kuchokera pamwamba", mbali yotumiza imayang'ana kaye kuchuluka kwa kudzazidwa kwa zenera (ndiko kuti, kupezeka kwa N kutumizidwa mauthenga akuyembekezera kulandila). Ngati zenera lilibe kanthu, paketi yatsopano imapangidwa ndikufalitsidwa, ndipo zosintha zimasinthidwa. Kupanda kutero, mbali yotumiza imabwezera deta kumtunda wapamwamba, ndipo ichi ndi chisonyezero chowonekera kuti zenera ladzaza. Kawirikawiri wosanjikiza wapamwamba amayesa kutumiza deta kachiwiri pakapita nthawi. Mukugwiritsa ntchito kwenikweni, wotumizayo amatha kusungitsa deta (m'malo motumiza nthawi yomweyo) kapena kukhala ndi njira yolumikizira (monga semaphore kapena mbendera) yomwe ingalole kumtunda kuyitanitsa ntchito yotumiza pokhapokha zenera lilibe kanthu. .
  • kulandira chitsimikiziro. Mu protocol, pa paketi yokhala ndi nambala yotsatizana N, chivomerezo chonse chimaperekedwa kusonyeza kuti mapaketi onse okhala ndi manambala otsatizana patsogolo N adalandiridwa bwino.
  • nthawi yodikira yatha. Kuti mudziwe zenizeni za kutayika ndi kuchedwa kwa mapaketi ndi ma risiti, protocol imagwiritsa ntchito chowerengera. Ngati nthawi yomaliza yatha, mbali yotumizayo itumizanso mapaketi onse omwe sanavomerezedwe.

Kubwereza kosankha

Pamene kukula kwazenera ndi kuchedwa kwa kufalitsa kwachulukidwe kumakhala kwakukulu, mapaketi ambiri amatha kukhala mupaipi. Zikatero, kulakwitsa kwa paketi imodzi kungachititse kuti mapaketi ambiri atumizidwenso, ambiri omwe sanafunikire.

Chitsanzo:

Zabwino kwambiri zangongole machitidwe amasonkhanitsidwa muzochitika zenizeni TCP. Ndipo ngati wina akudziwa bwino - olandiridwa.

Seva

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

Makasitomala

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

Pomaliza

Njira zowonetsetsa kusamutsa deta yodalirika ndikugwiritsa ntchito

Njira
Ntchito, ndemanga

Onani kuchuluka
Amagwiritsidwa ntchito kuti azindikire zolakwika pang'ono mu paketi yopatsirana

Nthawi
Imawerengera nthawi yomaliza ndikuwonetsa nthawi yomwe yatha. Chotsatiracho chimatanthauza kuti ndi mwayi waukulu kuti paketi kapena risiti yake imatayika panthawi yopatsirana. Ngati paketi yaperekedwa mochedwa, koma osatayika (kutha msanga kwa nthawi yothera nthawi), kapena chiphaso chatayika, kubwezeretsanso kumabweretsa paketi yobwereza kumbali yolandira.

Nambala ya siriyo
Amagwiritsidwa ntchito powerengera motsatizana pamapaketi a data kuchokera kwa wotumiza kupita kwa wowalandira. Mipata mu manambala otsatizana a mapaketi olandilidwa amalola wolandila kuti azindikire kutayika kwa paketi. Nambala zotsatizana za paketi zomwezo zikutanthauza kuti mapaketiwo ndi obwerezabwereza

Umboni
Amapangidwa ndi mapeto olandira ndikuwonetsa kumapeto kwa kutumiza kuti paketi yogwirizana kapena gulu la paketi lalandiridwa bwino. Nthawi zambiri chivomerezocho chimakhala ndi manambala otsatizana a paketi yolandilidwa bwino. Kutengera ndi protocol, zitsimikizo za munthu ndi gulu zimasiyanitsidwa

Kutsimikizira kolakwika
Zogwiritsidwa ntchito ndi wolandirayo kudziwitsa wotumiza kuti paketiyo idalandiridwa molakwika. Kuvomereza kolakwika kumaphatikizapo nambala yotsatizana ya paketi yomwe sinalandiridwe bwino

Zenera, conveyorization
Chepetsani kuchuluka kwa manambala otsatizana omwe angagwiritsidwe ntchito potumiza mapaketi. Multicast ndi kugwirana chanza kumatha kukulitsa kwambiri ma protocol poyerekeza ndi kuyembekezera kuyamikiridwa. Monga momwe tiwonera, kukula kwazenera kumatha kuwerengedwa kutengera kulandilidwa ndi kusungitsa mphamvu zolandirira, komanso kuchuluka kwa netiweki.

Zitsanzo zambiri zogwiritsira ntchito Go for networking

В nkhokwe.

Source: www.habr.com

Kuwonjezera ndemanga