
هغو کسانو ته چې د شبکې او پروتوکولونو درک کولو لپاره وقف شوی.
په لنډه توګه
مقاله د معتبر معلوماتو لیږد اساساتو په اړه بحث کوي، مثالونه پلي کوي د UDP او TCP په شمول. پر بنسټ , , او کتابونه "کمپیوټر شبکې. د پورته څخه ښکته طریقه"، که نه نو هرڅوک یوازې د تنینبام او اولیروف په اړه بحث کوي.
د ترانسپورت پرت پروتوکول
د غوښتنلیک پروسو ترمینځ منطقي اړیکه چمتو کوي چې په مختلف کوربه کې پرمخ ځي. د غوښتنلیک له نظره، منطقي اړیکه د یو چینل په څیر ښکاري چې مستقیم پروسې سره نښلوي.

د پای سیسټمونو لخوا ملاتړ کیږي، مګر د شبکې روټرونو لخوا نه (پرته له دې - ). د لیږونکي اړخ کې، د ټرانسپورټ پرت د غوښتنلیک پرت ډیټا بدلوي چې دا د لیږلو غوښتنلیک پروسې څخه ترلاسه کوي د ټرانسپورټ پرت پاکټونو ته چې د برخې په نوم یادیږي.

دا د غوښتنلیک پرت پیغامونه په ټوټو ویشلو (که اړتیا وي) ترسره کیږي او هر یو ته د ټرانسپورټ پرت سرلیک اضافه کوي.

د ټرانسپورټ پرت بیا برخه د لیږونکي شبکې پرت ته لیږدوي ، چیرې چې برخه د شبکې پرت پاکټ (ډاټاګرام) کې پوښل کیږي او لیږل کیږي. د ترلاسه کولو په پای کې، د شبکې پرت د ډیټاګرام څخه د ټرانسپورټ پرت برخه استخراجوي او د ټرانسپورټ پرت ته یې لیږدوي. بیا، د ټرانسپورټ پرت د ترلاسه شوي برخې پروسس کوي ترڅو د دې ډاټا ترلاسه کونکي غوښتنلیک ته شتون ولري.

د باور وړ معلوماتو لیږد اصول
په بشپړ ډول خوندي چینل کې د اعتبار وړ ډیټا لیږد
ترټولو ساده قضیه. د لیږلو اړخ په ساده ډول د پورتنۍ طبقې څخه ډاټا ترلاسه کوي، یو پاکټ جوړوي چې پکې شامل وي، او چینل ته یې لیږي.
سیریل
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)
}
}د احتمالي غلطیو سره په چینل کې د اعتبار وړ ډیټا لیږد
بل ګام دا دی چې فرض کړئ چې ټول لیږدول شوي پاکټونه په هغه ترتیب کې ترلاسه شوي چې دوی لیږل شوي ، مګر په دوی کې بټونه د دې حقیقت له امله فاسد کیدی شي چې چینل ځینې وختونه ډیټا د تحریف سره لیږدوي.

پدې حالت کې، لاندې میکانیزمونه کارول کیږي:
- د تېروتنې کشف؛
- نظر
- بیا لیږد
د اعتبار وړ ډیټا لیږد پروتوکولونه چې د لیږد څو ځله تکرار لپاره ورته میکانیزمونه لري د اتوماتیک تکرار تکرار (ARQ) پروتوکولونو په نوم یادیږي.
برسېره پردې، دا د رسیدو په برخه کې د غلطیو احتمال په پام کې نیولو سره ارزښت لري، کله چې ترلاسه کونکي ګوند به د وروستي کڅوړې لیږد پایلو په اړه هیڅ معلومات ترلاسه نکړي.
د دې ستونزې حل، چې په TCP کې هم کارول کیږي، د ډیټا پیکټ کې یو نوی ساحه اضافه کول دي چې د کڅوړې ترتیب شمیره لري.

د باور وړ چینل له لارې د باور وړ ډیټا لیږد د پاکټ تحریف او ضایع کیدو تابع دی
د تحریف سره سره، له بده مرغه، په شبکه کې د پیکټ ضایع شتون لري.
او د دې ستونزې د حل لپاره، میکانیزمونه اړین دي:
- د بسته بندۍ حقیقت معلومول؛
- ترلاسه کونکي ګوند ته د ورک شوي کڅوړو بیا سپارل.
سربیره پردې ، د کڅوړې له لاسه ورکولو سربیره ، دا اړینه ده چې د رسید له لاسه ورکولو احتمال چمتو کړئ یا که هیڅ شی له لاسه ورنکړل شي ، د پام وړ ځنډ سره یې تحویلي. په ټولو قضیو کې، ورته کار ترسره کیږي: د کڅوړې بیرته لیږدول. د وخت کنټرول لپاره، دا میکانیزم د شمیرنې ټایمر کاروي، کوم چې تاسو ته اجازه درکوي د انتظار وقفې پای وټاکي. نو په بسته کې TCPKeepAlive د ډیفالټ لخوا 15 ثانیو ته ټاکل شوی:
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)د لیږلو اړخ اړتیا لري هرکله چې پیکټ لیږدول کیږي ټایمر پیل کړي (په لومړي او دوهم ځل) ، د ټایمر څخه مداخلې اداره کړي او ودروي.
نو، موږ د باور وړ ډیټا لیږد پروتوکولونو کلیدي مفاهیمو سره آشنا شوي یو:
- چکسم
- د کڅوړو ترتیب شمیره؛
- ټایمر
- مثبت او منفي رسیدونه.
مګر دا ټول نه دي!
د پایپ لاین کولو سره د اعتبار وړ ډیټا لیږد پروتوکول
په هغه ډول کې چې موږ دمخه په پام کې نیولي، د اعتبار وړ تحویلي پروتوکول خورا غیر موثر دی. دا د ارتباطي چینل لخوا چمتو شوي لیږد "ورو" پیل کوي لکه څنګه چې RTT ډیریږي. د دې د موثریت زیاتولو او د ارتباطي چینل ظرفیت څخه د ښه کارولو لپاره، پایپ لاین کارول کیږي.

د پایپ لاین کارول د دې لامل کیږي:
- د ترتیب شمیرو سلسله زیاتول، ځکه چې ټول لیږل شوي پاکټونه (د بیا لیږلو پرته) باید په ځانګړي ډول وپیژندل شي؛
- د لیږد او ترلاسه کولو اړخونو کې د بفرونو زیاتولو اړتیا.
د ترتیب شمیره حد او د بفر اندازې اړتیاوې په هغه عملونو پورې اړه لري چې پروتوکول د کڅوړې فساد ، ضایع کیدو او ځنډ په ځواب کې ترسره کوي. د پایپ لاین کولو په حالت کې، د غلطیو سمولو لپاره دوه میتودونه شتون لري:
- د N پاکټونه بیرته راستانه کړئ
- انتخابي تکرار.
د N پاکټونو بیرته تګ - د کړکۍ پروتوکول سلایډ

لیږونکی باید د دریو ډوله پیښو ملاتړ وکړي:
- د لوړې کچې پروتوکول لخوا تلیفون وکړئ. کله چې د معلوماتو لیږلو فنکشن ته "له پورته څخه" ویل کیږي، د لیږلو اړخ لومړی د کړکۍ د ډکولو درجې معاینه کوي (دا د N لیږل شوي پیغامونو شتون چې د رسیدونو رسید ته انتظار کوي). که کړکۍ خالي وي، یو نوی کڅوړه تولید او لیږدول کیږي، او متغیر ارزښتونه تازه کیږي. که نه نو، د لیږلو اړخ پورتنۍ پرت ته ډاټا بیرته راګرځوي، او دا یوه ښکاره نښه ده چې کړکۍ ډکه ده. معمولا پورتنۍ پرت به هڅه وکړي چې یو څه وخت وروسته بیا ډاټا لیږد کړي. په ریښتیني غوښتنلیک کې ، لیږونکی به احتمال ولري یا به ډاټا بفر کړي (د سمدستي لیږلو پرځای) یا د همغږي کولو میکانیزم ولري (لکه سیمفور یا پرچم) چې پورتنۍ پرت ته به اجازه ورکړي چې د لیږلو فنکشن ته زنګ ووهي یوازې هغه وخت چې کړکۍ خالي وي .
- تایید ترلاسه کول. په پروتوکول کې، د ترتیب نمبر N سره د یوې کڅوړې لپاره، یو عمومي اعتراف خپور شوی چې دا په ګوته کوي چې د N څخه مخکې د ترتیب شمیرې سره ټول پاکټونه په بریالیتوب سره ترلاسه شوي.
- د انتظار موده پای ته رسېدلې ده. د پاکټونو او رسیدونو د ضایعاتو او ځنډونو حقایقو معلومولو لپاره، پروتوکول یو ټیمر کاروي. که د وخت وقفه پای ته ورسیږي، د لیږلو اړخ ټول لیږل شوي غیر منل شوي پاکټونه بیا لیږي.
انتخابي تکرار
کله چې د کړکۍ اندازه او د تولید - تبلیغ ځنډ محصول لوی وي ، نو د کڅوړو لوی شمیر ممکن په پایپ لاین کې وي. په داسې حالت کې، د یوې کڅوړې تېروتنه ممکن د لوی شمیر پاکټونو د بیرته لیږدولو لامل شي، چې ډیری یې اړین ندي.
بېلګه:
ښه تمرینونه په عملي تطبیق کې راټول شوي . او که څوک پوهیږي چې څومره ښه - .
سیریل
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)
}
}پایلې
د باور وړ معلوماتو لیږد او کارولو ډاډ ترلاسه کولو میکانیزمونه
میانمار
غوښتنلیک، تبصره
رقم چک کړئ
په لیږدول شوي پاکټ کې د بټ غلطیو موندلو لپاره کارول کیږي
تیمر
د وخت پای وقفه شمیرل کیږي او په ګوته کوي کله چې پای ته رسیدلی وي. وروستنۍ معنی دا ده چې د لوړې کچې احتمال سره کڅوړه یا د هغې رسید د لیږد پرمهال ورک شوي. که چیرې یو کڅوړه په ځنډ سره تحویل شي ، مګر ورک شوی نه وي (د وخت څخه دمخه پای ته رسیدل) ، یا رسید ورک شوی وي ، بیا لیږد د ترلاسه کونکي اړخ ته د نقل شوي پاکټ لامل کیږي.
د سلسلې نمره
د لیږونکي څخه ترلاسه کونکي ته لیږدول شوي ډیټا پاکټونو د ترتیب شوي شمیرې لپاره کارول کیږي. د ترلاسه شوي کڅوړو په ترتیب کې تشې ترلاسه کونکي ته اجازه ورکوي چې د پاکټ ضایع کشف کړي. د ورته پیکټ ترتیب شمیرې پدې معنی دي چې پاکټونه د یو بل نقلونه دي
تایید
د ترلاسه کولو پای لخوا تولید شوی او د لیږلو پای ته اشاره کوي چې اړونده پاکټ یا د پاکټونو ګروپ په بریالیتوب سره ترلاسه شوی. په عموم ډول اعتراف د بریالیتوب ترلاسه شوي کڅوړو ترتیب شمیرې لري. د پروتوکول پورې اړه لري، انفرادي او ډله ایز تاییدونه توپیر لري
منفي تایید
د ترلاسه کونکي لخوا کارول کیږي ترڅو لیږونکي ته خبر ورکړي چې پاکټ په غلط ډول ترلاسه شوی. په منفي اعتراف کې معمولا د کڅوړې د ترتیب شمیره شامله وي چې په سمه توګه ندي ترلاسه شوي
کړکۍ، لېږدول
د ترتیب شمیرو لړۍ محدود کړئ چې د کڅوړو لیږدولو لپاره کارول کیدی شي. ملټي کاسټ او لاسونه کولی شي د منلو لپاره د انتظار په پرتله د پروتوکول له لارې د پام وړ وده وکړي. لکه څنګه چې موږ به وګورو، د کړکۍ اندازه د ترلاسه کولو پای ته رسیدو او بفر کولو وړتیاو، او همدارنګه د شبکې بار کچه پر بنسټ محاسبه کیدی شي.
د شبکې لپاره د Go کارولو نور مثالونه
В .
سرچینه: www.habr.com
