
သူများကို ကွန်ရက်များနှင့် ပရိုတိုကောများကို နားလည်ရန် ရည်စူးထားသည်။
အတိုချုပ်
ဆောင်းပါးသည် ယုံကြည်စိတ်ချရသော ဒေတာပေးပို့ခြင်း၏ အခြေခံများကို ဆွေးနွေးထားပြီး ဥပမာများကို အကောင်အထည်ဖော်သည်။ UDP နှင့် TCP အပါအဝင်။ ပေါ်အခြေခံကာ , , စာအုပ်နှင့် "ကွန်ပြူတာကွန်ရက်များ။ အပေါ်မှအောက်သို့ချဉ်းကပ်နည်း" စာအုပ်၊ မဟုတ်ပါက လူတိုင်း Tannenbaum နှင့် Oliferov တို့ကိုသာ ဆွေးနွေးသည်။
သယ်ယူပို့ဆောင်ရေး အလွှာ ပရိုတိုကော
မတူညီသော host များပေါ်တွင် လုပ်ဆောင်နေသည့် အပလီကေးရှင်း လုပ်ငန်းစဉ်များအကြား ယုတ္တိရှိသော ချိတ်ဆက်မှုကို ပေးသည်။ ကျိုးကြောင်းဆီလျော်သော ချိတ်ဆက်မှုတစ်ခုသည် အပလီကေးရှင်းများသို့ တိုက်ရိုက်ချိတ်ဆက်သည့် လုပ်ငန်းစဉ်များကို ချန်နယ်တစ်ခုအဖြစ် ပေါ်လာသည်။

အဆုံးစနစ်များက ပံ့ပိုးပေးသော်လည်း ကွန်ရက်ရောက်တာများမှ မဟုတ်ဘဲ (- မှလွဲ၍) ) ပေးပို့သူဘက်တွင်၊ သယ်ယူပို့ဆောင်ရေးအလွှာသည် ပေးပို့ခြင်းအပလီကေးရှင်းလုပ်ငန်းစဉ်မှရရှိသည့် အပလီကေးရှင်းအလွှာဒေတာကို အပိုင်းဟုခေါ်သော သယ်ယူပို့ဆောင်ရေးအလွှာပက်ကတ်များအဖြစ်သို့ ပြောင်းလဲပေးသည်။

၎င်းကို (လိုအပ်ပါက) အပလီကေးရှင်းအလွှာမက်ဆေ့ချ်များကို အပိုင်းအစများအဖြစ် ခွဲခြမ်းကာ ၎င်းတို့တစ်ခုစီသို့ ပို့ဆောင်ရေးအလွှာခေါင်းစီးကို ပေါင်းထည့်ခြင်းဖြင့် လုပ်ဆောင်သည်။

ထို့နောက် သယ်ယူပို့ဆောင်ရေးအလွှာသည် အပိုင်းကို ပေးပို့သူ၏ ကွန်ရက်အလွှာသို့ ဖြတ်သန်းသွားပြီး၊ အပိုင်းကို ကွန်ရက်အလွှာ ပက်ကတ် (ဒေတာဂရမ်) တွင် ထုပ်ပိုးထားပြီး ပေးပို့သည်။ လက်ခံရရှိသည့်အဆုံးတွင်၊ ကွန်ရက်အလွှာသည် ဒေတာဂရမ်မှ သယ်ယူပို့ဆောင်ရေးအလွှာအပိုင်းကို ထုတ်ယူပြီး သယ်ယူပို့ဆောင်ရေးအလွှာအထိ ပေးပို့သည်။ ထို့နောက် သယ်ယူပို့ဆောင်ရေးအလွှာသည် လက်ခံရရှိသည့်အပလီကေးရှင်းသို့ ၎င်း၏ဒေတာရရှိနိုင်စေရန်အတွက် လက်ခံရရှိသည့်အပိုင်းကို စီမံဆောင်ရွက်သည်။

လုံခြုံသောဒေတာပေးပို့ခြင်းဆိုင်ရာမူများ
လုံးဝလုံခြုံသောချန်နယ်တစ်ခုမှ ယုံကြည်စိတ်ချရသော ဒေတာပေးပို့ခြင်း
အရိုးရှင်းဆုံးကိစ္စ- ပေးပို့သည့်အခြမ်းသည် အထက်အလွှာမှ ဒေတာကို ရိုးရိုးရှင်းရှင်း လက်ခံရရှိသည်၊ ၎င်းတွင်ပါရှိသော ပက်ကေ့ခ်ျတစ်ခုကို ဖန်တီးကာ ချန်နယ်သို့ ပို့ပေးသည်။
ဆာဗာက
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 + надежный канал
}
}လိုင်း
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)
}
}ဖြစ်နိုင်ချေရှိသော အမှားအယွင်းများပါရှိသော ချန်နယ်တစ်ခုမှတဆင့် ယုံကြည်စိတ်ချရသော ဒေတာပေးပို့ခြင်း။
နောက်တစ်ဆင့်မှာ ၎င်းတို့ပေးပို့သည့်အစီအစဥ်အတိုင်း ပို့လွှတ်ထားသော packet အားလုံးကို လက်ခံရရှိကြောင်း ယူဆရန်ဖြစ်သော်လည်း၊ ချန်နယ်သည် တစ်ခါတစ်ရံတွင် ပုံမမှန်သော အချက်အလက်များကို ပေးပို့ခြင်းဖြစ်သောကြောင့် ၎င်းတို့ရှိ bit များ ပျက်စီးသွားနိုင်သည်။

ဤကိစ္စတွင်၊ အောက်ပါ ယန္တရားများကို ကျင့်သုံးသည်-
- အမှားထောက်လှမ်း;
- တုံ့ပြန်ချက်;
- ပြန်လည်ပေးပို့ခြင်း။
အကြိမ်များစွာ ထပ်ခါတလဲလဲ ထုတ်လွှင့်မှုများအတွက် ထိုကဲ့သို့ စိတ်ချရသော ဒေတာပို့လွှတ်ရေး ပရိုတိုကောများကို Automatic Repeat reQuest (ARQ) ပရိုတိုကောများဟုခေါ်သည်။
ထို့အပြင်၊ လက်ခံရရှိသည့်ပါတီသည် နောက်ဆုံးထုပ်ပိုးမှု၏ရလဒ်များနှင့်ပတ်သက်သည့် အချက်အလက်တစ်စုံတစ်ရာမရရှိသည့်အခါ လက်ခံရရှိသည့်အဖွဲ့သည် ပြေစာများတွင် အမှားအယွင်းများဖြစ်နိုင်ချေကို ထည့်သွင်းစဉ်းစားသင့်သည်။
ဤပြဿနာအတွက် ဖြေရှင်းချက်မှာ အခြားအရာများထဲတွင် TCP တွင်အသုံးပြုသည့် ဒေတာပက်ကေ့ချ်တွင် အကွက်အသစ်တစ်ခုထည့်ရန်ဖြစ်သည်။

ပက်ကက်ပုံပျက်ခြင်းနှင့် ဆုံးရှုံးခြင်းတို့ကို ခွင့်ပြုသည့် ယုံကြည်စိတ်ချရသော ချန်နယ်တစ်ခုမှ ယုံကြည်စိတ်ချရသော ဒေတာထုတ်လွှင့်ခြင်း။
ပုံပျက်ခြင်းများနှင့်အတူ၊ ကံမကောင်းစွာဖြင့်၊ ကွန်ရက်တွင် ပက်ကတ်ဆုံးရှုံးမှု ရှိပါသည်။
ဤပြဿနာကိုဖြေရှင်းရန်၊ ယန္တရားများလိုအပ်သည်-
- Packet ဆုံးရှုံးမှု၏အချက်ကို ဆုံးဖြတ်ခြင်း၊
- ဆုံးရှုံးသွားသော ပက်ကေ့ခ်ျများကို လက်ခံရရှိသူထံ ပြန်လည်ပေးပို့ခြင်း။
ထို့အပြင်၊ ထုပ်ပိုးဆုံးရှုံးမှုအပြင်၊ ပြေစာပျောက်ဆုံးမှုဖြစ်နိုင်ခြေကို ဖြည့်ဆည်းပေးရန် လိုအပ်သည် သို့မဟုတ် တစ်စုံတစ်ရာပျောက်ဆုံးပါက ၎င်း၏ပေးပို့မှုကို သိသာထင်ရှားစွာနှောင့်နှေးစေပါသည်။ ကိစ္စအားလုံးတွင်၊ တူညီသောအရာကိုလုပ်ဆောင်သည်- packet ကိုပြန်လည်ပေးပို့ခြင်း။ အချိန်ကို ထိန်းချုပ်ရန်၊ ဤယန္တရားသည် စောင့်ဆိုင်းချိန်၏ အဆုံးကို ဆုံးဖြတ်နိုင်စေမည့် နှစ်သစ်တိုင်မာကို အသုံးပြုသည်။ ဒီတော့ packet ထဲမှာ TCPKeepAlive ကို ပုံသေအားဖြင့် 15 စက္ကန့် သတ်မှတ်ထားသည်-
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)ထုပ်ပိုးမှုတစ်ခု (ပထမအကြိမ်နှင့် ဒုတိယတစ်ကြိမ်) ထုတ်လွှင့်သည့်အခါတိုင်း၊ အချိန်တိုင်းကိရိယာမှ အနှောင့်အယှက်များကို ကိုင်တွယ်ပြီး ၎င်းကို ရပ်လိုက်တိုင်း ထုတ်လွှင့်သည့်ဘက်သည် အချိန်တိုင်းကိရိယာကို စတင်ရန် လိုအပ်သည်။
ထို့ကြောင့်၊ ကျွန်ုပ်တို့သည် ယုံကြည်စိတ်ချရသော ဒေတာပေးပို့ခြင်းဆိုင်ရာ ပရိုတိုကောများ၏ အဓိကသဘောတရားများနှင့် ရင်းနှီးလာပါပြီ-
- ချက်လက်မှတ်များ;
- အထုပ်များ၏အမှတ်စဉ်နံပါတ်များ;
- တိုင်မာများ;
- အပြုသဘောနှင့် အနုတ်သဘောဆောင်သော ပြေစာများ။
ဒါပမေယျ့။
Pipelining ဖြင့် ယုံကြည်စိတ်ချရသော ဒေတာလွှဲပြောင်းခြင်း ပရိုတိုကော
ကျွန်ုပ်တို့ထည့်သွင်းစဉ်းစားထားပြီးဖြစ်သည့် ဗားရှင်းတွင်၊ ယုံကြည်စိတ်ချရသော ပေးပို့မှုပရိုတိုကောသည် အလွန်ထိရောက်မှုမရှိပါ။ RTT တိုးလာသောအခါ ဆက်သွယ်ရေးချန်နယ်မှ ပံ့ပိုးပေးသော ထုတ်လွှင့်မှုကို "နှေးကွေးစေသည်" ကို စတင်သည်။ ၎င်း၏ စွမ်းဆောင်ရည်ကို မြှင့်တင်ရန်နှင့် ဆက်သွယ်ရေးချန်နယ်၏ bandwidth ကို ပိုမိုကောင်းမွန်စွာအသုံးချရန်၊ ပိုက်လိုင်းကို အသုံးပြုသည်။

ပိုက်လိုင်းအသုံးပြုခြင်းသည် အောက်ပါတို့ကို ဖြစ်စေသည်။
- ပေးပို့ထားသော ပက်ကေ့ခ်ျများ (ပြန်လည်ပေးပို့ခြင်းမှလွဲ၍) အားလုံးကို သီးသန့်ခွဲခြားသတ်မှတ်နိုင်ရမည်ဖြစ်ပြီး၊
- ပေးပို့ခြင်းနှင့် လက်ခံခြင်းဘက်များတွင် ကြားခံများကို တိုးမြှင့်ရန် လိုအပ်သည်။
အတွဲလိုက်နံပါတ်များနှင့် ကြားခံအရွယ်အစားများအတွက် လိုအပ်ချက်များသည် packet ဖောက်ပြန်မှု၊ ဆုံးရှုံးမှုနှင့် နှောင့်နှေးမှုများကို တုံ့ပြန်သည့်အနေဖြင့် ပရိုတိုကောက လုပ်ဆောင်မှုများအပေါ် မူတည်ပါသည်။ ပိုက်လိုင်းကိစ္စတွင်၊ အမှားပြင်ဆင်ခြင်းနည်းလမ်းနှစ်ခုရှိသည်။
- N packets များကို ပြန်ပေးခြင်း၊
- ရွေးချယ်မှု ထပ်ခါထပ်ခါ။
နောက်ပြန် N packets - လျှောဝင်းဒိုးပရိုတိုကော

ပေးပို့သူသည် အစီအစဉ်သုံးမျိုးအား ပံ့ပိုးပေးရမည်-
- အဆင့်မြင့် ပရိုတိုကောဖြင့် ခေါ်ဆိုပါ။ ပေးပို့သည့်လုပ်ဆောင်ချက်ကို အထက်မှခေါ်သောအခါ၊ ပေးပို့သူသည် ဝင်းဒိုးပြည့်ခြင်းရှိ၊ ဝင်းဒိုးမပြည့်ပါက၊ ပက်ကေ့ခ်ျအသစ်တစ်ခုကို ဖွဲ့စည်းပြီး ပို့လွှတ်ကာ ကိန်းရှင်များ၏ တန်ဖိုးများကို မွမ်းမံထားသည်။ မဟုတ်ပါက၊ ပေးပို့သူသည် ဝင်းဒိုး ပြည့်နေကြောင်း သွယ်ဝိုက်သော ညွှန်ပြချက်ဖြစ်သည့် အပေါ်အလွှာသို့ ပြန်ပို့ပေးသည်။ ပုံမှန်အားဖြင့်၊ အထက်အလွှာသည် အချိန်အတန်ကြာပြီးနောက် ထုတ်လွှင့်မှုကို ပြန်လည်ကြိုးစားလိမ့်မည်။ တကယ့်အပလီကေးရှင်းတစ်ခုတွင်၊ ပေးပို့သူသည် ဝင်းဒိုးမပြည့်မီမှသာ ပေးပို့သည့်လုပ်ဆောင်ချက်ကို ခေါ်ဆိုရန် အပေါ်အလွှာမှ ခွင့်ပြုမည့် တစ်ပြိုင်တည်းလုပ်ဆောင်မှု ယန္တရားတစ်ခု (ဥပမာ၊ semaphore သို့မဟုတ် အလံ) တွင် ပေးပို့သူသည် ဒေတာကို ကြားခံ (ချက်ချင်းပေးပို့မည့်အစား) ကြားခံဖြစ်စေနိုင်ဖွယ်ရှိသည်။
- အသိအမှတ်ပြုလက်ခံမှု။ ပရိုတိုကောတွင်၊ N ၏ရှေ့ဆက်နံပါတ်များပါသည့် အတွဲများအားလုံးကို အောင်မြင်စွာရရှိထားကြောင်း ညွှန်ပြသော အတွဲလိုက်နံပါတ် N ပါသည့် ပက်ကတ်အတွက် ယေဘူယျအသိအမှတ်ပြုချက်ကို ထုတ်ပေးပါသည်။
- သက်တမ်းကုန်ဆုံးချိန်။ ပရိုတိုကောသည် ပက်ကတ်နှင့် အသိအမှတ်ပြုမှု ဆုံးရှုံးမှုနှင့် နှောင့်နှေးမှုများကို ရှာဖွေရန် အချိန်တိုင်းကိရိယာကို အသုံးပြုသည်။ အချိန်ကုန်လွန်သွားပါက၊ ပို့လွှတ်သည့်အဖွဲ့အစည်းသည် ပေးပို့လာသော အသိအမှတ်မပြုထားသော ပက်ကေ့ခ်ျအားလုံးကို ပြန်လည်ပေးပို့သည်။
အထပ်ထပ်ရွေးချယ်ပါ။
ပြတင်းပေါက် အရွယ်အစားနှင့် ဖြတ်သန်းမှု နှောင့်နှေးမှု ထုတ်ကုန် ကြီးမားသောအခါ၊ ပိုက်လိုင်းတွင် ထုပ်ပိုးမှု အများအပြား ရှိနိုင်သည်။ ဤကိစ္စတွင်၊ packet အမှားတစ်ခုသည် packet အများအပြားကို ပြန်လည်ပေးပို့နိုင်စေသည်၊ အများစုမှာ မလိုအပ်ပါ။
နမူနာ
အကောင်းဆုံး အလေ့အကျင့်များကို လက်တွေ့အကောင်အထည် ဖော်ရာတွင် စုဆောင်းထားသည်။ . တစ်ယောက်ယောက်က ပိုသိရင်- .
ဆာဗာက
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"))
}
}လိုင်း
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)
}
}ကောက်ချက်
ယုံကြည်စိတ်ချရသော ဒေတာပေးပို့ခြင်းနှင့် အသုံးပြုခြင်းကို သေချာစေသော ယန္တရားများ
Механизм
လျှောက်လွှာ၊ မှတ်ချက်
ပေါင်းလဒ်စစ်ဆေးပါ
ပို့လွှတ်ထားသော ပက်ကေ့ခ်ျတွင် ဘစ်အမှားများကို ရှာဖွေရန် အသုံးပြုသည်။
အချစ်ဇာတ်လမ်း
သက်တမ်းကုန်ဆုံးချိန်ကို ရေတွက်ပြီး ၎င်း၏သက်တမ်းကုန်ဆုံးမှုကို ညွှန်ပြသည်။ နောက်ဆိုလိုသည်မှာ ဖြစ်နိုင်ခြေမြင့်မားသော အတိုင်းအတာဖြင့် ပက်ကတ် သို့မဟုတ် ၎င်း၏ ပြေစာသည် ထုတ်လွှင့်နေစဉ်အတွင်း ပျောက်ဆုံးသွားခြင်းဖြစ်သည်ဟု ဆိုလိုသည်။ ပက်ကေ့ခ်ျကို နှောင့်နှေးမှုဖြင့် ပို့ဆောင်သော်လည်း မပျောက်ဆုံးခြင်း (အချိန်လွန်ကာလ၏ အချိန်မတန်မီ သက်တမ်းကုန်ဆုံးသည်) သို့မဟုတ် ပြေစာပျောက်ဆုံးသွားပါက ပြန်လည်ပေးပို့ခြင်းသည် လက်ခံသည့်ဘက်ခြမ်းရှိ ပက်ကေ့ခ်ျ၏ ပွားခြင်းကို ဖြစ်စေပါသည်။
နံပါတ်စဥ်
ပေးပို့သူမှ လက်ခံသူထံ ပေးပို့သော ဒေတာပက်ကေ့ခ်ျများကို နံပါတ်စဉ်စီရန် အသုံးပြုသည်။ လက်ခံရရှိထားသော ပက်ကတ်များ၏ နံပါတ်စဉ်အလိုက် ကွာဟချက်များသည် လက်ခံသူအား ပက်ကတ်ဆုံးရှုံးမှုကို သိရှိနိုင်စေပါသည်။ ပက်ကတ်များ၏ တူညီသော နံပါတ်များ ဆိုသည်မှာ ပက်ကတ်များသည် တစ်ခုနှင့်တစ်ခု ထပ်နေသည် ဟု ဆိုလိုသည်။
အတည်ပြုခြင်း
လက်ခံအဖွဲ့မှ ထုတ်ပေးပြီး သက်ဆိုင်ရာ ပက်ကတ် သို့မဟုတ် ပက်ကေ့ခ်ျအုပ်စုကို အောင်မြင်စွာ လက်ခံရရှိကြောင်း ထုတ်လွှင့်သည့် ပါတီအား ညွှန်ပြသည်။ အများအားဖြင့်၊ အသိအမှတ်ပြုမှုတွင် အောင်မြင်စွာလက်ခံရရှိထားသော ပက်ကတ်များ၏ နံပါတ်စဉ်များပါရှိသည်။ ပရိုတိုကောပေါ် မူတည်၍ တစ်ဦးချင်းနှင့် အဖွဲ့၏ အသိအမှတ်ပြုမှုကြား ခြားနားချက်တစ်ခု ပြုလုပ်သည်။
အပျက်သဘော အတည်ပြုချက်
ပက်ကေ့ခ်ျတစ်ခု မှန်ကန်စွာမရရှိကြောင်း ပေးပို့သူအား အသိပေးရန် လက်ခံသူမှ အသုံးပြုသည်။ အနှုတ်သဘော အသိအမှတ်ပြုမှုတွင် ပုံမှန်အားဖြင့် မှန်ကန်စွာမရရှိသော ပက်ကတ်၏ နံပါတ်စဉ်များ ပါဝင်ပါသည်။
ပြတင်းပေါက်၊ ပိုက်လိုင်း
ပက်ကေ့ဂျ်များကို ပို့လွှတ်ရန်အတွက် အသုံးပြုနိုင်သည့် အတွဲနံပါတ်များ၏ အကွာအဝေးကို ကန့်သတ်ပါ။ Multicast နှင့် handshake protocol များသည် ACK-waiting mode နှင့် နှိုင်းယှဉ်ပါက ဆင့်ပွားအား သိသိသာသာတိုးလာနိုင်သည်။ ကျွန်ုပ်တို့မြင်နေရသည့်အတိုင်း၊ လက်ခံရရှိမှုအဆုံးနှင့် ကွန်ရက်ဝန်အားတို့အပေါ် အခြေခံ၍ ဝင်းဒိုးအရွယ်အစားကို တွက်ချက်နိုင်သည်။
နောက်ထပ် Go Networking ဥပမာများ
В .
source: www.habr.com
