Iziseko zoTshintsho oluthembekileyo lweDatha

Iziseko zoTshintsho oluthembekileyo lweDatha

Kwabo bathe ifuna Kunikezelwe ekuqondeni uthungelwano kunye neeprothokholi.

Ngokufutshane

Inqaku lixoxa ngeziseko zokuhanjiswa kwedatha ethembekileyo, lisebenzisa imizekelo kwi Go, kuquka i-UDP kunye ne-TCP. Ngenxa ye maxesha, два, ezintathu kunye neencwadi ezithi "Iinethiwekhi zeKhompyutha. Indlela ePhambili-Down", ngaphandle koko wonke umntu uxoxa ngeTannenbaum no-Oliferov kuphela.

Iprothokholi yomaleko wezothutho

Ibonelela ngoqhagamshelwano olusengqiqweni phakathi kweenkqubo zesicelo ezisebenza kwiinginginya ezahlukeneyo. Ukususela kumbono wesicelo, uxhulumaniso olunengqiqo lubukeka njengejelo elidibanisa ngokuthe ngqo iinkqubo.

Iziseko zoTshintsho oluthembekileyo lweDatha

Iiprothokholi zomaleko wezothutho zixhaswa ziinkqubo zokuphela, kodwa hayi ziirotha zenethiwekhi (ngaphandle - DPI). Kwicala lomthumeli, umaleko wezothutho uguqula idatha yomaleko wesicelo ayifumanayo kwinkqubo yokuthumela isicelo kwiipakethi zothutho ezibizwa ngokuba ngamacandelo.

Iziseko zoTshintsho oluthembekileyo lweDatha

Oku kwenziwa ngokwahlula (ukuba kukho imfuneko) imiyalezo yomaleko wesicelo ibe ngamaqhekeza kwaye yongeza umaleko wesihloko sothutho kuwo ngamnye kubo.

Iziseko zoTshintsho oluthembekileyo lweDatha

Umaleko wezothutho emva koko udlulisa icandelo kumthumeli womnatha womnatha, apho icandelo lifakwe kwi-packet layer network (datagram) kwaye ithunyelwe. Ekupheleni kokufumana, i-network layer ikhupha icandelo lezothutho kwi-datagram kwaye idlulise ukuya kwinqanaba lokuthutha. Emva koko, umaleko wezothutho uqhuba icandelo elifunyenweyo ukuze idatha yalo ifumaneke kwisicelo esifumanayo.

Iziseko zoTshintsho oluthembekileyo lweDatha

Imigaqo yokuhanjiswa kwedatha ethembekileyo

Ukuhanjiswa kwedatha ethembekileyo kwitshaneli ekhuseleke ngokupheleleyo

Eyona meko ilula. Icala lokuthumela lifumana ngokulula idatha ukusuka kumaleko angaphezulu, lenza ipakethe equlathe yona, kwaye iyithumele kwitshaneli.

UmSebenzi

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

Umthengi

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

Ukuhanjiswa kwedatha okuthembekileyo kwitshaneli eneempazamo ezinokwenzeka

Isinyathelo esilandelayo kukucinga ukuba zonke iipakethi ezithunyelwayo zifunyenwe ngendlela ezithunyelwe ngayo, kodwa amasuntswana kuwo angonakaliswa ngenxa yokuba umjelo ngamanye amaxesha uhambisa idatha ngokugqwetha.

Iziseko zoTshintsho oluthembekileyo lweDatha

Kule meko, ezi ndlela zilandelayo zisetyenziswa:

  • ukufunyanwa kwempazamo
  • impendulo;
  • ukudluliselwa kwakhona.

Iiprothokholi zogqithiso lwedatha ezithembekileyo ezineendlela ezifanayo zokuphinda ugqithiso ngamaxesha amaninzi zibizwa ngokuba yi-Automatic Repeat ReQuest (ARQ) protocol.
Ukongezelela, kuyafaneleka ukuqwalasela ukuba kunokwenzeka iimpazamo kwiirisithi, xa iqela elifumanayo lingayi kufumana naluphi na ulwazi malunga neziphumo zokudluliselwa kwepakethi yokugqibela.
Isisombululo sale ngxaki, esisetyenziswe kwi-TCP, kukongeza insimu entsha kwipakethi yedatha equlethe inombolo yokulandelelana kwepakethi.

Iziseko zoTshintsho oluthembekileyo lweDatha

Ukuhanjiswa kwedatha okuthembekileyo kwitshaneli engathembekanga ephantsi kokuphazamiseka kwepakethi kunye nelahleko

Kanye kunye nokuphazamiseka, ngelishwa, kukho ukulahleka kwepakethi kwinethiwekhi.
Kwaye ukusombulula le ngxaki, iindlela ezifunekayo:

  • ukugqiba inyaniso yokulahleka kwepakethi;
  • ukuhanjiswa kwakhona kweepakethi ezilahlekileyo kwiqela elifumanayo.

Ukongezelela, ngaphezu kokulahlekelwa kwepakethi, kuyimfuneko ukubonelela ngokunokwenzeka kokulahleka kwerisithi okanye, ukuba akukho nto ilahlekileyo, ukuhanjiswa kwayo ngokulibaziseka okukhulu. Kuzo zonke iimeko, kwenziwa into efanayo: ipakethi iphinda idluliselwe. Ukulawula ixesha, le ndlela isebenzisa isibali-xesha sokubala, esikuvumela ukuba umisele isiphelo sethuba lokulinda. Ngoko kwiphakheji inethi I-TCPKeepAlive isetelwe kwimizuzwana eyi-15 ngokungagqibekanga:

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

Icala lokuthumela kufuneka liqalise isibali-xesha ngalo lonke ixesha ipakethi ihanjiswa (zombini okokuqala kunye neyesibini), phatha iziphazamiso ukusuka kwisibali-xesha kwaye uyimise.

Ke, siye saqhelana neengqikelelo eziphambili zeeprothokholi ezithembekileyo zokudlulisa idatha:

  • itshekhisum;
  • amanani olandelelwano lweepakethe;
  • izibali-xesha
  • iirisithi ezintle nezimbi.

Kodwa akuphelelanga apho!

Iprotocol yokudlulisa idatha ethembekileyo kunye nepayipi

Ngokwahlukileyo esele siqwalasele, iprotocol yokuhanjiswa ethembekileyo ayisebenzi kakuhle. Iqala "ukunciphisa" ukuhanjiswa okubonelelwa ngumtsha wonxibelelwano njengoko i-RTT ikhula. Ukwandisa ukusebenza kakuhle kwayo kunye nokusebenzisa ngcono umthamo wejelo lonxibelelwano, kusetyenziswa imibhobho.

Iziseko zoTshintsho oluthembekileyo lweDatha

Ukusetyenziswa kwemibhobho kukhokelela ku:

  • ukwandisa uluhlu lwamanani olandelelwano, ekubeni zonke iipakethi ezithunyelwe (ngaphandle kokuthunyelwa kwakhona) kufuneka zichongwe ngokukodwa;
  • imfuno yokunyusa izithinteli kumacala ogqithisela nawamkelayo.

Uluhlu lweenombolo zolandelelwano kunye neemfuno zesayizi ye-buffer zixhomekeke kumanyathelo athathwa yiprotocol ukuphendula kurhwaphilizo lwepakethi, ilahleko, kunye nokulibaziseka. Kwimeko yokwenziwa kwemibhobho, kukho iindlela ezimbini zokulungisa iimpazamo:

  • buyisela iipakethi ze-N ngasemva;
  • uphindaphindo olukhethiweyo.

Ukubuyela umva iipakethe ze-N - iprotocol yefestile etyibilikayo

Iziseko zoTshintsho oluthembekileyo lweDatha

Umthumeli kufuneka axhase iindidi ezintathu zeziganeko:

  • biza ngeprotocol yenqanaba eliphezulu. Xa umsebenzi wokuthumela idatha ubizwa ngokuba "ukusuka phezulu", icala lokuthumela kuqala lijonga iqondo lokuzaliswa kwefestile (oko kukuthi, ubukho bemiyalezo ethunyelwe ngu-N elindele ukufumana iirisithi). Ukuba iwindow ayinanto, ipakethi entsha yenziwe kwaye idluliselwe, kwaye amaxabiso aguquguqukayo ahlaziywa. Ngaphandle koko, icala lokuthumela libuyisela idatha kumaleko aphezulu, kwaye oku kubonisa ngokucacileyo ukuba ifestile igcwele. Ngokuqhelekileyo umaleko ophezulu uya kuzama ukuthumela idatha kwakhona emva kwexesha elithile. Kwisicelo sokwenyani, umthumeli anokuthi mhlawumbi ade athintele idatha (endaweni yokuyithumela ngokukhawuleza) okanye abenendlela yongqamaniso (efana ne semaphore okanye iflegi) enokuvumela umaleko ophezulu ukubiza umsebenzi wokuthumela kuphela xa ifestile ingenanto. .
  • ukufumana isiqinisekiso. Kwiprothokholi, kwipakethi enenombolo yolandelelwano N, ukuvuma ngokubanzi kukhutshwa ebonisa ukuba zonke iipakethi ezinamanani olandelelwano olwandulela u-N zifunyenwe ngempumelelo.
  • ixesha lokulinda liphelile. Ukumisela iinyani zelahleko kunye nokulibaziseka kweepakethi kunye neerisithi, iprotocol isebenzisa i-timer. Ukuba ixesha lokuvala liphelile, icala elithumelayo lithumela kwakhona zonke iipakethi ezithunyelwe ezingavunywanga.

Uphindaphindo olukhethiweyo

Xa ubungakanani befestile kunye nemveliso yokulibaziseka kwe-output-propagation inkulu, inani elikhulu leepakethi linokuba kwipayipi. Kwimeko enjalo, impazamo yepakethe enye inokubangela ukuba inani elikhulu leepakethi lidluliselwe kwakhona, uninzi lwazo lwalungafuneki.

Umzekelo:

Eyona nto ibhetele ithiyori iinkqubo ziqokelelwa ekuphunyezweni okubonakalayo TCP. Kwaye ukuba umntu uyazi indlela engcono - Wamkelekile.

UmSebenzi

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

Umthengi

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

isiphelo

Iinkqubo zokuqinisekisa ugqithiso lwedatha oluthembekileyo kunye nokusetyenziswa

Indlela
Isicelo, izimvo

Jonga isixa
Isetyenziselwa ukukhangela iimpazamo ezincinci kwipakethi ethunyelwayo

Isibali xesha
Ibala phantsi ikhefu lexesha kwaye ibonise xa liphelelwe lixesha. Okokugqibela kuthetha ukuba ngeqondo eliphezulu lokunokwenzeka ipakethe okanye irisithi yayo ilahleka ngexesha losulelo. Ukuba ipakethe ihanjiswa ngokulibaziseka, kodwa ayilahlekanga (ukuphelelwa kwangaphambi kwexesha lexesha lokuphuma), okanye irisithi ilahlekile, ukuhanjiswa kwakhona kukhokelela kwipakethi ephindwe kabini kwicala lokufumana.

Inombolo yesiriyeli
Isetyenziselwa ukubala amanani ngokulandelelana kweepakethi zedatha ezithunyelwa kumthumeli ukuya kumamkeli. Izikhewu kumanani olandelelwano lweepakethi ezifunyenweyo zivumela umamkeli ukuba abone ukulahleka kwepakethi. Amanani epakethe yolandelelwano olufanayo athetha ukuba iipakethi ziphindwe enye kwenye

Isiqinisekiso
Iveliswe ngokufumana isiphelo kwaye ibonise ekupheleni kokuthumela ukuba ipakethi ehambelanayo okanye iqela leepakethi lifunyenwe ngempumelelo. Ngokuqhelekileyo ukuvuma kuqulethe amanani olandelelwano lweepakethi ezifunyenwe ngempumelelo. Ngokuxhomekeke kwiprotocol, ukuqinisekiswa komntu kunye neqela kuyahlukaniswa

Uqinisekiso olubi
Isetyenziswe ngumamkeli ukwazisa umthumeli ukuba ipakethi ifunyenwe ngokungachanekanga. Ukuvuma okungalunganga ngokuqhelekileyo kubandakanya inombolo yolandelelwano lwepakethi engafunyanwanga ngokuchanekileyo

Ifestile, ukuhanjiswa
Nciphisa uluhlu lwamanani olandelelwano olunokusetyenziswa ukuthumela iipakethi. I-Multicast kunye nokuxhawula ngesandla kunokunyusa kakhulu iprotocol throughput xa kuthelekiswa nokulinda umbulelo. Njengoko siza kubona, ubungakanani befestile bungabalwa ngokusekwe kulwamkelo kunye nebuffering yesiphelo sokufumana, kunye nenqanaba lomthwalo womnatha.

Eminye imizekelo yokusebenzisa iGo for networking

В iindawo zokugcina.

umthombo: www.habr.com

Yongeza izimvo