Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Sa mga kinsa nangita Gipahinungod sa pagsabut sa mga network ug mga protocol.

Sa mubo

Ang artikulo naghisgot sa mga sukaranan sa kasaligan nga data transmission, nagpatuman sa mga panig-ingnan sa Go, lakip ang UDP ug TCP. Base sa mga panahon, duha ka, tulo ug ang mga libro nga "Computer Networks. Top-Down Approach", kung dili ang tanan naghisgot lamang sa Tannenbaum ug Oliferov.

Transport layer protocol

Naghatag usa ka lohikal nga koneksyon tali sa mga proseso sa aplikasyon nga nagdagan sa lainlaing mga host. Gikan sa perspektibo sa aplikasyon, ang usa ka lohikal nga koneksyon morag usa ka channel nga direktang nagkonektar sa mga proseso.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Mga protocol sa layer sa transportasyon gisuportahan sa mga sistema sa katapusan, apan dili sa mga router sa network (gawas sa - DPI). Sa bahin sa nagpadala, ang layer sa transportasyon nagbag-o sa data sa layer sa aplikasyon nga nadawat gikan sa proseso sa pagpadala sa aplikasyon ngadto sa mga pakete sa layer sa transportasyon nga gitawag nga mga bahin.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Gihimo kini pinaagi sa pagbahin (kon gikinahanglan) sa mga mensahe sa layer sa aplikasyon ngadto sa mga tipik ug pagdugang ug header sa transport layer sa matag usa niini.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Ang transport layer unya moagi sa bahin ngadto sa network layer sa nagpadala, diin ang bahin gisulod sa usa ka network layer packet (datagram) ug gipadala. Sa pagdawat nga katapusan, ang network layer nagkuha sa transport layer nga bahin gikan sa datagram ug gipasa kini sa transport layer. Sunod, giproseso sa layer sa transportasyon ang nadawat nga bahin aron ang datos niini magamit sa nakadawat nga aplikasyon.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Mga prinsipyo sa kasaligan nga pagpadala sa datos

Masaligan nga pagpadala sa datos sa usa ka hingpit nga luwas nga channel

Ang pinakasimple nga kaso. Ang nagpadala nga bahin makadawat ra sa datos gikan sa taas nga layer, maghimo usa ka pakete nga adunay sulud niini, ug ipadala kini sa channel.

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

Kustomer

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

Kasaligan nga pagpadala sa datos sa usa ka channel nga adunay posible nga mga sayup

Ang sunod nga lakang mao ang paghunahuna nga ang tanan nga gipasa nga mga pakete nadawat sa han-ay kung diin sila gipadala, apan ang mga tipik niini mahimong madaot tungod sa kamatuoran nga ang channel usahay nagpadala sa datos nga adunay mga pagtuis.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Sa kini nga kaso, ang mga mosunud nga mekanismo gigamit:

  • pag-ila sa sayop;
  • feedback;
  • retransmission.

Ang kasaligan nga mga protocol sa pagbalhin sa datos nga adunay parehas nga mga mekanismo alang sa pagsubli sa transmission sa daghang beses gitawag nga mga protocol sa Automatic Repeat reQuest (ARQ).
Dugang pa, angay nga hunahunaon ang posibilidad sa mga sayup sa mga resibo, kung ang nakadawat nga partido dili makadawat bisan unsang kasayuran bahin sa mga sangputanan sa pagbalhin sa katapusan nga pakete.
Ang solusyon niini nga problema, nga gigamit usab sa TCP, mao ang pagdugang og bag-ong field sa data packet nga naglangkob sa sequence number sa packet.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Masaligan nga pagpadala sa datos sa usa ka dili kasaligan nga channel nga gipailalom sa pagtuis ug pagkawala sa pakete

Uban sa pagtuis, sa kasubo, adunay pagkawala sa packet sa network.
Ug aron masulbad kini nga problema, gikinahanglan ang mga mekanismo:

  • pagtino sa kamatuoran sa packet loss;
  • re-delivery sa nawala nga mga pakete ngadto sa nakadawat nga partido.

Dugang pa, agig dugang sa pagkawala sa pakete, kinahanglan nga maghatag alang sa posibilidad nga mawala ang resibo o, kung wala’y nawala, ang paghatud niini nga adunay usa ka hinungdanon nga paglangan. Sa tanan nga mga kaso, parehas nga butang ang nahimo: ang pakete gipasa pag-usab. Aron makontrol ang oras, kini nga mekanismo naggamit usa ka countdown timer, nga nagtugot kanimo nga mahibal-an ang katapusan sa agwat sa paghulat. Busa sa package pukot Ang TCPKeepAlive gitakda sa 15 segundos pinaagi sa default:

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

Ang nagpadala nga bahin kinahanglan nga magsugod sa usa ka timer sa matag higayon nga ang usa ka pakete ipadala (sa una ug sa ikaduha nga higayon), pagdumala sa mga pagkabalda gikan sa timer ug ihunong kini.

Mao nga, pamilyar na kami sa mga yawe nga konsepto sa kasaligan nga mga protocol sa pagbalhin sa datos:

  • mga checksum;
  • han-ay nga gidaghanon sa mga pakete;
  • mga timer;
  • positibo ug negatibo nga mga resibo.

Apan dili lang kana!

Kasaligan nga data transfer protocol nga adunay pipelining

Sa variant nga ato nang gikonsiderar, ang kasaligan nga delivery protocol dili kaayo epektibo. Nagsugod kini sa "paghinay" sa transmission nga gihatag sa channel sa komunikasyon samtang ang RTT nagdugang. Aron madugangan ang kahusayan niini ug mas maayo nga magamit ang kapasidad sa channel sa komunikasyon, gigamit ang pipelining.

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Ang paggamit sa pipelining mosangpot sa:

  • pagdugang sa han-ay sa mga numero sa han-ay, tungod kay ang tanan nga gipadala nga mga pakete (gawas sa retransmissions) kinahanglan nga talagsaon nga mailhan;
  • ang panginahanglan sa pagdugang sa mga buffer sa transmitting ug pagdawat nga mga kilid.

Ang sequence number range ug buffer size nga mga kinahanglanon nagdepende sa mga aksyon nga gihimo sa protocol isip tubag sa packet corruption, loss, ug delay. Sa kaso sa pipelining, adunay duha ka pamaagi sa pagtul-id sa mga sayup:

  • ibalik ang N nga mga pakete balik;
  • pinili nga pagbalik-balik.

Pagbalik sa N packet - sliding window protocol

Mga Sukaranan sa Kasaligang Pagbalhin sa Data

Ang nagpadala kinahanglang mosuporta sa tulo ka matang sa mga panghitabo:

  • tawag sa mas taas nga lebel nga protocol. Kung ang function sa pagpadala sa datos gitawag nga "gikan sa taas", ang kilid sa pagpadala una nga nagsusi sa lebel sa pagpuno sa bintana (nga mao, ang presensya sa N gipadala nga mga mensahe nga naghulat sa resibo sa mga resibo). Kung ang bintana walay sulod, usa ka bag-ong pakete ang gihimo ug gipasa, ug ang mga variable nga kantidad gi-update. Kung dili, ang pagpadala nga bahin nagbalik sa datos sa ibabaw nga layer, ug kini usa ka implicit nga timailhan nga ang bintana puno. Kasagaran ang ibabaw nga layer mosulay sa pagpadala sa data pag-usab human sa pipila ka panahon. Sa usa ka tinuod nga aplikasyon, ang nagpadala lagmit nga mag-buffer sa datos (imbes ipadala dayon) o adunay mekanismo sa pag-synchronize (sama sa semaphore o bandila) nga magtugot sa taas nga layer nga tawagan ang function sa pagpadala kung wala’y sulod ang bintana. .
  • pagdawat sa kumpirmasyon. Sa protocol, para sa usa ka packet nga adunay sequence number N, usa ka general acknowledgement ang gi-isyu nga nagpakita nga ang tanang packet nga adunay sequence number nga nag-una sa N malampuson nga nadawat.
  • ang agwat sa paghulat natapos na. Aron mahibal-an ang mga kamatuoran sa mga pagkawala ug mga paglangan sa mga pakete ug mga resibo, ang protocol naggamit sa usa ka timer. Kung ang agwat sa timeout matapos, ang nagpadala nga bahin ipadala pag-usab ang tanan nga gipadala nga wala mailhi nga mga pakete.

Pinili nga pagsubli

Kung ang gidak-on sa bintana ug ang throughput-propagation delay nga produkto dako, daghang mga pakete ang mahimong anaa sa pipeline. Sa ingon nga kaso, ang usa ka sayup nga packet mahimong hinungdan sa daghang gidaghanon sa mga pakete nga ipadala pag-usab, kadaghanan niini wala kinahanglana.

Pananglitan:

Ang labing kaayo teoretikal Ang mga praktis gikolekta sa praktikal nga pagpatuman TCP. Ug kung adunay nahibal-an kung unsa ang labing kaayo - 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"))
    }
}

Kustomer

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

konklusyon

Mga mekanismo aron masiguro ang kasaligan nga pagbalhin sa datos ug paggamit

Mekanismo
Aplikasyon, komento

Susihon ang sum
Gigamit aron makit-an ang mga sayup nga gamay sa usa ka gipasa nga pakete

Timer
Nag-ihap sa agwat sa timeout ug nagpakita kung kanus-a kini na-expire. Ang ulahi nagpasabut nga adunay taas nga lebel sa posibilidad nga ang pakete o ang resibo niini nawala sa panahon sa transmission. Kung ang usa ka pakete ipadala uban ang usa ka paglangan, apan wala mawala (ahat nga expiration sa timeout interval), o ang usa ka resibo nawala, retransmission modala ngadto sa usa ka duplicate packet sa pagdawat nga bahin

Serial nga numero
Gigamit alang sa sunod-sunod nga pag-numero sa mga pakete sa datos nga gipadala gikan sa nagpadala ngadto sa nakadawat. Ang mga kal-ang sa han-ay nga mga numero sa nadawat nga mga pakete nagtugot sa tigdawat nga makamatikod sa pagkawala sa packet. Ang parehas nga mga numero sa han-ay sa pakete nagpasabut nga ang mga pakete mga duplicate sa usag usa

Pagkumpirma
Nahimo pinaagi sa pagdawat nga katapusan ug nagpakita sa pagpadala nga katapusan nga ang katugbang nga pakete o grupo sa mga pakete malampuson nga nadawat. Kasagaran ang pag-ila naglangkob sa han-ay nga mga numero sa malampuson nga nadawat nga mga pakete. Depende sa protocol, ang mga pagkumpirma sa indibidwal ug grupo gipalahi

Negatibo nga kumpirmasyon
Gigamit sa tigdawat sa pagpahibalo sa nagpadala nga ang pakete nadawat nga dili husto. Ang negatibo nga pag-ila kasagaran naglakip sa sequence number sa packet nga dili husto nga nadawat

Window, conveyorization
Limitahi ang han-ay sa mga sequence number nga magamit sa pagpadala sa mga packet. Ang multicast ug handshake mahimo nga madugangan ang protocol throughput kumpara sa paghulat alang sa mga pagkilala. Sama sa atong makita, ang gidak-on sa bintana mahimong kalkulado base sa pagdawat ug mga kapabilidad sa buffering sa pagdawat nga katapusan, ingon man ang lebel sa pagkarga sa network.

Dugang nga mga pananglitan sa paggamit sa Go para sa networking

В mga tipiganan.

Source: www.habr.com

Idugang sa usa ka comment