Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Si awon ti o n wa Igbẹhin si agbọye awọn nẹtiwọki ati awọn ilana.

Ni ṣoki

Nkan naa jiroro lori awọn ipilẹ ti gbigbe data igbẹkẹle, ṣe awọn apẹẹrẹ lori Go, pẹlu UDP ati TCP. Da lori igba, meji, mẹta ati awọn iwe "Computer Networks. Top-Down Approach", bibẹkọ ti gbogbo eniyan n jiroro nikan Tannenbaum ati Oliferov.

Transport Layer Ilana

Pese a mogbonwa asopọ laarin ohun elo lakọkọ nṣiṣẹ lori yatọ si ogun. Lati irisi ohun elo, asopọ ọgbọn kan dabi ikanni ti o sopọ awọn ilana taara.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Transport Layer Ilana ni atilẹyin nipasẹ awọn eto ipari, ṣugbọn kii ṣe nipasẹ awọn olulana nẹtiwọki (ayafi - DPI). Ni ẹgbẹ olufiranṣẹ, Layer gbigbe ṣe iyipada data Layer ohun elo ti o gba lati ilana fifiranṣẹ ohun elo sinu awọn apo-iwe Layer gbigbe ti a pe ni awọn apakan.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Eyi ni a ṣe nipasẹ pipin (ti o ba jẹ dandan) awọn ifiranṣẹ Layer ohun elo sinu awọn ajẹkù ati fifi akọle Layer gbigbe si ọkọọkan wọn.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Awọn irinna Layer ki o si koja awọn apa si awọn Olu ká nẹtiwọki Layer, ibi ti awọn apa ti wa ni encapsulated ni a nẹtiwọki Layer soso (datagram) ati ki o rán. Ni ipari gbigba, Layer netiwọki n yọkuro apa Layer gbigbe lati inu datagram ki o kọja si ipele gbigbe. Nigbamii, Layer gbigbe n ṣe ilana apakan ti o gba ki data rẹ wa si ohun elo gbigba.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Awọn ilana ti gbigbe data igbẹkẹle

Gbigbe data ti o gbẹkẹle lori ikanni ti o ni aabo patapata

Ọran ti o rọrun julọ. Ẹgbẹ ti n firanṣẹ nirọrun gba data lati ipele oke, ṣẹda apo kan ti o ni ninu, ati firanṣẹ si ikanni naa.

Olupin

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

Onibara

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

Gbigbe data ti o gbẹkẹle lori ikanni kan pẹlu awọn aṣiṣe ti o ṣeeṣe

Igbesẹ ti o tẹle ni lati ro pe gbogbo awọn apo-iwe ti a gbejade ni a gba ni aṣẹ ti a firanṣẹ wọn, ṣugbọn awọn die-die ninu wọn le bajẹ nitori otitọ pe ikanni ma n gbe data nigbagbogbo pẹlu awọn ipalọlọ.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Ni idi eyi, awọn ilana wọnyi ni a lo:

  • wiwa aṣiṣe;
  • esi;
  • retransmission.

Awọn ilana gbigbe data ti o gbẹkẹle ti o ni awọn ọna ṣiṣe ti o jọra fun atunwi gbigbe ni ọpọlọpọ igba ni a pe ni Awọn ilana Tuntun ReQuest (ARQ) Aifọwọyi.
Ni afikun, o tọ lati ṣe akiyesi iṣeeṣe ti awọn aṣiṣe ni awọn owo-owo, nigbati ẹgbẹ gbigba ko ni gba alaye eyikeyi nipa awọn abajade ti gbigbe ti apo-iwe ti o kẹhin.
Ojutu si iṣoro yii, ti a tun lo ni TCP, ni lati ṣafikun aaye tuntun si apo-iwe data ti o ni nọmba ọkọọkan ti apo-iwe naa.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Gbigbe data ti o gbẹkẹle lori ikanni ti ko ni igbẹkẹle koko ọrọ si ipadaru soso ati pipadanu

Paapọ pẹlu ipalọlọ, laanu, pipadanu soso wa ninu nẹtiwọọki.
Ati lati yanju iṣoro yii, awọn ilana nilo:

  • ti npinnu otitọ ti pipadanu soso;
  • tun-ifijiṣẹ ti sọnu awọn apo-iwe si awọn kẹta gbigba.

Ni afikun, ni afikun si isonu ti package, o jẹ dandan lati pese fun iṣeeṣe ti isonu ti gbigba tabi, ti ko ba si nkan ti o padanu, ifijiṣẹ rẹ pẹlu idaduro pataki. Ni gbogbo awọn ọran, ohun kanna ni a ṣe: apo-iwe naa tun gbejade. Lati ṣakoso akoko, ẹrọ yii nlo aago kika, eyiti o fun ọ laaye lati pinnu ipari ti aarin idaduro. Nitorina ninu package net TCPKeepAlive ti ṣeto si iṣẹju-aaya 15 nipasẹ aiyipada:

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

Ẹgbẹ fifiranṣẹ nilo lati bẹrẹ aago ni gbogbo igba ti soso kan ba ti gbejade (mejeeji akọkọ ati akoko keji), mu awọn idilọwọ lati aago ki o da duro.

Nitorinaa, a ti faramọ pẹlu awọn imọran bọtini ti awọn ilana gbigbe data igbẹkẹle:

  • checksums;
  • awọn nọmba ọkọọkan ti awọn idii;
  • awọn akoko;
  • rere ati odi owo.

Sugbon ti o ni ko gbogbo!

Ilana gbigbe data ti o gbẹkẹle pẹlu pipelining

Ninu iyatọ ti a ti gbero tẹlẹ, Ilana ifijiṣẹ igbẹkẹle jẹ ailagbara pupọ. O bẹrẹ lati "fa fifalẹ" gbigbe ti a pese nipasẹ ikanni ibaraẹnisọrọ bi RTT n pọ si. Lati mu iṣẹ ṣiṣe rẹ pọ si ati lo agbara ikanni ibaraẹnisọrọ dara julọ, a lo pipelining.

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Lilo pipelining yori si:

  • jijẹ awọn sakani ti awọn nọmba ọkọọkan, niwon gbogbo awọn apo-iwe ti a firanṣẹ (ayafi fun awọn gbigbe pada) gbọdọ jẹ idanimọ ni iyasọtọ;
  • iwulo lati mu awọn buffers pọ si lori gbigbe ati awọn ẹgbẹ gbigba.

Iwọn nọmba ọkọọkan ati awọn ibeere iwọn ifipamọ da lori awọn iṣe ti ilana naa ṣe ni idahun si ibajẹ apo, ipadanu, ati idaduro. Ninu ọran ti pipelining, awọn ọna meji wa fun atunṣe awọn aṣiṣe:

  • pada N awọn apo-iwe pada;
  • yiyan atunwi.

Nlọ pada awọn apo-iwe N - Ilana window sisun

Awọn ipilẹ ti Gbigbe Data Gbẹkẹle

Olufiranṣẹ gbọdọ ṣe atilẹyin awọn iru iṣẹlẹ mẹta:

  • pe nipasẹ ilana ipele ti o ga julọ. Nigbati iṣẹ fifiranṣẹ data ni a pe ni “lati oke”, ẹgbẹ fifiranṣẹ ni akọkọ ṣayẹwo iwọn ti kikun ti window (iyẹn ni, wiwa ti N firanṣẹ awọn ifiranṣẹ ti nduro gbigba awọn owo). Ti window ba ṣofo, apo tuntun kan ti ipilẹṣẹ ati gbigbe, ati awọn iye oniyipada ti ni imudojuiwọn. Bibẹẹkọ, ẹgbẹ ti n firanṣẹ pada data pada si ipele oke, ati pe eyi jẹ itọkasi ti ko tọ pe window ti kun. Ni igbagbogbo ipele oke yoo gbiyanju lati tan kaakiri data lẹẹkansi lẹhin igba diẹ. Ninu ohun elo gidi kan, olufiranṣẹ yoo ṣe ifipamọ data naa (dipo ti fifiranṣẹ lẹsẹkẹsẹ) tabi ni ẹrọ amuṣiṣẹpọ (bii semaphore tabi asia) ti yoo gba aaye oke lati pe iṣẹ fifiranṣẹ nikan nigbati window ba ṣofo .
  • gbigba ìmúdájú. Ninu ilana naa, fun apo-iwe kan pẹlu nọmba ọkọọkan N, ifọwọsi gbogbogbo ti wa ni idasilẹ ti n tọka pe gbogbo awọn apo-iwe pẹlu awọn nọmba ọkọọkan ti o ṣaju N ni a gba ni aṣeyọri.
  • aarin idaduro ti pari. Lati pinnu awọn otitọ ti awọn adanu ati awọn idaduro ti awọn apo-iwe ati awọn owo-owo, ilana naa nlo aago kan. Ti aarin akoko akoko ba pari, ẹgbẹ ti o nfiranṣẹ yoo firanṣẹ gbogbo awọn apo-iwe ti a ko gba.

Yiyan atunwi

Nigbati iwọn window ati ọja idaduro-sisọjade ba tobi, nọmba nla ti awọn apo-iwe le wa ninu opo gigun ti epo. Ni iru ọran bẹ, aṣiṣe apo-iwe kan le fa nọmba nla ti awọn apo-iwe lati tun gbejade, pupọ julọ eyiti ko nilo.

Apeere:

O ti dara ju o tumq si awọn iṣe ni a gba ni imuse iṣe TCP. Ati pe ti ẹnikan ba mọ bi o ṣe dara julọ - welcome.

Olupin

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

Onibara

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

ipari

Awọn ọna ẹrọ lati rii daju gbigbe data igbẹkẹle ati lilo

Ilana
Ohun elo, ọrọìwòye

Ṣayẹwo apao
Ti a lo lati ṣawari awọn aṣiṣe bit ninu apo ti a tan kaakiri

Aago
Ṣe iṣiro akoko aarin akoko ati tọkasi igba ti o ti pari. Igbẹhin tumọ si pe pẹlu iwọn giga ti iṣeeṣe ti soso tabi gbigba rẹ ti sọnu lakoko gbigbe. Ti soso kan ba jẹ jiṣẹ pẹlu idaduro, ṣugbọn ko padanu (ipari ipari ti aarin akoko akoko), tabi iwe-ẹri ti sọnu, gbigbejade yoo yorisi apo-iwe ẹda-iwe ni ẹgbẹ gbigba.

Nomba siriali
Ti a lo fun nọmba lẹsẹsẹ ti awọn apo-iwe data ti a gbejade lati olufiranṣẹ si olugba. Awọn ela ninu awọn nọmba ọkọọkan ti awọn apo-iwe ti o gba gba olugba laaye lati rii ipadanu soso. Awọn nọmba ọkọọkan apo-iwe kanna tumọ si pe awọn apo-iwe jẹ awọn ẹda-ara ti ara wọn

Ìmúdájú
Ti ipilẹṣẹ nipasẹ opin gbigba ati tọka si opin fifiranṣẹ pe apo-iwe ti o baamu tabi ẹgbẹ awọn apo-iwe ti gba ni aṣeyọri. Ni deede igbaduro ni awọn nọmba lẹsẹsẹ ti awọn apo-iwe ti o gba ni aṣeyọri ninu. Ti o da lori ilana naa, awọn ijẹrisi ẹni kọọkan ati ẹgbẹ jẹ iyatọ

Ìmúdájú odi
Ti a lo nipasẹ olugba lati sọ fun olufiranṣẹ pe a gba apo-iwe naa lọna ti ko tọ. Ifọwọsi odi nigbagbogbo pẹlu nọmba ọkọọkan ti apo-iwe ti ko gba ni deede

Ferese, conveyorization
Idinwo awọn sakani ti awọn nọmba ọkọọkan ti o le ṣee lo lati atagba awọn apo-iwe. Multicast ati ifọwọwọ le ṣe alekun iṣelọpọ ilana ni pataki ni akawe si iduro fun awọn ijẹwọ. Bii a yoo rii, iwọn window le ṣe iṣiro da lori gbigba ati awọn agbara buffering ti ipari gbigba, bakanna bi ipele fifuye nẹtiwọọki.

Awọn apẹẹrẹ diẹ sii ti lilo Go fun netiwọki

В awọn ibi ipamọ.

orisun: www.habr.com

Fi ọrọìwòye kun