قابل اعتماد ڊيٽا جي منتقلي جا بنيادي اصول

قابل اعتماد ڊيٽا جي منتقلي جا بنيادي اصول

جن کي ڳولي ٿو نيٽ ورڪ ۽ پروٽوڪول کي سمجهڻ لاء وقف.

ذريعا

آرٽيڪل قابل اعتماد ڊيٽا ٽرانسميشن جي بنيادي ڳالهين تي بحث ڪري ٿو، مثالن تي لاڳو ڪري ٿو GoUDP ۽ 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 packets واپس؛
  • منتخب ورجائي.

واپس وڃڻ N packets - sliding window protocol

قابل اعتماد ڊيٽا جي منتقلي جا بنيادي اصول

موڪليندڙ کي ٽن قسمن جي واقعن جي حمايت ڪرڻ گهرجي:

  • هڪ اعلي سطحي پروٽوڪول طرفان سڏ. جڏهن ڊيٽا موڪلڻ واري فنڪشن کي سڏيو ويندو آهي "مٿي کان"، موڪلڻ واري پاسي پهريون ڀيرو ونڊو جي ڀرڻ جي درجي کي چيڪ ڪري ٿو (يعني، 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

تبصرو شامل ڪريو