قابل اعتماد ڈیٹا کی منتقلی کے بنیادی اصول

قابل اعتماد ڈیٹا کی منتقلی کے بنیادی اصول

ان لوگوں کو جو تلاش کرتا ہے نیٹ ورکس اور پروٹوکول کو سمجھنے کے لیے وقف ہے۔

مختصراً

مضمون قابل اعتماد ڈیٹا ٹرانسمیشن کی بنیادی باتوں پر بحث کرتا ہے، مثالوں کو لاگو کرتا ہے۔ GoUDP اور 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 سے پہلے والے ترتیب نمبر والے تمام پیکٹ کامیابی کے ساتھ موصول ہوئے تھے۔
  • انتظار کا وقفہ ختم ہو گیا ہے۔ نقصانات اور پیکٹوں اور رسیدوں میں تاخیر کے حقائق کا تعین کرنے کے لیے، پروٹوکول ٹائمر کا استعمال کرتا ہے۔ اگر ٹائم آؤٹ کا وقفہ ختم ہو جاتا ہے، تو بھیجنے والی طرف تمام بھیجے گئے غیر تسلیم شدہ پیکٹوں کو دوبارہ بھیجتا ہے۔

منتخب تکرار

جب ونڈو کا سائز اور تھرو پٹ پروپیگیشن تاخیر کی مصنوعات بڑی ہوتی ہیں، تو بڑی تعداد میں پیکٹ پائپ لائن میں ہو سکتے ہیں۔ ایسی صورت میں، ایک پیکٹ کی خرابی بڑی تعداد میں پیکٹوں کو دوبارہ منتقل کرنے کا سبب بن سکتی ہے، جن میں سے زیادہ تر کی ضرورت نہیں تھی۔

مثال کے طور پر

اوپر نظریاتی پریکٹسز کو عملی نفاذ میں جمع کیا جاتا ہے۔ ٹی سی پی. اور اگر کوئی جانتا ہے کہ کس طرح بہتر ہے - آپ کا استقبال ہے.

سرور

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)
    }
}

آؤٹ پٹ

قابل اعتماد ڈیٹا کی منتقلی اور استعمال کو یقینی بنانے کے طریقہ کار

میکانزم
درخواست، تبصرہ

رقم چیک کریں۔
منتقل شدہ پیکٹ میں بٹ کی غلطیوں کا پتہ لگانے کے لیے استعمال کیا جاتا ہے۔

ٹائمر
ٹائم آؤٹ وقفہ کو شمار کرتا ہے اور اس کی میعاد ختم ہونے کی نشاندہی کرتا ہے۔ مؤخر الذکر کا مطلب یہ ہے کہ زیادہ امکان کے ساتھ پیکٹ یا اس کی رسید ٹرانسمیشن کے دوران کھو جاتی ہے۔ اگر ایک پیکٹ تاخیر کے ساتھ پہنچایا جاتا ہے، لیکن گم نہیں ہوتا ہے (وقت ختم ہونے کے وقفہ کی قبل از وقت میعاد ختم ہو جاتی ہے)، یا رسید گم ہو جاتی ہے، تو دوبارہ ٹرانسمیشن موصول ہونے والی طرف ایک ڈپلیکیٹ پیکٹ کی طرف لے جاتی ہے۔

سیریل نمبر
بھیجنے والے سے وصول کنندہ تک منتقل ہونے والے ڈیٹا پیکٹوں کی ترتیب وار نمبرنگ کے لیے استعمال کیا جاتا ہے۔ موصول شدہ پیکٹوں کی ترتیب نمبروں میں فرق وصول کنندہ کو پیکٹ کے نقصان کا پتہ لگانے کی اجازت دیتا ہے۔ ایک ہی پیکٹ کی ترتیب نمبروں کا مطلب ہے کہ پیکٹ ایک دوسرے کے ڈپلیکیٹ ہیں۔

تصدیق
Генерируется принимающей стороной и указывает передающей стороне на то, что соответствующий пакет или группа пакетов успешно приняты. Обычно подтверждение содержит порядковые номера успешно принятых пакетов. В зависимости от протокола различают индивидуальные и групповые подтверждения

منفی تصدیق
وصول کنندہ کے ذریعہ بھیجنے والے کو مطلع کرنے کے لئے استعمال کیا جاتا ہے کہ پیکٹ غلط طریقے سے موصول ہوا ہے۔ منفی اعتراف میں عام طور پر پیکٹ کی ترتیب نمبر شامل ہوتی ہے جو صحیح طریقے سے موصول نہیں ہوئی تھی۔

کھڑکی، conveyorization
ترتیب نمبروں کی حد کو محدود کریں جو پیکٹوں کو منتقل کرنے کے لیے استعمال کیے جاسکتے ہیں۔ ملٹی کاسٹ اور ہینڈ شیک اعترافات کے انتظار کے مقابلے پروٹوکول تھرو پٹ کو نمایاں طور پر بڑھا سکتے ہیں۔ جیسا کہ ہم دیکھیں گے، ونڈو کے سائز کا حساب وصول کرنے والے اختتام کے استقبال اور بفرنگ کی صلاحیتوں کے ساتھ ساتھ نیٹ ورک لوڈ کی سطح کی بنیاد پر کیا جا سکتا ہے۔

نیٹ ورکنگ کے لیے Go استعمال کرنے کی مزید مثالیں۔

В ذخیرے.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں