Lil dawk li
In breve
L-artikolu jiddiskuti l-baŜi ta 'trasmissjoni ta' data affidabbli, jimplimenta eżempji fuq
Protokoll tas-saff tat-trasport
Jipprovdi konnessjoni loġika bejn proċessi ta 'applikazzjoni li jaħdmu fuq hosts differenti. Mill-perspettiva tal-applikazzjoni, konnessjoni loġika tidher qisha kanal li jgħaqqad direttament il-proċessi.
Dan isir billi taqsam (jekk meħtieġ) il-messaġġi tas-saff tal-applikazzjoni fi frammenti u żżid header tas-saff tat-trasport għal kull wieħed minnhom.
Is-saff tat-trasport imbagħad jgħaddi s-segment lis-saff tan-netwerk tal-mittent, fejn is-segment jiġi inkapsulat f'pakkett tas-saff tan-netwerk (datagramma) u jintbagħat. Fit-tarf li jirċievi, is-saff tan-netwerk jiġbed is-segment tas-saff tat-trasport mid-datagramma u jgħaddih sas-saff tat-trasport. Sussegwentement, is-saff tat-trasport jipproċessa s-segment riċevut sabiex id-dejta tiegħu ssir disponibbli għall-applikazzjoni li tirċievi.
Prinċipji ta' trażmissjoni ta' data affidabbli
Trażmissjoni ta 'data affidabbli fuq kanal kompletament sigur
L-aktar każ sempliċi. In-naħa li tibgħat sempliċement tirċievi d-dejta mis-saff ta 'fuq, toħloq pakkett li jkun fih, u tibgħatha lill-kanal.
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 + надежный канал
}
}
Klijent
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)
}
}
Trażmissjoni ta' dejta affidabbli fuq kanal bi żbalji possibbli
Il-pass li jmiss huwa li wieħed jassumi li l-pakketti trażmessi kollha jiġu riċevuti fl-ordni li fiha ntbagħtu, iżda l-bits fihom jistgħu jkunu korrotti minħabba l-fatt li l-kanal kultant jittrasmetti data b'distorsjonijiet.
F'dan il-każ, jintużaw il-mekkaniżmi li ġejjin:
- sejbien ta' żbalji;
- feedback;
- trażmissjoni mill-ġdid.
Protokolli affidabbli għat-trasferiment tad-dejta li għandhom mekkaniżmi simili għar-repetizzjoni tat-trażmissjoni diversi drabi jissejħu protokolli Awtomatiċi tar-Ripetizzjoni tar-Ripetizzjoni (ARQ).
Barra minn hekk, ta 'min jikkunsidra l-possibbiltà ta' żbalji fl-irċevuti, meta l-parti li tirċievi ma tirċievi l-ebda informazzjoni dwar ir-riżultati tat-trasferiment tal-aħħar pakkett.
Is-soluzzjoni għal din il-problema, użata wkoll fit-TCP, hija li żżid qasam ġdid mal-pakkett tad-dejta li jkun fih in-numru tas-sekwenza tal-pakkett.
Trażmissjoni ta' dejta affidabbli fuq kanal mhux affidabbli soġġett għal distorsjoni u telf ta' pakkett
Flimkien mad-distorsjoni, sfortunatament, hemm telf ta 'pakketti fin-netwerk.
U biex issolvi din il-problema, huma meħtieġa mekkaniżmi:
- id-determinazzjoni tal-fatt tat-telf tal-pakkett;
- kunsinna mill-ġdid ta' pakketti mitlufa lill-parti li tirċievi.
Barra minn hekk, minbarra t-telf tal-pakkett, huwa meħtieġ li tiġi pprovduta l-possibbiltà ta 'telf tal-irċevuta jew, jekk xejn ma jintilef, il-kunsinna tagħha b'dewmien sinifikanti. Fil-każijiet kollha, l-istess ħaġa ssir: il-pakkett jiġi trażmess mill-ġdid. Biex jikkontrolla l-ħin, dan il-mekkaniżmu juża timer tal-countdown, li jippermettilek tiddetermina t-tmiem tal-intervall ta 'stennija. Allura fil-pakkett
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)
In-naħa li tibgħat jeħtieġ li tibda tajmer kull darba li jiġi trażmess pakkett (kemm l-ewwel kif ukoll it-tieni darba), jimmaniġġja l-interruzzjonijiet mit-tajmer u jwaqqafha.
Allura, sirna familjari mal-kunċetti ewlenin ta 'protokolli ta' trasferiment ta 'dejta affidabbli:
- checksums;
- numri ta' sekwenza ta' pakketti;
- tajmers;
- irċevuti pożittivi u negattivi.
Imma dan mhux kollox!
Protokoll ta 'trasferiment ta' data affidabbli b'pipelining
Fil-varjant li diġà kkunsidrajna, il-protokoll ta 'kunsinna affidabbli huwa ineffiċjenti ħafna. Jibda "jnaqqas" it-trażmissjoni pprovduta mill-kanal ta 'komunikazzjoni hekk kif l-RTT tiżdied. Biex tiżdied l-effiċjenza tagħha u tutilizza aħjar il-kapaċità tal-kanal ta 'komunikazzjoni, jintuża pipelining.
L-użu tal-pipelining iwassal għal:
- tiżdied il-firxa ta 'numri ta' sekwenza, peress li l-pakketti kollha mibgħuta (ħlief għal ritrażmissjonijiet) għandhom ikunu identifikati b'mod uniku;
- il-ħtieġa li jiżdiedu l-buffers fuq in-naħat li jittrasmettu u li jirċievu.
Il-firxa tan-numru tas-sekwenza u r-rekwiżiti tad-daqs tal-buffer jiddependu fuq l-azzjonijiet li jieħu l-protokoll b'reazzjoni għall-korruzzjoni, it-telf u d-dewmien tal-pakketti. Fil-każ tal-pipelining, hemm żewġ metodi biex jiġu kkoreġuti l-iżbalji:
- lura N pakketti lura;
- ripetizzjoni selettiva.
Tmur lura N pakketti - protokoll ta 'tieqa li tiżżerżaq
Min jibgħat għandu jappoġġa tliet tipi ta’ avvenimenti:
- sejħa permezz ta’ protokoll ta’ livell ogħla. Meta l-funzjoni li tibgħat id-dejta tissejjaħ "minn fuq", in-naħa li tibgħat l-ewwel tiċċekkja l-grad ta 'mili tat-tieqa (jiġifieri, il-preżenza ta' N mibgħuta messaġġi li qed jistennew irċevuti). Jekk it-tieqa tkun vojta, jiġi ġġenerat u trażmess pakkett ġdid, u l-valuri varjabbli jiġu aġġornati. Inkella, in-naħa li tibgħat lura d-dejta lis-saff ta 'fuq, u din hija indikazzjoni impliċita li t-tieqa hija mimlija. Tipikament is-saff ta 'fuq se jipprova jittrasmetti d-data mill-ġdid wara xi żmien. F'applikazzjoni reali, il-mittent x'aktarx jew jibferja d-data (minflok jibgħatha immedjatament) jew ikollu mekkaniżmu ta' sinkronizzazzjoni (bħal semaforu jew bandiera) li jippermetti lis-saff ta 'fuq isejjaħ il-funzjoni li tibgħat biss meta t-tieqa tkun vojta. .
- jirċievi konferma. Fil-protokoll, għal pakkett bin-numru ta 'sekwenza N, tinħareġ rikonoxximent ġenerali li jindika li l-pakketti kollha bin-numri ta' sekwenza ta 'qabel N ġew riċevuti b'suċċess.
- l-intervall ta' stennija jkun skada. Biex tiddetermina l-fatti ta 'telf u dewmien ta' pakketti u rċevuti, il-protokoll juża tajmer. Jekk jiskadi l-intervall tal-timeout, in-naħa li tibgħat mill-ġdid il-pakketti kollha mibgħuta mhux rikonoxxuti.
Ripetizzjoni selettiva
Meta d-daqs tat-tieqa u l-prodott tad-dewmien tal-propagazzjoni tal-produzzjoni jkunu kbar, jista 'jkun hemm numru kbir ta' pakketti fil-pipeline. F'każ bħal dan, żball ta' pakkett wieħed jista' jikkawża li numru kbir ta' pakketti jiġu trażmessi mill-ġdid, li ħafna minnhom ma kinux meħtieġa.
Eżempju
L-aqwa
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"))
}
}
Klijent
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)
}
}
Output
Mekkaniżmi li jiżguraw trasferiment u użu affidabbli tad-dejta
Mekkaniżmu
Applikazzjoni, kumment
Iċċekkja s-somma
Użat biex jinstabu żbalji tal-bit f'pakkett trażmess
Timer
Jgħodd l-intervall tal-timeout u jindika meta jkun skada. Dan tal-aħħar ifisser li bi grad għoli ta’ probabbiltà l-pakkett jew ir-riċevuta tiegħu jintilef waqt it-trażmissjoni. Jekk pakkett jitwassal b'dewmien, iżda ma jintilifx (skadenza prematura tal-intervall ta' timeout), jew irċevuta tintilef, it-trażmissjoni mill-ġdid twassal għal pakkett duplikat fuq in-naħa li tirċievi
Numru tas-serje
Użat għan-numerazzjoni sekwenzjali tal-pakketti tad-dejta trażmessi minn min jibgħat lir-riċevitur. Il-lakuni fin-numri tas-sekwenza tal-pakketti riċevuti jippermettu lir-riċevitur jikxef it-telf tal-pakketti. L-istess numri tas-sekwenza tal-pakketti jfissru li l-pakketti huma duplikati ta 'xulxin
Konferma
Ġenerat mit-tarf li jirċievi u li jindika lit-tarf li jibgħat li l-pakkett korrispondenti jew grupp ta 'pakketti ġie riċevut b'suċċess. Tipikament ir-rikonoxximent ikun fih in-numri tas-sekwenza ta' pakketti riċevuti b'suċċess. Skont il-protokoll, il-konfermi individwali u tal-grupp huma distinti
Konferma negattiva
Użat mir-riċevitur biex jinforma lill-mittent li l-pakkett ġie riċevut ħażin. Rikonoxximent negattiv normalment jinkludi n-numru tas-sekwenza tal-pakkett li ma ġiex riċevut b'mod korrett
Tieqa, conveyorization
Illimita l-firxa ta 'numri ta' sekwenza li jistgħu jintużaw biex jittrasmettu pakketti. Il-multicast u l-handshake jistgħu jżidu b'mod sinifikanti l-produzzjoni tal-protokoll meta mqabbla mal-istennija għal rikonoxximenti. Kif se naraw, id-daqs tat-tieqa jista 'jiġi kkalkulat abbażi tal-kapaċitajiet ta' riċeviment u buffering tat-tarf li jirċievi, kif ukoll il-livell tat-tagħbija tan-netwerk.
Aktar eżempji ta 'użu ta' Go għan-netwerking
В
Sors: www.habr.com