Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

I ka poe ʻimi Hoʻolaʻa ʻia i ka ʻike ʻana i nā pūnaewele a me nā protocols.

Ka-pōkole

Kūkākūkā ka ʻatikala i nā kumu o ka lawe ʻana i ka ʻikepili hilinaʻi, hoʻokō i nā hiʻohiʻona ma Go, me ka UDP a me TCP. Ma muli o manawa, mau, ekolu a me nā puke "Computer Networks. Top-Down Approach", iʻole e kūkākūkā nā mea a pau iā Tannenbaum a me Oliferov wale nō.

ʻO ka protocol layer transport

Hāʻawi i kahi pilina pili ma waena o nā kaʻina noi e holo ana ma nā pūʻali like ʻole. Mai kahi hiʻohiʻona noiʻi, ʻike ʻia kahi pilina pili i kahi ala e hoʻopili pololei i nā kaʻina hana.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

ʻO nā protocols layer transport kākoʻo ʻia e nā ʻōnaehana hoʻopau, akā ʻaʻole e nā mea hoʻokele pūnaewele (koe naʻe - DPI). Ma ka ʻaoʻao hoʻouna, hoʻololi ka papa lawe i ka ʻikepili papa noi i loaʻa iā ia mai ka hoʻouna ʻana i ke kaʻina noi i loko o nā ʻeke ʻāpana transport i kapa ʻia nā ʻāpana.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

Hana ʻia kēia ma ka hoʻokaʻawale ʻana (inā pono) nā memo papa noi i nā ʻāpana a me ka hoʻohui ʻana i kahi poʻomanaʻo papa lawe i kēlā me kēia.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

A laila hele ka ʻāpana lawe i ka ʻāpana i ka ʻaoʻao pūnaewele o ka mea hoʻouna, kahi i hoʻopili ʻia ai ka ʻāpana i loko o kahi ʻeke papa pūnaewele (datagram) a hoʻouna ʻia. Ma ka hopena o ka loaʻa ʻana, hoʻokaʻawale ka ʻaoʻao pūnaewele i ka ʻāpana transport layer mai ka datagram a hāʻawi iā ia i ka papa lawe. ʻO ka hope aʻe, ke kaʻina o ka ʻāpana transport i ka ʻāpana i loaʻa i hiki i kāna ʻikepili ke loaʻa i ka noi e loaʻa.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

Nā kumumanaʻo o ka hoʻoili ʻikepili hilinaʻi

Hoʻouna ʻikepili hilinaʻi ma luna o kahi ala paʻa paʻa

ʻO ka hihia maʻalahi. ʻO ka ʻaoʻao hoʻouna e loaʻa wale i ka ʻikepili mai ka papa luna, hana i kahi ʻeke i loko o ia mea, a hoʻouna i ke kahawai.

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

Mea kūʻai aku

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

ʻO ka hoʻouna ʻana i ka ʻikepili hilinaʻi ma luna o kahi ala me nā hewa

ʻO ka hana aʻe, ʻo ia ka manaʻo ua loaʻa nā ʻeke a pau i hoʻouna ʻia ma ke ʻano i hoʻouna ʻia ai, akā hiki ke hoʻopōʻino ʻia nā bits i loko o ia mau mea ma muli o ka hoʻouna ʻana o ke kahawai i nā ʻikepili me nā distortions.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

I kēia hihia, hoʻohana ʻia nā ʻōnaehana penei:

  • ʻike hewa;
  • manaʻo manaʻo;
  • hoʻouna hou.

Ua kapa ʻia nā protocols hoʻoili ʻikepili hilinaʻi i loaʻa nā ʻano like no ka hoʻihoʻi hou ʻana i nā manawa he nui i kapa ʻia ʻo Automatic Repeat ReQuest (ARQ).
Eia kekahi, pono e noʻonoʻo i ka hiki ʻana o nā hewa i nā loaʻa, i ka wā e loaʻa ʻole ai ka ʻike e pili ana i ka hopena o ka hoʻoili ʻana o ka ʻeke hope.
ʻO ka hoʻonā i kēia pilikia, hoʻohana pū ʻia ma TCP, ʻo ia ke hoʻohui i kahi kahua hou i ka ʻeke ʻikepili i loaʻa ka helu kaʻina o ka ʻeke.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

ʻO ka hoʻouna ʻana i ka ʻikepili hilinaʻi ma luna o kahi ala hilinaʻi ʻole e pili ana i ka distortion packet a me ka nalowale

Me ka distortion, ʻaʻole naʻe, aia ka poho packet i ka pūnaewele.
A no ka hoʻoponopono ʻana i kēia pilikia, pono nā mīkini:

  • ka hoʻoholo ʻana i ka ʻoiaʻiʻo o ka poho ʻeke;
  • ka hoʻouna hou ʻana i nā ʻeke i nalowale i ka ʻaoʻao e loaʻa ana.

Eia kekahi, ma kahi o ka nalowale o ka pōʻai, pono ia e hāʻawi i ka hiki ke nalowale o ka loaʻa a i ʻole, inā ʻaʻohe mea i nalowale, ʻo kona hāʻawi ʻana me ka lohi nui. I nā hihia a pau, hana ʻia ka mea like: hoʻouna hou ʻia ka ʻeke. No ka mālama ʻana i ka manawa, hoʻohana kēia mīkini i kahi helu helu helu, hiki iā ʻoe ke hoʻoholo i ka hopena o ka wā kali. No laila i loko o ka pūʻolo upena Hoʻonohonoho ʻia ʻo TCPKeepAlive i 15 kekona ma ka paʻamau:

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

Pono ka ʻaoʻao hoʻouna e hoʻomaka i ka manawa i kēlā me kēia manawa e hoʻouna ʻia kahi ʻeke (ʻo ka mua a me ka lua o ka manawa), e mālama i nā keakea mai ka manawa a hoʻōki.

No laila, ua kamaʻāina mākou i nā manaʻo koʻikoʻi o nā protocols hoʻoili ʻikepili hilinaʻi:

  • checksums;
  • helu helu o nā pūʻolo;
  • nā manawa;
  • loaʻa maikaʻi a maikaʻi ʻole.

Akā ʻaʻole ʻo ia wale nō!

ʻO ka protocol hoʻoili ʻikepili hilinaʻi me ka pipelining

Ma ka ʻano like ʻole a mākou i noʻonoʻo ai, ʻaʻole pono ka protocol delivery pono. Hoʻomaka ia e "hoʻolohi" i ka hoʻouna ʻana i hāʻawi ʻia e ke ala kamaʻilio me ka piʻi ʻana o ka RTT. No ka hoʻonui ʻana i ka pono a me ka hoʻohana maikaʻi ʻana i ka hiki ke ala kamaʻilio, hoʻohana ʻia ka pipelining.

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

ʻO ka hoʻohana ʻana i ka pipelining e alakaʻi i:

  • e hoʻonui i ka laulā o nā helu kaʻina, no ka mea, pono e ʻike kūʻokoʻa nā ʻeke i hoʻouna ʻia (koe wale no ka hoʻouna hou ʻana);
  • ka pono e hoʻonui i nā pale ma nā ʻaoʻao hoʻouna a loaʻa.

ʻO ka laula helu kaʻina a me nā koi nui buffer e pili ana i nā hana a ka protocol e pane ai i ka palaho packet, nalowale, a me ka lohi. I ka hihia o ka pipelining, ʻelua mau ala no ka hoʻoponopono ʻana i nā hewa:

  • e hoʻihoʻi i nā ʻeke N;
  • koho hou ana.

Ke hoʻi hou nei i nā ʻeke N - kaʻina o ka puka aniani

Nā Kuleana o ka Hoʻoili ʻikepili hilinaʻi

Pono ka mea hoʻouna e kākoʻo i ʻekolu ʻano hanana:

  • kelepona ʻia e kahi protocol pae kiʻekiʻe. Ke kapa ʻia ka hana hoʻouna ʻikepili "mai luna", e nānā mua ka ʻaoʻao hoʻouna i ke kiʻekiʻe o ka hoʻopiha ʻana i ka puka makani (ʻo ia hoʻi, ʻo ka hele ʻana o nā memo i hoʻouna ʻia e kali ana i ka loaʻa ʻana o nā loaʻa). Inā haʻahaʻa ka puka makani, hana ʻia kahi ʻeke hou a hoʻouna ʻia, a hoʻonui ʻia nā waiwai hoʻololi. Inā ʻaʻole, e hoʻihoʻi ka ʻaoʻao hoʻouna i ka ʻikepili i ka papa luna, a he hōʻailona hōʻoia kēia ua piha ka puka makani. ʻO ka maʻamau e hoʻāʻo ka papa luna e hoʻouna hou i ka ʻikepili ma hope o kekahi manawa. Ma kahi noi maoli, e hoʻopaʻa paha ka mea hoʻouna i ka ʻikepili (ma kahi o ka hoʻouna koke ʻana iā ia) a i ʻole he ʻano hana hoʻonohonoho (e like me ka semaphore a i ʻole ka hae) e hiki ai i ka papa luna ke kāhea i ka hana hoʻouna wale nō ke kaʻawale ka puka makani. .
  • e loaa ana ka hooiaio ana. I loko o ka protocol, no kahi ʻeke me ka helu kaʻina N, ua hoʻopuka ʻia kahi hōʻoia nui e hōʻike ana ua loaʻa maikaʻi nā ʻeke āpau me nā helu kaʻina ma mua o N.
  • ua pau ka manawa kali. No ka hoʻoholo i nā ʻoiaʻiʻo o nā poho a me nā lohi o nā ʻeke a me nā loaʻa, hoʻohana ka protocol i kahi manawa. Inā pau ka manawa manawa, hoʻouna hou ka ʻaoʻao hoʻouna i nā ʻeke i hoʻouna ʻole ʻia.

Ka hana hou koho

Ke nui ka nui o ka puka makani a me ka huahana hoʻopaneʻe throughput-propagation, hiki i ka nui o nā ʻeke i ka pipeline. Ma ia ʻano, hiki i ka hewa packet hoʻokahi ke kumu e hoʻouna hou ʻia ka nui o nā ʻeke, ʻaʻole koi ʻia ka hapa nui.

Pākuhi:

Ka 'oi aʻe manaʻo manaʻo практики собраны в практической реализации TCP. A inā ʻike kekahi i ka maikaʻi loa - Welina.

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

Mea kūʻai aku

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

hopena

Mechanisms e hōʻoia i ka hoʻololi a me ka hoʻohana pono ʻana

Hana
Noi, olelo

Nānā huina
Hoʻohana ʻia e ʻike i nā hewa bit i loko o kahi ʻeke i hoʻouna ʻia

Wā paʻa manawa
E helu ana i ka manawa hoʻomaha a hōʻike i ka wā i pau ai. ʻO ke ʻano o ka mea hope, me ke kiʻekiʻe kiʻekiʻe o ka hiki ke nalowale ka ʻeke a i ʻole ka loaʻa ʻana i ka wā o ka lawe ʻana. Inā hāʻawi ʻia kahi ʻeke me ka lohi, akā ʻaʻole i nalowale (ka pau ʻana o ka manawa hoʻomaha), a i ʻole nalo ka loaʻa, alakaʻi ka hoʻouna hou ʻana i kahi ʻeke pālua ma ka ʻaoʻao e loaʻa.

Helu
Hoʻohana ʻia no ka helu helu ʻana o nā ʻeke ʻikepili i hoʻouna ʻia mai ka mea hoʻouna i ka mea loaʻa. Hiki i ka mea lawe ke ʻike i ka nalowale o ka ʻeke. ʻO nā helu kaʻina packet hoʻokahi, ʻo ia hoʻi, ʻo nā ʻeke he kope o kekahi i kekahi

Hōʻoia
Hana ʻia e ka hopena loaʻa a hōʻike i ka hopena hoʻouna ua loaʻa maikaʻi ka ʻeke a i ʻole ka hui o nā ʻeke. ʻO ka mea maʻamau, loaʻa i ka hōʻoia nā helu kaʻina o nā ʻeke i loaʻa maikaʻi. Ma muli o ka protocol, hoʻokaʻawale ʻia nā hōʻoia pilikino a me nā hui

Hōʻoiaʻiʻo ʻino
Hoʻohana ʻia e ka mea loaʻa e haʻi aku i ka mea hoʻouna ua loaʻa hewa ka ʻeke. ʻO ka hōʻoia maikaʻi ʻole e loaʻa pinepine i ka helu kaʻina o ka ʻeke i loaʻa ʻole pololei ʻia

Window, conveyorization
E kaupalena i ka laulā o nā helu kaʻina i hiki ke hoʻohana ʻia no ka hoʻouna ʻana i nā ʻeke. Hiki i ka Multicast a me ka lima lima ke hoʻonui nui i ka protocol throughput i hoʻohālikelike ʻia i ka kali ʻana no ka hoʻomaikaʻi ʻana. E like me kā mākou e ʻike ai, hiki ke helu ʻia ka nui o ka puka makani e pili ana i ka hoʻokipa a me ka hiki ke hoʻopaʻa ʻia o ka hopena loaʻa, a me ka pae hoʻouka pūnaewele.

Nā hiʻohiʻona hou aʻe o ka hoʻohana ʻana iā Go no ka pūnaewele

В hale waihona.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka