நம்பகமான தரவு பரிமாற்றத்தின் அடிப்படைகள்

நம்பகமான தரவு பரிமாற்றத்தின் அடிப்படைகள்

இருப்பவர்களுக்கு நாடுகிறது நெட்வொர்க்குகள் மற்றும் நெறிமுறைகளைப் புரிந்துகொள்வதற்கு அர்ப்பணிக்கப்பட்டுள்ளது.

சுருக்கமாக

இந்தக் கட்டுரை நம்பகமான தரவு பரிமாற்றத்தின் அடிப்படைகளைப் பற்றி விவாதிக்கிறது மற்றும் எடுத்துக்காட்டுகளை செயல்படுத்துகிறது Go, 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 for networking-ஐப் பயன்படுத்துவதற்கான பிற எடுத்துக்காட்டுகள்

В களஞ்சியங்கள்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்