
Sa mga kinsa Gipahinungod sa pagsabot sa mga network ug mga protocol.
Sa mubo
Ang artikulo naghisgot sa mga sukaranan sa kasaligang pagpadala sa datos ug nagpatuman sa mga pananglitan niini , lakip ang UDP ug TCP. Base sa , , ug ang librong "Computer Networks: A Top-Down Approach," kon dili, ang tanan naghisgot lang bahin kang Tannenbaum ug Oliferov.
Protokol sa transport layer
Naghatag og lohikal nga koneksyon tali sa mga proseso sa aplikasyon nga nagdagan sa lainlaing mga host. Gikan sa perspektibo sa mga aplikasyon, ang lohikal nga koneksyon makita isip usa ka channel nga direktang nagkonektar sa mga proseso.

gisuportahan sa mga end system apan dili sa mga network router (gawas sa - Sa bahin sa nagpadala, ang transport layer nag-convert sa datos sa application layer nga nadawat niini gikan sa proseso sa pagpadala sa aplikasyon ngadto sa mga pakete sa transport layer nga gitawag og mga segment.

Mahimo kini pinaagi sa pagbahin-bahin (kon gikinahanglan) sa mga mensahe sa application layer ngadto sa mga fragment ug pagdugang og header sa transport layer sa matag fragment.

Ang transport layer unya mopasa sa segment ngadto sa network layer sa nagpadala, diin kini gisulod sa usa ka network-layer packet (datagram) ug ipadala. Sa receiving end, ang network layer mokuha sa transport-layer segment gikan sa datagram ug mopasa niini ngadto sa transport layer. Ang transport layer unya moproseso sa nadawat nga segment aron ang datos niini magamit sa receiving application.

Mga prinsipyo sa luwas nga pagpadala sa datos
Kasaligan nga pagpadala sa datos pinaagi sa usa ka hingpit nga luwas nga channel
Ang pinakasimple nga kaso: Ang nagpadala nga bahin modawat lang og datos gikan sa ibabaw nga layer, maghimo og pakete nga adunay sulod niini, ug ipadala kini paubos sa channel.
Server
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 + надежный канал
}
}Kustomer
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)
}
}Kasaligan nga pagpadala sa datos pinaagi sa usa ka channel nga adunay posibleng mga sayop
Ang sunod nga lakang mao ang paghunahuna nga ang tanang gipadala nga mga pakete nadawat sa han-ay sa pagpadala niini, apan ang mga bits niini mahimong nadaot tungod sa kamatuoran nga ang channel usahay magpadala og datos nga adunay mga distorsyon.

Sa kini nga kaso, ang mosunod nga mga mekanismo gigamit:
- pag-ila sa sayop;
- feedback;
- pagpadala pag-usab.
Ang kasaligang mga protocol sa pagpadala sa datos nga adunay ingon nga mga mekanismo alang sa daghang mga pagsubli sa pagpadala gitawag nga mga protocol sa Automatic Repeat ReQuest (ARQ).
Dugang pa, angay nga hunahunaon ang posibilidad sa mga sayop sa mga resibo, kung ang nakadawat nga partido wala makadawat bisan unsang impormasyon bahin sa mga resulta sa katapusang pagbalhin sa pakete.
Ang solusyon niini nga problema, nga gigamit sa TCP ug uban pang mga butang, mao ang pagdugang og bag-ong field sa data packet nga adunay sulod nga packet sequence number.

Kasaligang pagpadala sa datos pinaagi sa dili kasaligang channel nga nagtugot sa packet distortion ug loss
Gawas sa mga distorsyon, subo lang kay naa pud packet loss sa network.
Ug aron masulbad kini nga problema, gikinahanglan ang mga mekanismo:
- pagtino sa kamatuoran sa pagkawala sa pakete;
- paghatud pag-usab sa nawala nga mga pakete ngadto sa nakadawat nga partido.
Dugang pa, dugang sa pagkawala sa packet, kinahanglan nga tagdon ang posibilidad sa nawala nga resibo o, kung walay nawala, ang paghatud niini nga adunay dakong pagkalangan. Sa tanan nga mga kaso, parehas nga aksyon ang mahitabo: ang packet ipadala pag-usab. Aron makontrol ang oras, kini nga mekanismo naggamit usa ka countdown timer, nga nagtugot sa usa nga mahibal-an ang katapusan sa agwat sa paghulat. Busa, sa packet Ang TCPKeepAlive gibutang sa 15 segundos isip default:
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)Ang transmitting side kinahanglan nga magsugod sa timer matag higayon nga ang usa ka packet ipadala (sa unang higayon ug sa ikaduhang higayon), modumala sa mga interrupt gikan sa timer, ug mopahunong niini.
Mao nga, nasinati na nato ang mga importanteng konsepto sa kasaligang mga protocol sa pagpadala sa datos:
- mga tseke;
- mga serial number sa mga pakete;
- mga timer;
- positibo ug negatibo nga mga resibo.
Apan dili lang kana!
Kasaligang Data Transfer Protocol nga adunay Pipelining
Sa implementasyon nga atong nahisgotan na, ang kasaligang delivery protocol dili kaayo episyente. Nagsugod kini sa "pagpahinay" sa transmission nga gihatag sa communication channel samtang nagkataas ang RTT. Aron mapaayo ang episyente niini ug mas magamit ang bandwidth sa communication channel, gigamit ang pipelining.

Ang paggamit sa pipelining moresulta sa:
- pagdugang sa range sa sequence numbers, tungod kay ang tanang gipadala nga mga packet (gawas sa mga retransmission) kinahanglan nga mailhan nga talagsaon;
- ang panginahanglan sa pagdugang sa mga buffer sa mga kilid sa pagpadala ug pagdawat.
Ang range sa sequence numbers ug buffer size requirements nagdepende sa tubag sa protocol sa packet corruption, loss, ug delay. Sa kaso sa pipelining, adunay duha ka pamaagi sa pagkorektar sa error:
- ibalik ang N ka pakete;
- pinili nga pagsublisubli.
Mga backward N packet - sliding window protocol

Kinahanglan suportahan sa nagpadala ang tulo ka klase sa mga kalihokan:
- Usa ka tawag sa usa ka mas taas nga lebel nga protocol. Kung ang send function gitawag gikan sa ibabaw, ang nagpadala una nga mosusi kung ang bintana puno na ba (kana mao, kung adunay N ka gipadala nga mga mensahe nga naghulat nga ma-account). Kung ang bintana dili puno, usa ka bag-ong pakete ang maporma ug ipadala, ug ang mga kantidad sa mga variable gi-update. Kung dili, ang nagpadala mobalik sa datos sa ibabaw nga layer, nga usa ka implicit nga indikasyon nga ang bintana puno na. Kasagaran, ang ibabaw nga layer mosulay pag-usab sa pagpadala sa datos pagkahuman sa pipila ka oras. Sa usa ka tinuod nga aplikasyon, ang nagpadala lagmit nga mag-buffer sa datos (imbes nga ipadala kini dayon) o adunay mekanismo sa pag-synchronize (pananglitan, usa ka semaphore o flag) nga magtugot sa ibabaw nga layer sa pagtawag sa send function kung ang bintana dili puno.
- Pagdawat og pag-ila. Sa protocol, usa ka kinatibuk-ang pag-ila ang gi-isyu para sa usa ka pakete nga adunay sequence number nga N, nga nagpakita nga ang tanang pakete nga adunay sequence number nga gisundan sa N malampusong nadawat.
- Pag-expire sa timeout. Ang protocol mogamit og timer aron mahibal-an ang pagkawala ug mga pagkalangan sa packet ug acknowledgement. Kung matapos ang timeout, ang nagpadala nga partido magpadala pag-usab sa tanan nga wala giila nga mga pakete.
Pinili nga pagsubli
Kon dako ang gidak-on sa bintana ug ang throughput-delay product, daghang gidaghanon sa mga pakete ang mahimong naa sa pipeline. Sa kini nga kaso, ang usa ka sayop sa usa ka pakete mahimong hinungdan sa pag-retransmission sa daghang gidaghanon sa mga pakete, nga kadaghanan wala kinahanglana.
Pananglitan:
Ang labing kaayo ang mga pamaagi gikolekta sa praktikal nga pagpatuman Ug kon adunay nahibalo ug mas maayong paagi - .
Server
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"))
}
}Kustomer
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)
}
}konklusyon
Mga mekanismo nga nagsiguro sa kasaligan nga pagbalhin ug paggamit sa datos
Mekanismo
Aplikasyon, komentaryo
Tsekum
Gigamit aron mahibal-an ang mga sayop sa bit sa usa ka gipadala nga pakete.
Timer
Pag-ihap sa timeout interval ug indikasyon sa pag-expire niini. Ang ulahi nagpakita nga, nga adunay taas nga lebel sa posibilidad, ang pakete o ang pag-ila niini nawala atol sa pagpadala. Kung ang pakete na-deliver nga ulahi apan wala mawala (premature expiration sa timeout interval), o ang pag-ila nawala, ang pag-retransmit moresulta sa usa ka duplicate nga pakete sa nakadawat.
Numero sa serye
Gigamit sa sequence number sa mga data packet nga gipadala gikan sa nagpadala ngadto sa tigdawat. Ang mga kal-ang sa sequence number sa nadawat nga mga pakete nagtugot sa tigdawat sa pag-detect sa packet loss. Ang parehas nga packet sequence number nagpakita sa duplicate nga mga pakete.
Pagkumpirma
Gimugna sa nakadawat nga partido ug nagpakita sa nagpadala nga ang katugbang nga pakete o grupo sa mga pakete malampusong nadawat. Ang mga pag-ila kasagaran naglangkob sa mga numero sa sunod-sunod nga nadawat nga mga pakete. Depende sa protocol, adunay kalainan tali sa indibidwal ug grupo nga mga pag-ila.
Negatibong kumpirmasyon
Gigamit sa tigdawat aron ipahibalo sa nagpadala nga ang usa ka pakete wala madawat sa husto. Ang negatibo nga pag-ila kasagaran naglakip sa numero sa han-ay sa pakete nga wala madawat sa husto.
Bintana, tubo
Gilimitahan nila ang range sa mga sequence number nga magamit para sa packet transmission. Ang multicast transmission ug handshake dako og ikatabang sa protocol throughput kon itandi sa paghulat sa mga acknowledgement. Sama sa atong makita, ang window size mahimong makalkulo base sa reception ug buffering capabilities sa receiving end, ingon man sa network load.
Ubang mga ehemplo sa paggamit sa Go para sa networking
В .
Source: www.habr.com
