Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Maka ndị na-achọ Raara onwe ya nye ịghọta netwọk na protocol.

Na nkenke

Isiokwu ahụ na-atụle isi nke nnyefe data a pụrụ ịdabere na ya, na-eme ihe atụ na Go, gụnyere UDP na TCP. Dabere na ugboro, два, atọ na akwụkwọ "Computer Networks. Top-Down Approach", ma ọ bụghị onye ọ bụla na-ekwurịta nanị Tannenbaum na Oliferov.

Ụgbọ njem oyi akwa protocol

Na-enye njikọ ezi uche dị na ya n'etiti usoro ngwa na-agba ọsọ na ndị ọbịa dị iche iche. Site na ngwa ngwa, njikọ ezi uche dị ka ọwa na-ejikọta usoro ozugbo.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Ụgbọ njem oyi akwa protocol Sistemu njedebe na-akwado, mana ọ bụghị ndị na-anya netwọkụ (ma ewezuga - DPI). N'akụkụ onye na-ezigara ya, oyi akwa njem na-atụgharị data oyi akwa ngwa ọ na-enweta site na usoro izipu n'ime ngwugwu oyi akwa a na-akpọ ngalaba.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

A na-eme nke a site n'ikewa (ọ bụrụ na ọ dị mkpa) ozi oyi akwa ngwa n'ime iberibe ma tinye nkụnye eji isi mee njem na nke ọ bụla n'ime ha.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Ihe oyi akwa njem na-agafe akụkụ ahụ na oyi akwa netwọk nke onye na-ezipụ, ebe a na-etinye akụkụ ahụ na ngwugwu oyi akwa netwọk (datagram) wee zipụ ya. Na njedebe nnata, oyi akwa netwọk na-ewepụ akụkụ oyi akwa njem site na datagram wee nyefee ya na oyi akwa njem. Na-esote, oyi akwa njem na-ahazi akụkụ enwetara ka data ya wee dịrị maka ngwa nnata.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Ụkpụrụ nke nnyefe data a pụrụ ịdabere na ya

Nbufe data ntụkwasị obi n'elu ọwa echekwara kpamkpam

Ikpe kacha mfe. Akụkụ na-ezigara naanị na-enweta data sitere na oyi akwa dị elu, mepụta ngwugwu nwere ya, ma ziga ya na ọwa.

Server

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

Ahịa

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

Nbufe data kwesịrị ntụkwasị obi n'elu ọwa nwere mperi enwere ike

Nzọụkwụ ọzọ bụ iche na a na-enweta ngwugwu niile ebugharị n'usoro nke ezigara ha, mana enwere ike imebi ibe n'ime ha n'ihi na ọwa na-ebufe data mgbe ụfọdụ na mgbagwoju anya.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

N'okwu a, a na-eji usoro ndị a:

  • nchọpụta njehie;
  • nzaghachi;
  • retransmission.

Usoro mbufe data ntụkwasị obi nwere usoro ndị yiri ya maka ikwugharị ọtụtụ oge ka a na-akpọ protocol Automatic Repeat reQuest (ARQ).
Tụkwasị na nke a, ọ bara uru ịtụle ohere nke njehie na nnata, mgbe onye na-anata ihe agaghị enweta ozi ọ bụla gbasara nsonaazụ nke nnyefe nke ngwugwu ikpeazụ.
Ihe ngwọta maka nsogbu a, nke a na-ejikwa na TCP, bụ ịgbakwunye oghere ọhụrụ na ngwugwu data nwere nọmba usoro nke ngwugwu ahụ.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Nbufe data a pụrụ ịdabere na ya n'elu ọwa enweghị ntụkwasị obi dabere na mgbagha na mfu ngwugwu

Tinyere mgbagha, ọ dị mwute ikwu, enwere mfu ngwugwu na netwọk.
Na iji dozie nsogbu a, a chọrọ usoro:

  • na-ekpebi eziokwu nke mfu ngwugwu;
  • enyeghachi nke ngwugwu furu efu n'aka ndị na-anata.

Tụkwasị na nke ahụ, na mgbakwunye na mfu nke ngwugwu ahụ, ọ dị mkpa ịnye maka ohere nke nkwụsị nke nnata ma ọ bụ, ọ bụrụ na ọ dịghị ihe efu, nnyefe ya na-egbu oge dị ukwuu. N'ọnọdụ ọ bụla, a na-eme otu ihe ahụ: a na-ebugharị ngwugwu ahụ. Iji chịkwaa oge, usoro a na-eji ngụ oge, nke na-enye gị ohere ikpebi njedebe nke oge nchere. Ya mere na ngwugwu net TCPKeepAlive atọrọ na 15 sekọnd na ndabara:

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

Akụkụ na-ezipụ kwesịrị ịmalite ngụ oge oge ọ bụla a na-ebufe ngwugwu (ma nke mbụ na nke abụọ), jikwaa nkwụsị site na ngụ oge wee kwụsị ya.

Yabụ, anyị amatala isi echiche nke usoro mbufe data a pụrụ ịdabere na ya:

  • checksum;
  • nọmba usoro nke ngwugwu;
  • oge;
  • nnata nke ọma na nke na-adịghị mma.

Ma nke ahụ abụghị naanị!

Usoro mbufe data a pụrụ ịdabere na ya na pipelining

N'ụdị dị iche iche anyị tụlerela, usoro nnyefe a pụrụ ịdabere na ya adịghị arụ ọrụ nke ukwuu. Ọ na-amalite "iji nwayọọ" nnyefe nke ọwa nkwurịta okwu na-enye ka RTT na-abawanye. Iji mee ka arụmọrụ ya dịkwuo mma ma jiri ikike ọwa nkwukọrịta rụọ ọrụ nke ọma, a na-eji pipelining.

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Iji pipelining na-eduga:

  • na-abawanye ọnụọgụ nke ọnụọgụ usoro, ebe ọ bụ na ngwugwu niile ezigara (ma e wezụga maka mbugharị) ga-abụrịrị ihe pụrụ iche;
  • mkpa na-abawanye buffers na-ekesa na-enweta n'akụkụ.

Ọnụọgụ ọnụọgụgụ usoro yana nha ihe nchekwa chọrọ dabere na omume nke protocol na-eme maka nrụrụ aka, mfu na igbu oge. N'ihe banyere pipelining, enwere ụzọ abụọ maka idozi njehie:

  • laghachi N ngwugwu azụ;
  • nhọrọ ugboro ugboro.

Ilaghachi ngwungwu N - protocol windo na-amị amị

Isi mmalite nke nnyefe data a pụrụ ịdabere na ya

Onye izipu ga-akwadorịrị ụdị mmemme atọ:

  • kpọọ site na protocol dị elu. Mgbe a na-akpọ ọrụ izipu data "site n'elu", akụkụ na-ezigara na-ebu ụzọ nyochaa ogo nke ndochi nke windo (ya bụ, ọnụnọ N zitere ozi na-echere nnata nke nnata). Ọ bụrụ na mpio ahụ tọgbọ chakoo, a na-emepụta ngwugwu ọhụrụ ma bufee ya, a na-emelite ụkpụrụ agbanwe agbanwe. Ma ọ bụghị ya, akụkụ ahụ na-ezipụ na-eweghachi data na oyi akwa dị elu, nke a bụ ihe ngosi doro anya na windo jupụtara. Dịka oyi akwa dị elu ga-anwa ibunye data ọzọ ka oge ụfọdụ gachara. Na ngwa n'ezie, onye na-ezipụ ya nwere ike chekwaa data ahụ (kama izipu ya ozugbo) ma ọ bụ nwee usoro mmekọrịta (dịka semaphore ma ọ bụ ọkọlọtọ) nke ga-eme ka oyi akwa elu kpọọ ọrụ izipu naanị mgbe windo tọhapụrụ. .
  • ịnata nkwenye. N'ime protocol, maka ngwugwu nwere nọmba usoro N, ewepụtara nkwenye n'ozuzu na-egosi na enwetara ngwugwu niile nwere nọmba usoro n'ihu N nke ọma.
  • Oge nchere agwụla. Iji chọpụta eziokwu nke mfu na igbu oge nke ngwugwu na nnata, protocol na-eji oge. Ọ bụrụ na oge nkwụsị oge agwụla, akụkụ na-ezipụ na-ezigara ngwugwu niile ezigara anabataghị.

Nkwughachi nhọrọ

Mgbe nha mpio ahụ na ngwa ngwa mgbasa ozi na-egbu oge buru ibu, ọnụ ọgụgụ buru ibu nke ngwugwu nwere ike ịdị na pipeline. N'ọnọdụ dị otú ahụ, otu njehie ngwugwu nwere ike ime ka a na-ebufe ọtụtụ ngwugwu, ọtụtụ n'ime ha achọghị.

Ihe nlele:

Nke kacha mma usoro iwu A na-anakọta omume na mmejuputa ihe bara uru TCP. Ma ọ bụrụ na mmadụ maara otú kacha mma - welcome.

Server

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

Ahịa

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

nkwubi

Usoro iji hụ na mbufe na ojiji data a pụrụ ịdabere na ya

Nhazi
Ngwa, ikwu okwu

Lelee nchikota
Eji achọpụta mperi mperi na ngwugwu ebufere

Ngụ oge
Na-agụta oge nkwụsịtụ ma gosi mgbe o kubiela. Nke ikpeazụ pụtara na n'ogo dị elu nke ihe gbasara nke puru omume, ngwugwu ma ọ bụ nnata ya na-efunahụ n'oge nnyefe. Ọ bụrụ na a na-ebunye ngwugwu na igbu oge, mana ọ naghị efu (njedebe oge agwụla agwụ), ma ọ bụ nnata efunahụ, nnyefe na-eduga na ngwugwu oyiri n'akụkụ nnata.

Nọmba usoro n'usoro
Ejiri ya maka usoro ọnụọgụ data nke ngwugwu data ebufere site na onye na-ezipụ gaa na onye nnata. Ọdịiche dị na nọmba usoro nke ngwugwu enwetara na-enye ohere ka onye nnata chọpụta mfu ngwugwu. Otu nọmba usoro ngwugwu pụtara na ngwugwu bụ oyiri nke ibe ya

Nkwenye
Emepụtara site na njedebe nnata ma na-egosi na njedebe izipu na enwetala nke ọma na ngwugwu ma ọ bụ otu ngwugwu kwekọrọ. Na-abụkarị nnabata ahụ nwere ọnụọgụ usoro nke ngwugwu enwetara nke ọma. Dabere na protocol, a na-amata nkwenye nke onye ọ bụla na otu

Nkwenye na-adịghị mma
Onye nnata na-eji mee ihe iji gwa onye zitere ya na enwetara ngwugwu ahụ ezighi ezi. Nkwenye na-adịghị mma na-agụnyekarị nọmba usoro nke ngwugwu ahụ enwetaghị nke ọma

Ohere, mbufe
Machie ọnụọgụ nke ọnụọgụ usoro enwere ike iji bufee ngwugwu. Multicast na mmaka aka nwere ike ịbawanye mmepụta protocol nke ukwuu ma e jiri ya tụnyere ichere nnabata. Dị ka anyị ga-ahụ, enwere ike gbakọọ nha mpio ahụ dabere na ikike nnabata na ntinye nke njedebe nnata, yana ọkwa ibu netwọkụ.

Ihe atụ ndị ọzọ nke iji Go maka ịkparịta ụka n'Ịntanet

В ebe nchekwa.

isi: www.habr.com

Tinye a comment