Kulabo aba
Kafushane
I-athikili ixoxa ngezisekelo zokudluliswa kwedatha okuthembekile, isebenzisa izibonelo ku
Iphrothokholi yesendlalelo sezokuthutha
Inikeza ukuxhumana okunengqondo phakathi kwezinqubo zohlelo lokusebenza ezisebenza kubasingathi abahlukahlukene. Ngokombono wohlelo lokusebenza, ukuxhumana okunengqondo kubukeka njengesiteshi esixhuma ngokuqondile izinqubo.
Lokhu kwenziwa ngokuhlukanisa (uma kunesidingo) imilayezo yesendlalelo sohlelo lokusebenza ibe yizicucu futhi wengeze unhlokweni wesendlalelo sokuthutha kuleyo naleyo.
Isendlalelo sezokuthutha sibe sesidlulisela ingxenye kusendlalelo senethiwekhi yomthumeli, lapho ingxenye ihlanganiswa kuphakethe lesendlalelo senethiwekhi (idathagram) futhi ithunyelwe. Ekupheleni kokwamukela, isendlalelo senethiwekhi sikhipha ingxenye yesendlalelo sezokuthutha ku-datagram bese siyidlulisela kungqimba yezokuthutha. Okulandelayo, isendlalelo sezokuthutha sicubungula ingxenye etholiwe ukuze idatha yayo itholakale ohlelweni olutholayo.
Izimiso zokudluliswa kwedatha okuthembekile
Ukudluliswa kwedatha okuthembekile ngesiteshi esivikeleke ngokuphelele
Icala elilula. Uhlangothi oluthumelayo luvele lwamukele idatha kusuka kungqimba olungaphezulu, lwenze iphakethe eliqukethe, bese liyithumela esiteshini.
Iseva
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 + надежный канал
}
}
Ikhasimende
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)
}
}
Ukudluliswa kwedatha okuthembekile ngesiteshi ngamaphutha angaba khona
Isinyathelo esilandelayo siwukuthatha ngokuthi wonke amaphakethe adlulisiwe atholwa ngendlela athunyelwe ngayo, kodwa izingcezu ezikuwo zingase zonakaliswe ngenxa yokuthi isiteshi ngezinye izikhathi sidlulisela idatha ngokuhlanekezela.
Kulokhu, izindlela ezilandelayo zisetshenziswa:
- ukutholwa kwephutha;
- impendulo;
- ukudluliswa kabusha.
Amaphrothokholi athembekile okudlulisa idatha anezindlela ezifanayo zokuphinda ukudlulisa izikhathi eziningi abizwa ngokuthi amaphrothokholi e-Automatic Repeat reQuest (ARQ).
Ukwengeza, kufanelekile ukucabangela ukuthi kungenzeka kube namaphutha kumarisidi, lapho iqembu elitholayo lingeke lithole noma yiluphi ulwazi mayelana nemiphumela yokudluliswa kwephakethe lokugcina.
Isixazululo sale nkinga, esibuye sisetshenziswe ku-TCP, ukwengeza inkambu entsha kuphakethe ledatha eliqukethe inombolo yokulandelana kwephakethe.
Ukudluliswa kwedatha okuthembekile ngesiteshi esingathembekile ngaphansi kokuhlanekezelwa nokulahleka kwephakethe
Kanye nokuhlanekezela, ngeshwa, kukhona ukulahleka kwephakethe kunethiwekhi.
Futhi ukuxazulula le nkinga, izindlela ziyadingeka:
- ukunquma iqiniso lokulahlekelwa kwephakethe;
- ukulethwa kabusha kwamaphakethe alahlekile eqenjini elamukelayo.
Ukwengeza, ngaphezu kokulahlekelwa kwephakheji, kuyadingeka ukunikeza ithuba lokulahlekelwa irisidi noma, uma kungekho lutho olulahlekile, ukulethwa kwayo ngokubambezeleka okukhulu. Kuzo zonke izimo, into efanayo yenziwa: iphakethe lidluliselwa kabusha. Ukuze ulawule isikhathi, lo mshini usebenzisa isibali-sikhathi sokubala wehle, esikuvumela ukuthi unqume ukuphela kwesikhawu sokulinda. Ngakho ephaketheni
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)
Uhlangothi oluthumelayo ludinga ukuqala isibali sikhathi njalo lapho iphakethe lisakazwa (kokubili okokuqala nesesibili), libambe iziphazamiso kusukela kusibali sikhathi bese usimisa.
Ngakho-ke, sesijwayelene nemiqondo ebalulekile yezinqubo ezithembekile zokudluliswa kwedatha:
- amasheke;
- izinombolo zokulandelana kwamaphakheji;
- izibali sikhathi;
- amarisidi amahle kanye namarisidi.
Kodwa akugcini lapho!
Iphrothokholi yokudlulisa idatha ethembekile ene-pipelining
Kokwehlukile esesivele sikucabangile, iphrothokholi yokulethwa okuthembekile ayisebenzi kahle. Iqala "ukunciphisa" ukudluliswa okuhlinzekwa yisiteshi sokuxhumana njengoba i-RTT ikhula. Ukwandisa ukusebenza kahle kwayo nokusebenzisa kangcono umthamo wesiteshi sokuxhumana, kusetshenziswa amapayipi.
Ukusetshenziswa kwamapayipi kuholela ku:
- ukwandisa ububanzi bezinombolo zokulandelana, njengoba wonke amaphakethe athunyelwe (ngaphandle kwama-retransmissions) kufanele akhonjwe ngokuhlukile;
- isidingo sokwandisa ama-buffers ezinhlangothini zokudlulisela nokwamukela.
Ibanga lenombolo yokulandelana nezidingo zikasayizi webhafa zincike ezenzweni iphrothokholi eyithathayo ukuphendula ukonakala kwephakethe, ukulahleka, nokubambezeleka. Endabeni yokufaka amapayipi, kunezindlela ezimbili zokulungisa amaphutha:
- buyisela amaphakethe e-N emuva;
- ukuphindaphinda okukhethiwe.
Ukubuyela emuva kumaphakethe angu-N - umthetho olandelwayo wewindi elislayidayo
Umthumeli kufanele asekele izinhlobo ezintathu zemicimbi:
- shayela ngephrothokholi yezinga eliphezulu. Uma umsebenzi wokuthumela idatha ubizwa ngokuthi “kusuka ngenhla”, uhlangothi lokuthumela luqala ngokuhlola izinga lokugcwaliswa kwewindi (okungukuthi, ukuba khona kwemilayezo engu-N ethunyelwe elinde ukwamukelwa kwamarisidi). Uma iwindi lingenalutho, iphakethe elisha liyakhiqizwa futhi lidluliselwe, futhi amanani aguquguqukayo ayabuyekezwa. Uma kungenjalo, uhlangothi lokuthumela lubuyisela idatha kusendlalelo esingaphezulu, futhi lokhu kuyinkomba esobala yokuthi iwindi ligcwele. Ngokuvamile ungqimba olungaphezulu luzozama ukudlulisa idatha futhi ngemva kwesikhathi esithile. Kuhlelo lokusebenza lwangempela, umthumeli kungenzeka agcine idatha (esikhundleni sokuyithumela ngokushesha) noma abe nendlela yokuvumelanisa (njenge-semaphore noma ifulege) engavumela ungqimba olungaphezulu ukuthi lushayele umsebenzi wokuthumela kuphela uma iwindi lingenalutho. .
- ukuthola isiqinisekiso. Kuphrothokholi, ephaketheni elinenombolo yokulandelana engu-N, ukuvuma okuvamile kukhishwa okubonisa ukuthi wonke amaphakethe anezinombolo zokulandelana ezandulela okuthi N amukelwe ngempumelelo.
- isikhawu sokulinda siphelelwe yisikhathi. Ukuze unqume amaqiniso okulahlekelwa nokubambezeleka kwamaphakethe namarisidi, iphrothokholi isebenzisa isibali sikhathi. Uma isikhathi sokuvala siphela, uhlangothi lokuthumela luthumela kabusha wonke amaphakethe angagunyaziwe.
Ukuphindaphinda okukhethiwe
Uma usayizi wefasitela kanye nomkhiqizo wokulibaziseka kokusabalalisa kokudlulisa kukhulu, inani elikhulu lamaphakethe lingase libe semgqeni. Esimeni esinjalo, iphutha lephakethe elilodwa lingase libangele inani elikhulu lamaphakethe ukuthi lidluliselwe kabusha, iningi lawo ebelingadingeki.
Isibonelo:
Okuhle kakhulu
Iseva
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"))
}
}
Ikhasimende
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)
}
}
isiphetho
Izindlela zokuqinisekisa ukudluliswa kwedatha okuthembekile nokusetshenziswa
Indlela
Isicelo, ukuphawula
Hlola isamba
Isetshenziselwa ukuthola amaphutha amancane ephaketheni elidlulisiwe
Isikhathi
Ibala phansi isikhathi sokuvala futhi ikhombise ukuthi isiphelelwe yisikhathi nini. Lokhu kokugcina kusho ukuthi ngezinga eliphezulu lokungenzeka iphakethe noma irisidi yalo liyalahleka ngesikhathi sokudlulisela. Uma iphakethe lilethwa ngokubambezeleka, kodwa lingalahleki (ukuphelelwa isikhathi ngaphambi kwesikhathi kwesikhawu sokuvala), noma ilahleka irisidi, ukudluliswa kabusha kuholela ephaketheni eliyimpinda ohlangothini olutholayo.
Inombolo yomkhiqizo
Isetshenziselwa izinombolo ezilandelanayo zamaphakethe wedatha adluliswa esuka kumthumeli ukuya kumamukeli. Izikhala ezinombolweni zokulandelana zamaphakethe atholiwe zivumela umamukeli ukuthi abone ukulahleka kwephakethe. Izinombolo zephakethe elifanayo lokulandelana zisho ukuthi amaphakethe ayizimpinda zamanye
Isiqinisekiso
Kwenziwe indawo yokwamukela futhi ekhombisa ekugcineni ukuthi iphakethe elihambisanayo noma iqoqo lamaphakethe lamukelwe ngempumelelo. Ngokuvamile ukuvuma kuqukethe izinombolo zokulandelana zamaphakethe amukelwe ngempumelelo. Ngokuya ngephrothokholi, ukuqinisekiswa komuntu ngamunye neqembu kuyahlukaniswa
Ukuqinisekisa okungekuhle
Isetshenziswa umamukeli ukwazisa umthumeli ukuthi iphakethe lamukelwe ngokungalungile. Ukuvuma okunegethivu kuvame ukufaka inombolo yokulandelana kwephakethe engazange imukelwe kahle
Iwindi, i-conveyorization
Khawulela ububanzi bezinombolo zokulandelana ezingasetshenziswa ukudlulisa amaphakethe. Ukusakaza okuningi nokuxhawula kungakhuphula kakhulu ukusebenza kwephrothokholi uma kuqhathaniswa nokulinda ukubonga. Njengoba sizobona, usayizi wefasitela ungabalwa ngokusekelwe emandleni okwamukela kanye nokubhafa kokuphela kokwamukela, kanye nezinga lomthwalo wenethiwekhi.
Izibonelo ezengeziwe zokusebenzisa i-Go for networking
В
Source: www.habr.com