Dhaibhsan a tha
Gu h-aithghearr
Tha an artaigil a’ beachdachadh air bunaitean tar-chuir dàta earbsach, a’ cur an gnìomh eisimpleirean air
Pròtacal còmhdach còmhdhail
A’ toirt seachad ceangal loidsigeach eadar pròiseasan tagraidh a tha a’ ruith air diofar luchd-aoigheachd. Bho shealladh tagraidh, tha ceangal loidsigeach coltach ri sianal a tha a 'ceangal phròiseasan gu dìreach.
Tha seo air a dhèanamh le bhith a’ roinneadh (ma tha sin riatanach) teachdaireachdan còmhdach an tagraidh ann am pìosan agus a’ cur bann-cinn còmhdach còmhdhail ri gach fear dhiubh.
Bidh an còmhdach còmhdhail an uairsin a’ dol seachad air an roinn gu ìre lìonra an neach a chuir e, far a bheil an earrann air a chuairteachadh ann am pasgan còmhdach lìonra (datagram) agus air a chuir. Aig an deireadh faighinn, bidh an còmhdach lìonra a ’toirt a-mach an earrann còmhdach còmhdhail bhon datagram agus ga thoirt suas chun ìre còmhdhail. An ath rud, bidh an còmhdach còmhdhail a’ pròiseasadh na roinne a gheibhear gus am bi an dàta aige ri fhaighinn don tagradh faighinn.
Prionnsabalan tar-chuir dàta earbsach
Tar-chuir dàta earbsach thairis air seanal gu tur tèarainte
A 'chùis as sìmplidh. Bidh an taobh cur dìreach a ’faighinn an dàta bhon t-sreath àrd, a’ cruthachadh pacaid anns a bheil e, agus ga chuir chun t-sianal.
Freiceadan
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 + надежный канал
}
}
Luchd-ceannach
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)
}
}
Tar-chuir dàta earbsach thairis air seanail le mearachdan comasach
Is e an ath cheum a bhith den bheachd gu bheilear a’ faighinn a h-uile pacaid tar-chuir san òrdugh anns an deach an cur, ach dh ’fhaodadh na pìosan a tha annta a bhith truaillidh air sgàth gu bheil an sianal uaireannan a’ sgaoileadh dàta le saobhadh.
Anns a 'chùis seo, thathar a' cleachdadh na dòighean a leanas:
- lorg mearachd;
- fios air ais;
- ath-chraoladh.
Canar protocolaidhean ath-aithris fèin-ghluasadach (ARQ) ri protocolaidhean gluasad dàta earbsach aig a bheil uidheamachdan co-chosmhail airson tar-chuir a-rithist iomadh uair.
A bharrachd air an sin, is fhiach beachdachadh air comasachd mhearachdan ann an cuidhteasan, nuair nach fhaigh am pàrtaidh a gheibh fiosrachadh sam bith mu thoraidhean gluasad a’ phacaid mu dheireadh.
Is e am fuasgladh don duilgheadas seo, cuideachd air a chleachdadh ann an TCP, raon ùr a chur ris a’ phacaid dàta anns a bheil àireamh sreath a’ phacaid.
Tar-chuir dàta earbsach thairis air seanal neo-earbsach le ùmhlachd do shaobhadh agus call pacaid
Còmhla ri saobhadh, gu mì-fhortanach, tha call pacaid anns an lìonra.
Agus gus an duilgheadas seo fhuasgladh, tha feum air dòighean-obrach:
- a 'dearbhadh fìrinn call pacaid;
- ath-lìbhrigeadh phasganan caillte don phàrtaidh faighinn.
A bharrachd air an sin, a bharrachd air a bhith a 'call a' phacaid, feumar ullachadh a dhèanamh airson a bhith comasach air an cuidhteas a chall no, mura h-eil dad air a chall, a lìbhrigeadh le dàil mhòr. Anns a h-uile cùis, tha an aon rud air a dhèanamh: tha am pasgan air ath-chraoladh. Gus smachd a chumail air ùine, bidh an uidheamachd seo a’ cleachdadh timer cunntais sìos, a leigeas leat deireadh an ùine feitheimh a dhearbhadh. Mar sin anns a 'phacaid
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)
Feumaidh an taobh cur timer tòiseachadh a h-uile uair a thèid pacaid a chuir a-mach (an dà chuid a’ chiad agus an dàrna turas), làimhseachadh brisidhean bhon timer agus stad air.
Mar sin, tha sinn air fàs eòlach air na prìomh bhun-bheachdan de phròtacalan gluasad dàta earbsach:
- seicichean;
- sreath àireamhan pacaidean;
- timers;
- cuidhteasan dearbhach agus àicheil.
Ach chan e sin uile!
Pròtacal gluasad dàta earbsach le loidhne-phìoban
Anns an tionndadh air an do bheachdaich sinn mu thràth, tha am protocol lìbhrigidh earbsach gu math neo-èifeachdach. Bidh e a’ tòiseachadh “a’ slaodadh sìos ”an tar-chuir a bheir an t-sianal conaltraidh seachad mar a bhios an RTT ag àrdachadh. Gus an èifeachdas àrdachadh agus comas an t-sianail conaltraidh a chleachdadh nas fheàrr, thathas a’ cleachdadh pìoban.
Tha cleachdadh pìobaireachd a 'leantainn gu:
- meudachadh ann an raon àireamhan sreath, oir feumaidh a h-uile pasgan a chaidh a chuir a-steach (ach a-mhàin ath-chraolaidhean) a bhith air an comharrachadh gu sònraichte;
- an fheum air bufairean àrdachadh air na taobhan tar-chuir agus faighinn.
Tha an raon àireamh sreath agus riatanasan meud bufair an urra ris na gnìomhan a nì am protocol mar fhreagairt air coirbeachd pacaid, call, agus dàil. A thaobh pìobaireachd, tha dà dhòigh ann airson mearachdan a cheartachadh:
- thoir air ais N pacaidean;
- ath-aithris roghnach.
A 'dol air ais N pacaidean - protocol uinneag sleamhnachaidh
Feumaidh an neach-cuiridh taic a thoirt do thrì seòrsa de thachartasan:
- gairm le protocol ìre nas àirde. Nuair a chanar “bho gu h-àrd” ris a’ ghnìomh cur dàta, bidh an taobh cur a-steach an-toiseach a’ sgrùdadh ìre lìonadh na h-uinneige (is e sin, làthaireachd N air a chuir teachdaireachdan a’ feitheamh ri cuidhteasan). Ma tha an uinneag falamh, thèid pasgan ùr a chruthachadh agus a ghluasad, agus thèid na luachan caochlaideach ùrachadh. Rud eile, bidh an taobh cur air ais dàta chun t-sreath àrd, agus tha seo na chomharra soilleir gu bheil an uinneag làn. Mar as trice feuchaidh an t-sreath àrd ris an dàta a thar-chuir a-rithist às deidh beagan ùine. Ann an tagradh fìor, tha coltas ann gum biodh an neach-cuiridh an dàrna cuid a ’buanachadh an dàta (an àite a bhith ga chuir sa bhad) no le inneal sioncronaidh (leithid semaphore no bratach) a leigeadh leis an t-sreath àrd an gnìomh cuir a ghairm dìreach nuair a tha an uinneag falamh .
- a' faighinn dearbhadh. Anns a’ phròtacal, airson pacaid le àireamh sreath N, tha aithne choitcheann air a thoirt a-mach a’ nochdadh gun d’ fhuaireadh gu soirbheachail a h-uile pacaid le àireamhan sreath ro N.
- tha an ùine feitheimh air tighinn gu crìch. Gus faighinn a-mach fìrinnean call agus dàil pacaidean agus cuidhteasan, bidh am protocol a’ cleachdadh timer. Ma thig an ùine a-mach gu crìch, bidh an taobh cur air ais a’ cur a h-uile pacaid neo-aithnichte a-steach.
Ath-aithris roghnach
Nuair a tha meud na h-uinneige agus an toradh dàil iomadachaidh trochur mòr, faodaidh àireamh mhòr de phasganan a bhith san amharc. Ann an leithid de chùis, dh’ fhaodadh mearachd pacaid singilte adhbhrachadh gun tèid àireamh mhòr de phasganan ath-chraoladh, agus cha robh feum air a’ mhòr-chuid dhiubh.
Eisimpleir:
A 'chuid as fheàrr
Freiceadan
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"))
}
}
Luchd-ceannach
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)
}
}
co-dhùnadh
Innealan gus dèanamh cinnteach à gluasad agus cleachdadh dàta earbsach
Meicnism
Iarrtas, beachd
Thoir sùil air an t-suim
Air a chleachdadh gus mearachdan beaga a lorg ann am pasgan tar-chuir
Timer
A’ cunntadh sìos an eadar-ama agus a’ comharrachadh nuair a tha e air tighinn gu crìch. Tha an tè mu dheireadh a 'ciallachadh le ìre àrd de choltas gu bheil am pasgan no an cuidhteas air a chall aig àm an tar-chuir. Ma thèid pacaid a lìbhrigeadh le dàil, ach nach eil e air a chall (cuiridh an ùine a-mach ro-ùine), no ma thèid cuidhteas a chall, bidh ath-chraoladh a’ leantainn gu pacaid dùblaichte air an taobh faighinn
Àireamh sònraichte
Air a chleachdadh airson àireamh sreathach de phasgan dàta a chaidh a ghluasad bhon neach a chuir chun neach a gheibh e. Tha beàrnan ann an sreath àireamhan nam pacaidean a fhuaireadh a’ leigeil leis a’ ghlacadair call pacaid a lorg. Tha na h-aon àireamhan sreath pacaid a’ ciallachadh gu bheil na pacaidean nan dùblaidhean bho chèile
Dearbhadh
Air a ghineadh leis a’ cheann faighinn agus a’ comharrachadh gu deireadh an cur gun d’ fhuaireadh gu soirbheachail a’ phacaid no am buidheann phasgan iomchaidh. Mar as trice tha an aithne a’ toirt a-steach àireamhan sreath nam pacaidean a fhuaireadh gu soirbheachail. A rèir a 'phròtacail, tha dearbhaidhean fa leth agus buidhne air an comharrachadh
Dearbhadh àicheil
Air a chleachdadh leis an neach a gheibh e gus innse don neach a chuir e gun d’ fhuaireadh a’ phacaid ceàrr. Mar as trice bidh aithne àicheil a’ toirt a-steach àireamh sreath a’ phacaid nach d’ fhuaireadh gu ceart
Uinneag, giùlan
Cuir crìoch air an raon de àireamhan sreath a ghabhas cleachdadh airson pacaidean a thar-chuir. Faodaidh multicast agus crathadh làimhe àrdachadh mòr a thoirt air toradh protocol an taca ri bhith a’ feitheamh ri aithne. Mar a chì sinn, faodar meud na h-uinneige a thomhas a rèir comasan fàilteachaidh agus buffering an deireadh faighinn, a bharrachd air ìre luchdan lìonra
Barrachd eisimpleirean de bhith a’ cleachdadh Go airson lìonrachadh
В
Source: www.habr.com