Bun-stèidh gluasad dàta earbsach

Bun-stèidh gluasad dàta earbsach

Dhaibhsan a tha sireadh Coisrigte airson lìonraidhean agus protocolaidhean a thuigsinn.

Gu h-aithghearr

Tha an artaigil a’ beachdachadh air bunaitean tar-chuir dàta earbsach, a’ cur an gnìomh eisimpleirean air Go, a’ gabhail a-steach UDP agus TCP. Stèidhichte air amannan, два, trì agus na leabhraichean "Computer Networks. Top-Down Approach", a chaochladh a h-uile duine a 'bruidhinn a-mhàin Tannenbaum agus Oliferov.

Pròtacal còmhdach còmhdhail

A’ toirt seachad ceangal loidsigeach eadar pròiseasan tagraidh a tha a’ ruith air diofar luchd-aoigheachd. Bho shealladh tagraidh, tha ceangal loidsigeach coltach ri sianal a tha a 'ceangal phròiseasan gu dìreach.

Bun-stèidh gluasad dàta earbsach

Pròtacal còmhdach còmhdhail a’ faighinn taic bho shiostaman crìochnachaidh, ach chan ann le routers lìonra (ach a-mhàin - DPI). Air taobh an neach a chuir, bidh an còmhdach còmhdhail ag atharrachadh an dàta còmhdach tagraidh a gheibh e bhon phròiseas tagraidh cur gu pacaidean còmhdach còmhdhail ris an canar earrannan.

Bun-stèidh gluasad dàta earbsach

Tha seo air a dhèanamh le bhith a’ roinneadh (ma tha sin riatanach) teachdaireachdan còmhdach an tagraidh ann am pìosan agus a’ cur bann-cinn còmhdach còmhdhail ri gach fear dhiubh.

Bun-stèidh gluasad dàta earbsach

Bidh an còmhdach còmhdhail an uairsin a’ dol seachad air an roinn gu ìre lìonra an neach a chuir e, far a bheil an earrann air a chuairteachadh ann am pasgan còmhdach lìonra (datagram) agus air a chuir. Aig an deireadh faighinn, bidh an còmhdach lìonra a ’toirt a-mach an earrann còmhdach còmhdhail bhon datagram agus ga thoirt suas chun ìre còmhdhail. An ath rud, bidh an còmhdach còmhdhail a’ pròiseasadh na roinne a gheibhear gus am bi an dàta aige ri fhaighinn don tagradh faighinn.

Bun-stèidh gluasad dàta earbsach

Prionnsabalan tar-chuir dàta earbsach

Tar-chuir dàta earbsach thairis air seanal gu tur tèarainte

A 'chùis as sìmplidh. Bidh an taobh cur dìreach a ’faighinn an dàta bhon t-sreath àrd, a’ cruthachadh pacaid anns a bheil e, agus ga chuir chun t-sianal.

Freiceadan

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

Luchd-ceannach

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

Tar-chuir dàta earbsach thairis air seanail le mearachdan comasach

Is e an ath cheum a bhith den bheachd gu bheilear a’ faighinn a h-uile pacaid tar-chuir san òrdugh anns an deach an cur, ach dh ’fhaodadh na pìosan a tha annta a bhith truaillidh air sgàth gu bheil an sianal uaireannan a’ sgaoileadh dàta le saobhadh.

Bun-stèidh gluasad dàta earbsach

Anns a 'chùis seo, thathar a' cleachdadh na dòighean a leanas:

  • lorg mearachd;
  • fios air ais;
  • ath-chraoladh.

Canar protocolaidhean ath-aithris fèin-ghluasadach (ARQ) ri protocolaidhean gluasad dàta earbsach aig a bheil uidheamachdan co-chosmhail airson tar-chuir a-rithist iomadh uair.
A bharrachd air an sin, is fhiach beachdachadh air comasachd mhearachdan ann an cuidhteasan, nuair nach fhaigh am pàrtaidh a gheibh fiosrachadh sam bith mu thoraidhean gluasad a’ phacaid mu dheireadh.
Is e am fuasgladh don duilgheadas seo, cuideachd air a chleachdadh ann an TCP, raon ùr a chur ris a’ phacaid dàta anns a bheil àireamh sreath a’ phacaid.

Bun-stèidh gluasad dàta earbsach

Tar-chuir dàta earbsach thairis air seanal neo-earbsach le ùmhlachd do shaobhadh agus call pacaid

Còmhla ri saobhadh, gu mì-fhortanach, tha call pacaid anns an lìonra.
Agus gus an duilgheadas seo fhuasgladh, tha feum air dòighean-obrach:

  • a 'dearbhadh fìrinn call pacaid;
  • ath-lìbhrigeadh phasganan caillte don phàrtaidh faighinn.

A bharrachd air an sin, a bharrachd air a bhith a 'call a' phacaid, feumar ullachadh a dhèanamh airson a bhith comasach air an cuidhteas a chall no, mura h-eil dad air a chall, a lìbhrigeadh le dàil mhòr. Anns a h-uile cùis, tha an aon rud air a dhèanamh: tha am pasgan air ath-chraoladh. Gus smachd a chumail air ùine, bidh an uidheamachd seo a’ cleachdadh timer cunntais sìos, a leigeas leat deireadh an ùine feitheimh a dhearbhadh. Mar sin anns a 'phacaid lìon Tha TCPKeepAlive air a shuidheachadh gu 15 diogan gu bunaiteach:

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

Feumaidh an taobh cur timer tòiseachadh a h-uile uair a thèid pacaid a chuir a-mach (an dà chuid a’ chiad agus an dàrna turas), làimhseachadh brisidhean bhon timer agus stad air.

Mar sin, tha sinn air fàs eòlach air na prìomh bhun-bheachdan de phròtacalan gluasad dàta earbsach:

  • seicichean;
  • sreath àireamhan pacaidean;
  • timers;
  • cuidhteasan dearbhach agus àicheil.

Ach chan e sin uile!

Pròtacal gluasad dàta earbsach le loidhne-phìoban

Anns an tionndadh air an do bheachdaich sinn mu thràth, tha am protocol lìbhrigidh earbsach gu math neo-èifeachdach. Bidh e a’ tòiseachadh “a’ slaodadh sìos ”an tar-chuir a bheir an t-sianal conaltraidh seachad mar a bhios an RTT ag àrdachadh. Gus an èifeachdas àrdachadh agus comas an t-sianail conaltraidh a chleachdadh nas fheàrr, thathas a’ cleachdadh pìoban.

Bun-stèidh gluasad dàta earbsach

Tha cleachdadh pìobaireachd a 'leantainn gu:

  • meudachadh ann an raon àireamhan sreath, oir feumaidh a h-uile pasgan a chaidh a chuir a-steach (ach a-mhàin ath-chraolaidhean) a bhith air an comharrachadh gu sònraichte;
  • an fheum air bufairean àrdachadh air na taobhan tar-chuir agus faighinn.

Tha an raon àireamh sreath agus riatanasan meud bufair an urra ris na gnìomhan a nì am protocol mar fhreagairt air coirbeachd pacaid, call, agus dàil. A thaobh pìobaireachd, tha dà dhòigh ann airson mearachdan a cheartachadh:

  • thoir air ais N pacaidean;
  • ath-aithris roghnach.

A 'dol air ais N pacaidean - protocol uinneag sleamhnachaidh

Bun-stèidh gluasad dàta earbsach

Feumaidh an neach-cuiridh taic a thoirt do thrì seòrsa de thachartasan:

  • gairm le protocol ìre nas àirde. Nuair a chanar “bho gu h-àrd” ris a’ ghnìomh cur dàta, bidh an taobh cur a-steach an-toiseach a’ sgrùdadh ìre lìonadh na h-uinneige (is e sin, làthaireachd N air a chuir teachdaireachdan a’ feitheamh ri cuidhteasan). Ma tha an uinneag falamh, thèid pasgan ùr a chruthachadh agus a ghluasad, agus thèid na luachan caochlaideach ùrachadh. Rud eile, bidh an taobh cur air ais dàta chun t-sreath àrd, agus tha seo na chomharra soilleir gu bheil an uinneag làn. Mar as trice feuchaidh an t-sreath àrd ris an dàta a thar-chuir a-rithist às deidh beagan ùine. Ann an tagradh fìor, tha coltas ann gum biodh an neach-cuiridh an dàrna cuid a ’buanachadh an dàta (an àite a bhith ga chuir sa bhad) no le inneal sioncronaidh (leithid semaphore no bratach) a leigeadh leis an t-sreath àrd an gnìomh cuir a ghairm dìreach nuair a tha an uinneag falamh .
  • a' faighinn dearbhadh. Anns a’ phròtacal, airson pacaid le àireamh sreath N, tha aithne choitcheann air a thoirt a-mach a’ nochdadh gun d’ fhuaireadh gu soirbheachail a h-uile pacaid le àireamhan sreath ro N.
  • tha an ùine feitheimh air tighinn gu crìch. Gus faighinn a-mach fìrinnean call agus dàil pacaidean agus cuidhteasan, bidh am protocol a’ cleachdadh timer. Ma thig an ùine a-mach gu crìch, bidh an taobh cur air ais a’ cur a h-uile pacaid neo-aithnichte a-steach.

Ath-aithris roghnach

Nuair a tha meud na h-uinneige agus an toradh dàil iomadachaidh trochur mòr, faodaidh àireamh mhòr de phasganan a bhith san amharc. Ann an leithid de chùis, dh’ fhaodadh mearachd pacaid singilte adhbhrachadh gun tèid àireamh mhòr de phasganan ath-chraoladh, agus cha robh feum air a’ mhòr-chuid dhiubh.

Eisimpleir:

A 'chuid as fheàrr teòiridheach tha cleachdaidhean air an cruinneachadh ann an cur an gnìomh practaigeach TCP. Agus ma tha fios aig cuideigin ciamar as fheàrr - Fàilte.

Freiceadan

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

Luchd-ceannach

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

co-dhùnadh

Innealan gus dèanamh cinnteach à gluasad agus cleachdadh dàta earbsach

Meicnism
Iarrtas, beachd

Thoir sùil air an t-suim
Air a chleachdadh gus mearachdan beaga a lorg ann am pasgan tar-chuir

Timer
A’ cunntadh sìos an eadar-ama agus a’ comharrachadh nuair a tha e air tighinn gu crìch. Tha an tè mu dheireadh a 'ciallachadh le ìre àrd de choltas gu bheil am pasgan no an cuidhteas air a chall aig àm an tar-chuir. Ma thèid pacaid a lìbhrigeadh le dàil, ach nach eil e air a chall (cuiridh an ùine a-mach ro-ùine), no ma thèid cuidhteas a chall, bidh ath-chraoladh a’ leantainn gu pacaid dùblaichte air an taobh faighinn

Àireamh sònraichte
Air a chleachdadh airson àireamh sreathach de phasgan dàta a chaidh a ghluasad bhon neach a chuir chun neach a gheibh e. Tha beàrnan ann an sreath àireamhan nam pacaidean a fhuaireadh a’ leigeil leis a’ ghlacadair call pacaid a lorg. Tha na h-aon àireamhan sreath pacaid a’ ciallachadh gu bheil na pacaidean nan dùblaidhean bho chèile

Dearbhadh
Air a ghineadh leis a’ cheann faighinn agus a’ comharrachadh gu deireadh an cur gun d’ fhuaireadh gu soirbheachail a’ phacaid no am buidheann phasgan iomchaidh. Mar as trice tha an aithne a’ toirt a-steach àireamhan sreath nam pacaidean a fhuaireadh gu soirbheachail. A rèir a 'phròtacail, tha dearbhaidhean fa leth agus buidhne air an comharrachadh

Dearbhadh àicheil
Air a chleachdadh leis an neach a gheibh e gus innse don neach a chuir e gun d’ fhuaireadh a’ phacaid ceàrr. Mar as trice bidh aithne àicheil a’ toirt a-steach àireamh sreath a’ phacaid nach d’ fhuaireadh gu ceart

Uinneag, giùlan
Cuir crìoch air an raon de àireamhan sreath a ghabhas cleachdadh airson pacaidean a thar-chuir. Faodaidh multicast agus crathadh làimhe àrdachadh mòr a thoirt air toradh protocol an taca ri bhith a’ feitheamh ri aithne. Mar a chì sinn, faodar meud na h-uinneige a thomhas a rèir comasan fàilteachaidh agus buffering an deireadh faighinn, a bharrachd air ìre luchdan lìonra

Barrachd eisimpleirean de bhith a’ cleachdadh Go airson lìonrachadh

В tasgaidh.

Source: www.habr.com

Cuir beachd ann