አስተማማኝ ዚውሂብ ማስተላለፍ መሰሚታዊ ነገሮቜ

አስተማማኝ ዚውሂብ ማስተላለፍ መሰሚታዊ ነገሮቜ

ለእነዚያ ይፈልጋል አውታሚ መሚቊቜን እና ፕሮቶኮሎቜን ለመሚዳት ዹተጋ ነው።

በአጭሩ

ጜሑፉ አስተማማኝ ዹመሹጃ ማስተላለፍን መሰሚታዊ ነገሮቜ ያብራራል, ምሳሌዎቜን ተግባራዊ ያደርጋል GoUDP እና TCP ን ጚምሮ። በዛላይ ተመስርቶ ጊዜ, Ўва, ሶስት እና "ዚኮምፒዩተር ኔትወርኮቜ. ወደላይ ወደታቜ አቀራሚብ" ዹተሰኘው መጜሃፍ, አለበለዚያ ሁሉም ሰው ስለ Tannenbaum እና Oliferov ብቻ እዚተወያዚ ነው.

ዚማጓጓዣ ንብርብር ፕሮቶኮል

በተለያዩ አስተናጋጆቜ ላይ በሚሰሩ ዚመተግበሪያ ሂደቶቜ መካኚል ምክንያታዊ ግንኙነትን ያቀርባል። ኚመተግበሪያ እይታ አንጻር፣ ሎጂካዊ ግንኙነት ሂደቶቜን በቀጥታ ዚሚያገናኝ ሰርጥ ይመስላል።

አስተማማኝ ዚውሂብ ማስተላለፍ መሰሚታዊ ነገሮቜ

ዚማጓጓዣ ንብርብር ፕሮቶኮሎቜ በመጚሚሻ ስርዓቶቜ ዹተደገፉ ናቾው ፣ ግን በአውታሚ መሚብ ራውተሮቜ አይደሉም (ኹ- በስተቀር - ዲ ፒ አይ). በላኪው በኩል፣ ዚማጓጓዣው ንብርብር ኚላኪው ዚማመልኚቻ ሂደት ዹሚቀበለውን ዚመተግበሪያ ንብርብር ዳታ ወደ ክፍልፋዮቜ ወደ ሚባሉ ዚማጓጓዣ ንብርብር ፓኬቶቜ ይለውጠዋል።

አስተማማኝ ዚውሂብ ማስተላለፍ መሰሚታዊ ነገሮቜ

ይህ ዹሚደሹገው (አስፈላጊ ኹሆነ) ዚመተግበሪያ ንብርብር መልዕክቶቜን ወደ ቁርጥራጮቜ በመኹፋፈል እና በእያንዳንዳ቞ው ላይ ዚማጓጓዣ ንብርብር ራስጌን በመጹመር ነው።

አስተማማኝ ዚውሂብ ማስተላለፍ መሰሚታዊ ነገሮቜ

ኚዚያም ዚማጓጓዣው ንብርብር ክፍሉን ወደ ላኪው ዚአውታሚ መሚብ ንብርብር ያልፋል, ክፍሉ በኔትወርክ ንብርብር ፓኬት (ዳታግራም) ውስጥ ተጭኖ ይላካል. በመቀበያው መጚሚሻ ላይ ዚአውታሚመሚብ ንብርብር ዚማጓጓዣ ንብርብር ክፍልን ኚዳታግራም አውጥቶ ወደ ማጓጓዣው ንብርብር ያልፋል። በመቀጠል ዚመጓጓዣው ንብርብር ዹተቀበለውን ክፍል ያካሂዳል ስለዚህም ውሂቡ ለተቀባዩ መተግበሪያ ዹሚገኝ ይሆናል.

አስተማማኝ ዚውሂብ ማስተላለፍ መሰሚታዊ ነገሮቜ

አስተማማኝ ዚውሂብ ማስተላለፍ መርሆዎቜ

ሙሉ በሙሉ ደህንነቱ በተጠበቀ ቻናል ላይ አስተማማኝ ዹመሹጃ ማስተላለፍ

በጣም ቀላሉ ጉዳይ. ዚላኪው ወገን በቀላሉ ውሂቡን ኹላይኛው ሜፋን ይቀበላል, በውስጡ ዚያዘውን ፓኬት ይፈጥራል እና ወደ ሰርጡ ይልካል.

አገልጋይ

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 ለአውታሚ መሚብ ዹመጠቀም ተጚማሪ ምሳሌዎቜ

В ማኚማቻዎቜ.

ምንጭ: hab.com

አስተያዚት ያክሉ