د باور وړ ډیټا لیږد اساسات

د باور وړ ډیټا لیږد اساسات

هغو کسانو ته چې لټوي د شبکې او پروتوکولونو درک کولو لپاره وقف شوی.

په لنډه توګه

مقاله د معتبر معلوماتو لیږد اساساتو په اړه بحث کوي، مثالونه پلي کوي Goد UDP او TCP په شمول. پر بنسټ وختونه, два, درې او کتابونه "کمپیوټر شبکې. د پورته څخه ښکته طریقه"، که نه نو هرڅوک یوازې د تنینبام او اولیروف په اړه بحث کوي.

د ترانسپورت پرت پروتوکول

د غوښتنلیک پروسو ترمینځ منطقي اړیکه چمتو کوي چې په مختلف کوربه کې پرمخ ځي. د غوښتنلیک له نظره، منطقي اړیکه د یو چینل په څیر ښکاري چې مستقیم پروسې سره نښلوي.

د باور وړ ډیټا لیږد اساسات

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

د باور وړ ډیټا لیږد اساسات

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

د باور وړ ډیټا لیږد اساسات

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

د باور وړ ډیټا لیږد اساسات

د باور وړ معلوماتو لیږد اصول

په بشپړ ډول خوندي چینل کې د اعتبار وړ ډیټا لیږد

ترټولو ساده قضیه. د لیږلو اړخ په ساده ډول د پورتنۍ طبقې څخه ډاټا ترلاسه کوي، یو پاکټ جوړوي چې پکې شامل وي، او چینل ته یې لیږي.

سیریل

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 څخه مخکې د ترتیب شمیرې سره ټول پاکټونه په بریالیتوب سره ترلاسه شوي.
  • د انتظار موده پای ته رسېدلې ده. د پاکټونو او رسیدونو د ضایعاتو او ځنډونو حقایقو معلومولو لپاره، پروتوکول یو ټیمر کاروي. که د وخت وقفه پای ته ورسیږي، د لیږلو اړخ ټول لیږل شوي غیر منل شوي پاکټونه بیا لیږي.

انتخابي تکرار

کله چې د کړکۍ اندازه او د تولید - تبلیغ ځنډ محصول لوی وي ، نو د کڅوړو لوی شمیر ممکن په پایپ لاین کې وي. په داسې حالت کې، د یوې کڅوړې تېروتنه ممکن د لوی شمیر پاکټونو د بیرته لیږدولو لامل شي، چې ډیری یې اړین ندي.

بېلګه:

ښه نظري تمرینونه په عملي تطبیق کې راټول شوي TCP. او که څوک پوهیږي چې څومره ښه - ښه راغلاست.

سیریل

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

Add a comment