
Ба онхое, ки Ба фаҳмиши шабакаҳо ва протоколҳо бахшида шудааст.
Ба таври мухтасар
Дар мақола асосҳои интиқоли боэътимоди додаҳо баррасӣ ва мисолҳо оид ба амалӣ , аз ҷумла 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
)Ҷониби интиқолдиҳанда бояд таймерро ҳар дафъае, ки пакет интиқол дода мешавад (ҳам бори аввал ва ҳам бори дуюм) оғоз кунад, халалҳоро аз таймер идора кунад ва онро қатъ кунад.
Ҳамин тариқ, мо бо мафҳумҳои калидии протоколҳои боэътимоди интиқоли маълумот шинос шудем:
- маблағи чек;
- рақамҳои силсилавии бастаҳо;
- таймерҳо;
- квитанцияхои мусбат ва манфй.
Аммо ин ҳама нест!
Протоколи боэътимоди интиқоли маълумот бо Pipelining
Дар татбиқе, ки мо аллакай баррасӣ кардем, протоколи боэътимоди таҳвил хеле бесамар аст. Он ба "суст" кардани интиқоли тавассути канали алоқа таъминшуда бо афзоиши 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)
}
}хулоса
Механизмҳое, ки интиқол ва истифодаи боэътимоди маълумотро таъмин мекунанд
Механизм
Ариза, шарҳ
Маблағи тафтиш
Барои ошкор кардани хатогиҳои бит дар бастаи интиқолшуда истифода мешавад.
Timer
Ҳисобкунии фосилаи вақт ва нишон додани ба охир расидани мӯҳлати он. Охирин нишон медиҳад, ки бо дараҷаи баланди эҳтимолият, баста ё эътирофи он ҳангоми интиқол гум шудааст. Агар баста дер расонида шавад, вале гум нашавад (бармаҳал гузаштани фосилаи вақт-аут) ё тасдиқ гум шуда бошад, интиқоли дубора ба бастаи такрорӣ дар охири қабулкунанда оварда мерасонад.
Шумораи пай дар пай
Барои тартиб додани рақами бастаҳои додаҳои аз ирсолкунанда ба қабулкунанда истифода мешавад. Норасоиҳо дар рақамҳои пайдарпайии бастаҳои гирифташуда ба қабулкунанда имкон медиҳанд, ки талафоти бастаҳоро ошкор кунанд. Рақамҳои пайдарпайии бастаҳои якхела бастаҳои такрориро нишон медиҳанд.
Тасдиқ
Аз ҷониби ҷониби қабулкунанда тавлид шудааст ва ба ҷониби интиқолдиҳанда нишон медиҳад, ки баста ё гурӯҳи бастаҳои мувофиқ бомуваффақият гирифта шудааст. Эътироф одатан рақамҳои пайдарпайии бастаҳои бомуваффақият гирифташударо дар бар мегирад. Вобаста ба протокол, байни эътирофи инфиродӣ ва гурӯҳӣ фарқият гузошта мешавад.
Тасдиқи манфӣ
Аз ҷониби қабулкунанда барои огоҳ кардани ирсолкунанда дар бораи дуруст қабул нашудани баста истифода мешавад. Тасдиқи манфӣ одатан рақами пайдарпайии бастаеро, ки дуруст қабул нашудааст, дар бар мегирад.
Тиреза, қубур
Онҳо доираи рақамҳои пайдарпайро, ки метавонанд барои интиқоли бастаҳо истифода шаванд, маҳдуд мекунанд. Интиқоли чандрасонаӣ ва дастфишорӣ интиқоли протоколро дар муқоиса бо интизории эътироф ба таври назаррас афзоиш медиҳад. Тавре ки мо мебинем, андозаи тирезаро метавон дар асоси қобилияти қабул ва буферии охири қабулкунанда ва инчунин сарбории шабака ҳисоб кард.
Намунаҳои дигари истифодаи Go барои шабака
В .
Манбаъ: will.com
