Izisekelo Zokudluliswa Kwedatha Okuthembekile

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Kulabo aba ufuna Kunikezelwe ekuqondeni amanethiwekhi namaphrothokholi.

Kafushane

I-athikili ixoxa ngezisekelo zokudluliswa kwedatha okuthembekile, isebenzisa izibonelo ku Go, okuhlanganisa i-UDP ne-TCP. Ngokusekelwe ku izikhathi, два, ezintathu kanye nezincwadi ezithi "Computer Networks. Top-Down Approach", ngaphandle kwalokho wonke umuntu uxoxa ngoTannenbaum no-Oliferov kuphela.

Iphrothokholi yesendlalelo sezokuthutha

Inikeza ukuxhumana okunengqondo phakathi kwezinqubo zohlelo lokusebenza ezisebenza kubasingathi abahlukahlukene. Ngokombono wohlelo lokusebenza, ukuxhumana okunengqondo kubukeka njengesiteshi esixhuma ngokuqondile izinqubo.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Izivumelwano zesendlalelo sezokuthutha asekelwa izinhlelo zokugcina, kodwa hhayi amarutha enethiwekhi (ngaphandle - I-DPI). Ohlangothini lomthumeli, isendlalelo sezokuthutha siguqula idatha yesendlalelo sohlelo lokusebenza eyitholayo kusukela kunqubo yokuthumela isicelo ibe amaphakethe ezendlalelo zokuthutha abizwa ngokuthi amasegmenti.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Lokhu kwenziwa ngokuhlukanisa (uma kunesidingo) imilayezo yesendlalelo sohlelo lokusebenza ibe yizicucu futhi wengeze unhlokweni wesendlalelo sokuthutha kuleyo naleyo.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Isendlalelo sezokuthutha sibe sesidlulisela ingxenye kusendlalelo senethiwekhi yomthumeli, lapho ingxenye ihlanganiswa kuphakethe lesendlalelo senethiwekhi (idathagram) futhi ithunyelwe. Ekupheleni kokwamukela, isendlalelo senethiwekhi sikhipha ingxenye yesendlalelo sezokuthutha ku-datagram bese siyidlulisela kungqimba yezokuthutha. Okulandelayo, isendlalelo sezokuthutha sicubungula ingxenye etholiwe ukuze idatha yayo itholakale ohlelweni olutholayo.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Izimiso zokudluliswa kwedatha okuthembekile

Ukudluliswa kwedatha okuthembekile ngesiteshi esivikeleke ngokuphelele

Icala elilula. Uhlangothi oluthumelayo luvele lwamukele idatha kusuka kungqimba olungaphezulu, lwenze iphakethe eliqukethe, bese liyithumela esiteshini.

Iseva

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

Ikhasimende

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

Ukudluliswa kwedatha okuthembekile ngesiteshi ngamaphutha angaba khona

Isinyathelo esilandelayo siwukuthatha ngokuthi wonke amaphakethe adlulisiwe atholwa ngendlela athunyelwe ngayo, kodwa izingcezu ezikuwo zingase zonakaliswe ngenxa yokuthi isiteshi ngezinye izikhathi sidlulisela idatha ngokuhlanekezela.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Kulokhu, izindlela ezilandelayo zisetshenziswa:

  • ukutholwa kwephutha;
  • impendulo;
  • ukudluliswa kabusha.

Amaphrothokholi athembekile okudlulisa idatha anezindlela ezifanayo zokuphinda ukudlulisa izikhathi eziningi abizwa ngokuthi amaphrothokholi e-Automatic Repeat reQuest (ARQ).
Ukwengeza, kufanelekile ukucabangela ukuthi kungenzeka kube namaphutha kumarisidi, lapho iqembu elitholayo lingeke lithole noma yiluphi ulwazi mayelana nemiphumela yokudluliswa kwephakethe lokugcina.
Isixazululo sale nkinga, esibuye sisetshenziswe ku-TCP, ukwengeza inkambu entsha kuphakethe ledatha eliqukethe inombolo yokulandelana kwephakethe.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Ukudluliswa kwedatha okuthembekile ngesiteshi esingathembekile ngaphansi kokuhlanekezelwa nokulahleka kwephakethe

Kanye nokuhlanekezela, ngeshwa, kukhona ukulahleka kwephakethe kunethiwekhi.
Futhi ukuxazulula le nkinga, izindlela ziyadingeka:

  • ukunquma iqiniso lokulahlekelwa kwephakethe;
  • ukulethwa kabusha kwamaphakethe alahlekile eqenjini elamukelayo.

Ukwengeza, ngaphezu kokulahlekelwa kwephakheji, kuyadingeka ukunikeza ithuba lokulahlekelwa irisidi noma, uma kungekho lutho olulahlekile, ukulethwa kwayo ngokubambezeleka okukhulu. Kuzo zonke izimo, into efanayo yenziwa: iphakethe lidluliselwa kabusha. Ukuze ulawule isikhathi, lo mshini usebenzisa isibali-sikhathi sokubala wehle, esikuvumela ukuthi unqume ukuphela kwesikhawu sokulinda. Ngakho ephaketheni net I-TCPKeepAlive isethelwe kumasekhondi ayi-15 ngokuzenzakalelayo:

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

Uhlangothi oluthumelayo ludinga ukuqala isibali sikhathi njalo lapho iphakethe lisakazwa (kokubili okokuqala nesesibili), libambe iziphazamiso kusukela kusibali sikhathi bese usimisa.

Ngakho-ke, sesijwayelene nemiqondo ebalulekile yezinqubo ezithembekile zokudluliswa kwedatha:

  • amasheke;
  • izinombolo zokulandelana kwamaphakheji;
  • izibali sikhathi;
  • amarisidi amahle kanye namarisidi.

Kodwa akugcini lapho!

Iphrothokholi yokudlulisa idatha ethembekile ene-pipelining

Kokwehlukile esesivele sikucabangile, iphrothokholi yokulethwa okuthembekile ayisebenzi kahle. Iqala "ukunciphisa" ukudluliswa okuhlinzekwa yisiteshi sokuxhumana njengoba i-RTT ikhula. Ukwandisa ukusebenza kahle kwayo nokusebenzisa kangcono umthamo wesiteshi sokuxhumana, kusetshenziswa amapayipi.

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Ukusetshenziswa kwamapayipi kuholela ku:

  • ukwandisa ububanzi bezinombolo zokulandelana, njengoba wonke amaphakethe athunyelwe (ngaphandle kwama-retransmissions) kufanele akhonjwe ngokuhlukile;
  • isidingo sokwandisa ama-buffers ezinhlangothini zokudlulisela nokwamukela.

Ibanga lenombolo yokulandelana nezidingo zikasayizi webhafa zincike ezenzweni iphrothokholi eyithathayo ukuphendula ukonakala kwephakethe, ukulahleka, nokubambezeleka. Endabeni yokufaka amapayipi, kunezindlela ezimbili zokulungisa amaphutha:

  • buyisela amaphakethe e-N emuva;
  • ukuphindaphinda okukhethiwe.

Ukubuyela emuva kumaphakethe angu-N - umthetho olandelwayo wewindi elislayidayo

Izisekelo Zokudluliswa Kwedatha Okuthembekile

Umthumeli kufanele asekele izinhlobo ezintathu zemicimbi:

  • shayela ngephrothokholi yezinga eliphezulu. Uma umsebenzi wokuthumela idatha ubizwa ngokuthi “kusuka ngenhla”, uhlangothi lokuthumela luqala ngokuhlola izinga lokugcwaliswa kwewindi (okungukuthi, ukuba khona kwemilayezo engu-N ethunyelwe elinde ukwamukelwa kwamarisidi). Uma iwindi lingenalutho, iphakethe elisha liyakhiqizwa futhi lidluliselwe, futhi amanani aguquguqukayo ayabuyekezwa. Uma kungenjalo, uhlangothi lokuthumela lubuyisela idatha kusendlalelo esingaphezulu, futhi lokhu kuyinkomba esobala yokuthi iwindi ligcwele. Ngokuvamile ungqimba olungaphezulu luzozama ukudlulisa idatha futhi ngemva kwesikhathi esithile. Kuhlelo lokusebenza lwangempela, umthumeli kungenzeka agcine idatha (esikhundleni sokuyithumela ngokushesha) noma abe nendlela yokuvumelanisa (njenge-semaphore noma ifulege) engavumela ungqimba olungaphezulu ukuthi lushayele umsebenzi wokuthumela kuphela uma iwindi lingenalutho. .
  • ukuthola isiqinisekiso. Kuphrothokholi, ephaketheni elinenombolo yokulandelana engu-N, ukuvuma okuvamile kukhishwa okubonisa ukuthi wonke amaphakethe anezinombolo zokulandelana ezandulela okuthi N amukelwe ngempumelelo.
  • isikhawu sokulinda siphelelwe yisikhathi. Ukuze unqume amaqiniso okulahlekelwa nokubambezeleka kwamaphakethe namarisidi, iphrothokholi isebenzisa isibali sikhathi. Uma isikhathi sokuvala siphela, uhlangothi lokuthumela luthumela kabusha wonke amaphakethe angagunyaziwe.

Ukuphindaphinda okukhethiwe

Uma usayizi wefasitela kanye nomkhiqizo wokulibaziseka kokusabalalisa kokudlulisa kukhulu, inani elikhulu lamaphakethe lingase libe semgqeni. Esimeni esinjalo, iphutha lephakethe elilodwa lingase libangele inani elikhulu lamaphakethe ukuthi lidluliselwe kabusha, iningi lawo ebelingadingeki.

Isibonelo:

Okuhle kakhulu ithiyori izinqubo ziqoqwa ekusetshenzisweni okungokoqobo I-TCP. Futhi uma umuntu azi ukuthi kungcono kangakanani - wamukelekile.

Iseva

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

Ikhasimende

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

isiphetho

Izindlela zokuqinisekisa ukudluliswa kwedatha okuthembekile nokusetshenziswa

Indlela
Isicelo, ukuphawula

Hlola isamba
Isetshenziselwa ukuthola amaphutha amancane ephaketheni elidlulisiwe

Isikhathi
Ibala phansi isikhathi sokuvala futhi ikhombise ukuthi isiphelelwe yisikhathi nini. Lokhu kokugcina kusho ukuthi ngezinga eliphezulu lokungenzeka iphakethe noma irisidi yalo liyalahleka ngesikhathi sokudlulisela. Uma iphakethe lilethwa ngokubambezeleka, kodwa lingalahleki (ukuphelelwa isikhathi ngaphambi kwesikhathi kwesikhawu sokuvala), noma ilahleka irisidi, ukudluliswa kabusha kuholela ephaketheni eliyimpinda ohlangothini olutholayo.

Inombolo yomkhiqizo
Isetshenziselwa izinombolo ezilandelanayo zamaphakethe wedatha adluliswa esuka kumthumeli ukuya kumamukeli. Izikhala ezinombolweni zokulandelana zamaphakethe atholiwe zivumela umamukeli ukuthi abone ukulahleka kwephakethe. Izinombolo zephakethe elifanayo lokulandelana zisho ukuthi amaphakethe ayizimpinda zamanye

Isiqinisekiso
Kwenziwe indawo yokwamukela futhi ekhombisa ekugcineni ukuthi iphakethe elihambisanayo noma iqoqo lamaphakethe lamukelwe ngempumelelo. Ngokuvamile ukuvuma kuqukethe izinombolo zokulandelana zamaphakethe amukelwe ngempumelelo. Ngokuya ngephrothokholi, ukuqinisekiswa komuntu ngamunye neqembu kuyahlukaniswa

Ukuqinisekisa okungekuhle
Isetshenziswa umamukeli ukwazisa umthumeli ukuthi iphakethe lamukelwe ngokungalungile. Ukuvuma okunegethivu kuvame ukufaka inombolo yokulandelana kwephakethe engazange imukelwe kahle

Iwindi, i-conveyorization
Khawulela ububanzi bezinombolo zokulandelana ezingasetshenziswa ukudlulisa amaphakethe. Ukusakaza okuningi nokuxhawula kungakhuphula kakhulu ukusebenza kwephrothokholi uma kuqhathaniswa nokulinda ukubonga. Njengoba sizobona, usayizi wefasitela ungabalwa ngokusekelwe emandleni okwamukela kanye nokubhafa kokuphela kokwamukela, kanye nezinga lomthwalo wenethiwekhi.

Izibonelo ezengeziwe zokusebenzisa i-Go for networking

В izinqolobane.

Source: www.habr.com

Engeza amazwana