
ለእነዚያ አውታረ መረቦችን እና ፕሮቶኮሎችን ለመረዳት የተጋ ነው።
በአጭሩ
ጽሑፉ አስተማማኝ የመረጃ ማስተላለፍን መሰረታዊ ነገሮች ያብራራል, ምሳሌዎችን ተግባራዊ ያደርጋል UDP እና 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 ቀድመው ያሉ ተከታታይ ቁጥሮች ያላቸው ሁሉም እሽጎች በተሳካ ሁኔታ መገኘታቸውን የሚያመለክት አጠቃላይ እውቅና ተሰጥቷል።
- የመጠባበቂያው ጊዜ አልፎበታል. የፓኬቶች እና ደረሰኞች የመጥፋት እና የመዘግየቶች እውነታዎችን ለመወሰን ፕሮቶኮሉ ጊዜ ቆጣሪን ይጠቀማል። የጊዜ ማብቂያው ጊዜ ካለፈ፣ የላኪው ወገን ሁሉንም ያልታወቁ እሽጎች እንደገና ይልካል።
የተመረጠ ድግግሞሽ
የመስኮቱ መጠን እና የመተላለፊያ-ፕሮፓጋንዳ መዘግየቱ ምርት ትልቅ ሲሆን, ብዙ ቁጥር ያላቸው ፓኬቶች በቧንቧ መስመር ውስጥ ሊሆኑ ይችላሉ. በእንደዚህ ዓይነት ሁኔታ, ነጠላ ፓኬት ስህተት ብዙ ቁጥር ያላቸው ፓኬቶች እንደገና እንዲተላለፉ ሊያደርግ ይችላል, አብዛኛዎቹ አያስፈልጉም.
ለምሳሌ:
ከሁሉም ምርጥ ልምዶች በተግባራዊ ትግበራ ውስጥ ይሰበሰባሉ . እና አንድ ሰው እንዴት እንደሚሻል የሚያውቅ ከሆነ - .
አገልጋይ
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
