I ka poe
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
ʻ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.
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.
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ā 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.
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.
ʻ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
// 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.
ʻ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
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
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
В
Source: www.habr.com