Bunús an Aistrithe Sonraí Iontaofa

Bunús an Aistrithe Sonraí Iontaofa

Dóibh siúd a lorgaíonn Tiomnaithe chun líonraí agus prótacail a thuiscint.

Go hachomair

Pléann an t-alt na bunghnéithe tarchur sonraí iontaofa, cuireann sé samplaí i bhfeidhm ar Go, lena n-áirítear UDP agus TCP. Bunaithe ar am, два, trí agus na leabhair "Computer Networks. Barr-Síos Cur Chuige", ar shlí eile tá gach duine ag plé ach Tannenbaum agus Oliferov.

Prótacal ciseal iompair

Soláthraíonn sé nasc loighciúil idir próisis iarratais a ritheann ar óstaigh éagsúla. Ó thaobh feidhmchláir de, is cosúil le nasc loighciúil cainéal a nascann próisis go díreach.

Bunús an Aistrithe Sonraí Iontaofa

Prótacail ciseal iompair tacaithe ag córais deiridh, ach ní ag ródairí líonra (seachas - Pso). Ar thaobh an tseoltóra, athraíonn an ciseal iompair na sonraí ciseal iarratais a fhaigheann sé ón bpróiseas iarratais seolta isteach i bpacáistí ciseal iompair ar a dtugtar deighleoga.

Bunús an Aistrithe Sonraí Iontaofa

Déantar é seo trí na teachtaireachtaí ciseal iarratais a roinnt (más gá) ina blúirí agus ceanntásc ciseal iompair a chur le gach ceann acu.

Bunús an Aistrithe Sonraí Iontaofa

Ansin téann an ciseal iompair an deighleog chuig ciseal líonra an tseoltóra, áit a bhfuil an deighleog cuimsithe i bpaicéad ciseal líonra (datagram) agus á sheoladh. Ag an deireadh glactha, baintear an ciseal líonra deighleog an chiseal iompair as an datagram agus cuireann sé suas go dtí an ciseal iompair é. Ansin, déanann an ciseal iompair an deighleog faighte a phróiseáil ionas go mbeidh a sonraí ar fáil don fheidhmchlár glactha.

Bunús an Aistrithe Sonraí Iontaofa

Prionsabail maidir le tarchur sonraí iontaofa

Tarchur sonraí iontaofa thar chainéal iomlán slán

An cás is simplí. Faigheann an taobh seolta na sonraí go simplí ón gciseal uachtarach, cruthaíonn sé paicéad ina bhfuil sé, agus cuireann sé chuig an gcainéal é.

Freastalaí

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

Custaiméir

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

Tarchur sonraí iontaofa thar chainéal le hearráidí féideartha

Is é an chéad chéim eile glacadh leis go bhfaightear na paicéid tarchurtha go léir san ord inar seoladh iad, ach d'fhéadfadh na giotán atá iontu a bheith truaillithe mar gheall ar an bhfíric go dtarchuireann an cainéal sonraí uaireanta le saobhadh.

Bunús an Aistrithe Sonraí Iontaofa

Sa chás seo, úsáidtear na meicníochtaí seo a leanas:

  • earráid a bhrath;
  • aiseolas;
  • atarchur.

Tugtar prótacail um Iarratas Aisghairm Uathoibríoch (ARQ) ar phrótacail aistrithe sonraí iontaofa a bhfuil meicníochtaí comhchosúla acu chun tarchur a dhéanamh arís agus arís eile.
Ina theannta sin, is fiú smaoineamh ar an bhféidearthacht go bhfuil earráidí i bhfáltais, nuair nach bhfaighidh an páirtí glactha aon fhaisnéis faoi thorthaí aistriú an phacéid dheireanach.
Is é an réiteach ar an bhfadhb seo, a úsáidtear freisin in TCP, ná réimse nua a chur leis an bpaicéad sonraí ina bhfuil seicheamh uimhir an phaicéid.

Bunús an Aistrithe Sonraí Iontaofa

Tarchur sonraí iontaofa thar chainéal neamhiontaofa faoi réir saobhadh agus caillteanas paicéid

Mar aon le saobhadh, ar an drochuair, tá caillteanas paicéad sa líonra.
Agus chun an fhadhb seo a réiteach, tá gá le meicníochtaí:

  • cinneadh a dhéanamh maidir le caillteanas paicéid;
  • paicéid caillte a athsheachadadh chuig an gcóisir glactha.

Ina theannta sin, de bhreis ar an bpacáiste a chailleadh, is gá foráil a dhéanamh maidir leis an bhféidearthacht go gcaillfear an admháil nó, mura gcailltear aon rud, go gcuirfí moill shuntasach ar an seachadadh. I ngach cás, déantar an rud céanna: ath-tarchuirtear an paicéad. Chun am a rialú, úsáideann an meicníocht seo lasc ama comhaireamh síos, a ligeann duit deireadh an eatramh feithimh a chinneadh. Mar sin sa phacáiste glan Tá TCPKeepAlive socraithe go 15 soicind de réir réamhshocraithe:

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

Caithfidh an taobh seolta lasc ama a thosú gach uair a tharchuirtear paicéad (an chéad uair agus an dara huair), cuir isteach ar an lasc ama a láimhseáil agus é a stopadh.

Mar sin, tá cur amach againn ar phríomhchoincheapa na bprótacal aistrithe sonraí iontaofa:

  • seiceálacha;
  • seicheamh uimhreacha na bpacáistí;
  • amadóirí;
  • fáltais dearfacha agus diúltacha.

Ach ní hé sin go léir!

Prótacal aistrithe sonraí iontaofa le píblíneáil

Sa leagan atá curtha san áireamh againn cheana féin, tá an prótacal seachadta iontaofa an-mhí-éifeachtach. Tosaíonn sé ag “moilliú” an tarchur a sholáthraíonn an cainéal cumarsáide de réir mar a mhéadaíonn an RTT. Chun a éifeachtúlacht a mhéadú agus cumas an chainéil chumarsáide a úsáid níos fearr, úsáidtear píblíne.

Bunús an Aistrithe Sonraí Iontaofa

Is é an toradh a bhíonn ar úsáid píblíne ná:

  • raon na n-uimhreacha seichimh a mhéadú, ós rud é go gcaithfear gach paicéad a sheoltar (seachas ath-tarchur) a shainaithint go huathúil;
  • an gá atá le maoláin a mhéadú ar na taobhanna tarchuir agus glactha.

Braitheann raon uimhreacha seichimh agus riachtanais mhéid maoláin ar na gníomhartha a dhéanann an prótacal mar fhreagra ar éilliú paicéid, caillteanas agus moill. I gcás píblíne, tá dhá mhodh ann chun earráidí a cheartú:

  • cuir N paicéid ar ais;
  • athrá roghnach.

Ag dul ar ais N paicéid - prótacal fuinneoige sleamhnáin

Bunús an Aistrithe Sonraí Iontaofa

Ní mór don seoltóir tacú le trí chineál imeachtaí:

  • glaoch trí phrótacal ardleibhéil. Nuair a thugtar “ó thuas” ar an bhfeidhm seolta sonraí, seiceálann an taobh seolta ar dtús an méid a chomhlánaítear an fhuinneog (is é sin, láithreacht N teachtaireachtaí a sheoltar ag fanacht le hadmhálacha a fháil). Má tá an fhuinneog folamh, gintear agus tarchuirtear paicéad nua, agus déantar na luachanna athraitheacha a nuashonrú. Seachas sin, cuireann an taobh seolta sonraí ar ais chuig an gciseal uachtarach, agus is léiriú intuigthe é seo go bhfuil an fhuinneog lán. De ghnáth déanfaidh an ciseal uachtarach iarracht na sonraí a tharchur arís tar éis roinnt ama. I bhfíor-fheidhmchlár, is dócha go ndéanfadh an seoltóir na sonraí a mhaolánú (in ionad iad a sheoladh láithreach) nó go mbeadh meicníocht sioncrónaithe aige (cosúil le semaphore nó bratach) a cheadódh don tsraith uachtarach an fheidhm seolta a ghlaoch ach amháin nuair a bhíonn an fhuinneog folamh .
  • ag fáil deimhniú. Sa phrótacal, maidir le paicéad ar a bhfuil seicheamh uimhir N, eisítear admháil ghinearálta a thugann le fios gur éirigh leis na paicéid go léir a bhfuil seicheamhuimhreacha orthu roimh N a fháil.
  • tá an t-eatramh feithimh imithe in éag. Chun fíricí caillteanais agus moilleanna paicéid agus admhálacha a chinneadh, úsáideann an prótacal lasc ama. Má théann an t-eatramh teorainn ama in éag, athsheolfaidh an taobh seolta gach paicéad neamhadmhaithe a sheoltar.

Athrá roghnach

Nuair a bhíonn méid na fuinneoige agus an táirge moille tréchur-iomadaithe mór, féadfaidh líon mór paicéid a bheith ar an bpíblíne. I gcás den sórt sin, d'fhéadfadh earráid i bpaicéad aonair a bheith ina chúis le líon mór paicéid a ath-tharchur, agus níor ghá an chuid is mó díobh.

Sampla

Barr teoiriciúil bailítear cleachtais i gcur i bhfeidhm praiticiúil TCP. Agus má tá a fhios ag duine conas is fearr - fáilte a chur roimh.

Freastalaí

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

Custaiméir

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

Aschur

Meicníochtaí chun aistriú agus úsáid sonraí iontaofa a chinntiú

Meicníocht
Iarratas, trácht

Seiceáil suim
Úsáidtear é chun earráidí giotán a bhrath i bpaicéad tarchurtha

Timer
Comhaireamh síos an t-eatramh ama agus cuireann sé in iúl cathain a chuaigh sé in éag. Ciallaíonn an dara ceann go bhfuil an-dóchúlacht ann go gcailltear an paicéad nó a admháil le linn tarchurtha. Má sheachadtar paicéad le moill, ach mura gcailltear é (dul in éag roimh am don eatramh am istigh), nó má chailltear admháil, beidh paicéad dúblach ar an taobh glactha mar thoradh ar atarchur

Sraithuimhir
Úsáidtear é le haghaidh uimhriú seicheamhach ar phacáistí sonraí a tharchuirtear ón seoltóir go dtí an faighteoir. Ligeann bearnaí sa seicheamh líon na bpacáistí faighte don ghlacadóir caillteanas paicéad a bhrath. Ciallaíonn na huimhreacha seicheamh paicéad céanna gur dúbailt dá chéile iad na paicéid

Daingniú
Ginte ag an deireadh glactha agus a thugann le fios don deireadh seolta go bhfuil an paicéad nó an grúpa paicéad comhfhreagrach faighte go rathúil. Go hiondúil tá seicheamh-uimhreacha na bpacáistí a fuarthas go rathúil san admháil. Ag brath ar an bprótacal, déantar idirdhealú a dhéanamh ar dheimhnithe aonair agus grúpa

Deimhniú diúltach
Úsáidte ag an bhfaighteoir chun a chur in iúl don seoltóir go bhfuarthas an paicéad go mícheart. Cuimsíonn admháil dhiúltach de ghnáth uimhir sheicheamh an phaicéad nach bhfuarthas i gceart

Fuinneog, iompar
Teorainn a chur le raon na n-uimhreacha seicheamh is féidir a úsáid chun paicéid a tharchur. Is féidir le ilchraoladh agus croitheadh ​​láimhe an tréchur prótacail a mhéadú go suntasach i gcomparáid le fanacht le hadmhálacha. Mar a fheicfimid, is féidir méid na fuinneoige a ríomh bunaithe ar chumais glactha agus maoláin an deireadh glactha, chomh maith leis an leibhéal ualach líonra

Tuilleadh samplaí d’úsáid Go le haghaidh líonrú

В stórtha.

Foinse: will.com

Ceannaigh óstáil iontaofa do shuímh le cosaint DDoS, freastalaithe VPS VDS 🔥 Ceannaigh óstáil gréasáin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster