
Kwa iwo amene Odzipereka kuti amvetsetse ma network ndi ma protocol.
Mwachidule
Nkhaniyi ikufotokoza zofunikira za kutumiza deta yodalirika ndikugwiritsa ntchito zitsanzo pa , kuphatikiza UDP ndi TCP. Kutengera , , ndi buku lakuti "Computer Networks: A Top-Down Approach," mwinamwake aliyense akungokambirana za Tannenbaum ndi Oliferov.
Transport layer protocol
Amapereka mgwirizano womveka pakati pa njira zogwiritsira ntchito zomwe zikuyenda pa makamu osiyanasiyana. Kuchokera pamalingaliro a mapulogalamu, kulumikizana koyenera kumawoneka ngati njira yolumikizira mwachindunji.

mothandizidwa ndi machitidwe omaliza koma osati ndi ma routers (kupatula - ). Kumbali yotumiza, gawo la zoyendera limasintha zomwe amazilandira kuchokera panjira yotumizira kupita ku mapaketi osanjikiza otchedwa magawo.

Izi zimachitika ndikuphwanya (ngati kuli kofunikira) mauthenga osanjikiza a pulogalamuyo kukhala tizidutswa ndikuwonjezera mutu wosanjikiza pagawo lililonse.

Gawo lazoyendetsa limadutsa gawolo kupita ku netiweki ya wotumiza, pomwe imayikidwa mu paketi ya network (datagraph) ndikutumizidwa. Pamapeto olandirira, gawo la netiweki limatulutsa gawo lazonyamula kuchokera ku datagram ndikulipititsa kumalo oyendetsa. Chosanjikiza cha mayendedwe ndiye chimakonza gawo lolandilidwa kuti deta yake ipezeke ku pulogalamu yolandila.

Mfundo zotetezera deta zotetezedwa
Kutumiza kwa data kodalirika panjira yotetezedwa kwathunthu
Chosavuta kwambiri: Mbali yotumiza imangolandira deta kuchokera pamwamba, imapanga paketi yomwe ili nayo, ndikuyitumiza pansi pa tchanelo.
Seva
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 + надежный канал
}
}Makasitomala
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)
}
}Kutumiza kwa data kodalirika panjira yokhala ndi zolakwika zomwe zingatheke
Chotsatira ndicho kuganiza kuti mapaketi onse opatsirana amalandiridwa mu dongosolo lomwe adatumizidwa, koma ma bits omwe ali mkati mwake akhoza kuwonongeka chifukwa chakuti njira nthawi zina imatumiza deta ndi zolakwika.

Pankhaniyi, njira zotsatirazi zimagwiritsidwa ntchito:
- kuzindikira zolakwika;
- ndemanga;
- kutumizanso.
Ma protocol odalirika otumizira ma data omwe ali ndi njira zotere zobwerezabwereza kangapo amatchedwa ma protocol a Automatic Repeat ReQuest (ARQ).
Kuonjezera apo, ndi bwino kuganizira za kuthekera kwa zolakwika mumalisiti, pamene gulu lolandira sililandira chidziwitso chilichonse chokhudza zotsatira za phukusi lomaliza.
Njira yothetsera vutoli, yogwiritsidwa ntchito mu TCP pakati pazinthu zina, ndikuwonjezera gawo latsopano pa paketi ya data yomwe ili ndi nambala yotsatizana ya paketi.

Kutumiza kwa data kodalirika panjira yosadalirika yomwe imalola kupotoza kwa paketi ndi kutayika
Pamodzi ndi zosokoneza, mwatsoka, pali kutayika kwa paketi mu netiweki.
Ndipo pofuna kuthetsa vutoli, ndondomeko zofunika:
- kudziwa zenizeni za kutayika kwa paketi;
- kubweretsanso mapaketi otayika ku gulu lolandira.
Kuphatikiza apo, kuwonjezera pakutayika kwa paketi, ndikofunikira kulingalira za kuthekera kwa risiti yotayika kapena, ngati palibe chomwe chatayika, kutumiza kwake ndikuchedwa kwambiri. Nthawi zonse, zomwezo zimachitika: paketi imatumizidwanso. Pofuna kuwongolera nthawi, makinawa amagwiritsa ntchito chowerengera nthawi, chomwe chimalola munthu kudziwa kutha kwa nthawi yodikirira. Choncho, mu paketi TCPKeepAlive yakhazikitsidwa kukhala masekondi 15 mwachisawawa:
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)Mbali yotumizira iyenera kuyambitsa chowerengera nthawi iliyonse paketi ikatumizidwa (nthawi yoyamba komanso yachiwiri), cholumikizira chosokoneza pa chowerengera, ndikuyimitsa.
Chifukwa chake, tazolowera mfundo zazikuluzikulu zama protocol odalirika otumizira ma data:
- macheke;
- nambala zambiri za phukusi;
- zowerengera nthawi;
- zabwino ndi zoipa risiti.
Koma si zokhazo!
Reliable Data Transfer Protocol yokhala ndi Pipelining
Pokhazikitsa zomwe takambirana kale, njira yodalirika yobweretsera ndiyosakwanira. Imayamba "kuchedwetsa" kufalitsa koperekedwa ndi njira yolumikizirana pamene RTT ikuwonjezeka. Kupititsa patsogolo luso lake komanso kugwiritsa ntchito bwino bandwidth ya njira yolumikizirana, mapaipi amagwiritsidwa ntchito.

Kugwiritsa ntchito pipelining kumabweretsa:
- kuwonjezera kuchuluka kwa manambala otsatizana, popeza mapaketi onse otumizidwa (kupatula otumizanso) ayenera kukhala odziwika mwapadera;
- kufunikira kowonjezera ma buffers kumbali zotumizira ndi kulandira.
Kusiyanasiyana kwa manambala otsatizana ndi zofunikira za kukula kwa bafa zimatengera momwe protocol imayankhira pakuwonongeka kwa paketi, kutayika, ndi kuchedwa. Pankhani ya pipelining, pali njira ziwiri zowongolera zolakwika:
- bweretsani mapaketi a N mmbuyo;
- kubwereza kosankha.
Kumbuyo N mapaketi - sliding zenera protocol

Wotumiza ayenera kuthandizira mitundu itatu ya zochitika:
- Kuitana kochitidwa ndi protocol yapamwamba. Ntchito yotumiza ikaitanidwa kuchokera pamwamba, wotumizayo amayang'ana kaye ngati zenera ladzaza (ndiko kuti, ngati pali mauthenga a N omwe akudikirira kuti avomerezedwe). Ngati zenera silikudzaza, paketi yatsopano imapangidwa ndikufalitsidwa, ndipo zosinthazo zimasinthidwa. Apo ayi, wotumizayo amabwezera deta kumtunda wapamwamba, womwe ndi chizindikiro chowonekera kuti zenera ladzaza. Nthawi zambiri, wosanjikiza wapamwamba adzayesanso kutumiza deta pakapita nthawi. Mukugwiritsa ntchito kwenikweni, wotumizayo amatha kusungitsa deta (m'malo moitumiza nthawi yomweyo) kapena kukhala ndi njira yolumikizira (mwachitsanzo, semaphore kapena mbendera) yomwe ingalole kumtunda kuyitanitsa ntchito yotumiza pokhapokha zenera silidzadza.
- Kulandira chivomerezo. Mu protocol, chivomerezo chonse chimaperekedwa kwa paketi yokhala ndi nambala yotsatizana N, kusonyeza kuti mapaketi onse okhala ndi manambala otsatizana patsogolo pa N adalandiridwa bwino.
- Kutha kwa nthawi. Protocol imagwiritsa ntchito chowerengera kuti izindikire paketi ndi kuvomereza kutayika komanso kuchedwa. Ngati nthawi yomaliza yatha, wotumizayo amatumizanso mapaketi onse osavomerezedwa.
Kubwereza kosankha
Pamene kukula kwa zenera ndi kuchedwa-kuchedwa mankhwala ndi lalikulu, ambiri mapaketi akhoza kukhala mu payipi. Pankhaniyi, kulakwitsa mu paketi imodzi kungayambitse kubwezeredwa kwa mapaketi ambiri, ambiri omwe sanafunikire.
Chitsanzo:
Zabwino kwambiri machitidwe amasonkhanitsidwa muzochitika zenizeni Ndipo ngati wina akudziwa njira yabwinoko - .
Seva
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"))
}
}Makasitomala
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)
}
}Pomaliza
Njira zomwe zimatsimikizira kusamutsa deta yodalirika ndikugwiritsa ntchito
Njira
Kugwiritsa ntchito, ndemanga
Onani kuchuluka
Amagwiritsidwa ntchito kuti azindikire zolakwika pang'ono mu paketi yopatsirana.
Nthawi
Kuwerengera kwa nthawi yomwe yatha ndikuwonetsa kutha kwake. Chotsatiracho chimasonyeza kuti, ndi mwayi waukulu, paketi kapena kuvomereza kwake kunatayika panthawi yopatsirana. Ngati paketiyo yaperekedwa mochedwa koma osatayika (kutha msanga kwa nthawi yopuma), kapena kuvomereza kutayika, kubwezeretsanso kumabweretsa paketi yobwereza pamapeto olandira.
Nambala ya siriyo
Amagwiritsidwa ntchito kutsata mapaketi a data omwe amatumizidwa kuchokera kwa wotumiza kupita kwa wolandila. Mipata mu manambala otsatizana a mapaketi olandilidwa amalola wolandila kuti azindikire kutayika kwa paketi. Nambala zofananira za paketi zimawonetsa mapaketi obwereza.
Umboni
Zopangidwa ndi gulu lolandira ndikuwonetsa kwa gulu lotumizira kuti paketi yofananira kapena gulu la paketi lalandilidwa bwino. Nthawi zambiri mawu oyamikira amakhala ndi manambala otsatizana a paketi yolandilidwa bwino. Malingana ndi ndondomekoyi, kusiyana kumapangidwa pakati pa kuvomereza payekha ndi gulu.
Kutsimikizira kolakwika
Amagwiritsidwa ntchito ndi wolandira kuti adziwitse wotumiza kuti paketi sinalandire bwino. Kuvomereza kolakwika kumaphatikizapo nambala yotsatizana ya paketi yomwe sinalandiridwe bwino.
Chiwindi, pipeline
Amachepetsa kuchuluka kwa manambala otsatizana omwe angagwiritsidwe ntchito pakupatsira paketi. Kutumizirana ma multicast ndi kugwirana chanza kumawonjezera kwambiri kutulutsa kwa protocol poyerekeza ndi kuyembekezera kuyamikiridwa. Monga momwe tiwonera, kukula kwazenera kumatha kuwerengedwa kutengera kulandirira kolandirira ndi kuthekera kwa buffering, komanso kuchuluka kwa maukonde.
Zitsanzo zina zogwiritsira ntchito Go for network
В .
Source: www.habr.com
