Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Kuwii raadiyo U heellan fahamka shabakadaha iyo borotokoolka.

Si kooban

Maqaalku wuxuu ka hadlayaa aasaaska gudbinta xogta la isku halleyn karo, wuxuu hirgeliyaa tusaalooyin ku saabsan Go, oo ay ku jiraan UDP iyo TCP. Iyada oo ku saleysan jeer, два, saddex iyo buugaagta "Computer Networks. Habka sare ee hoose", haddii kale qof kastaa wuxuu ka hadlayaa kaliya Tannenbaum iyo Oliferov.

Habka lakabka gaadiidka

Waxay bixisaa xidhiidh macquul ah oo ka dhexeeya hababka codsiga ee ku socda martigaliyayaasha kala duwan. Marka laga eego dhinaca codsiga, isku xirka macquulka ah wuxuu u eg yahay kanaal si toos ah ugu xira hababka.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Nidaamyada lakabka gaadiidka waxaa taageera nidaamyada dhamaadka, laakiin ma taageeraan router-yada shabakada (marka laga reebo - DPI). Dhinaca soo diraha, lakabka gaadiidku waxa uu u beddelaa xogta lakabka arjiga ee uu ka helo habka codsiga dirida xidhmooyinka lakabka gaadiidka ee loo yaqaan qaybaha.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Tan waxa lagu sameeyaa iyada oo loo kala qaybiyo (haddii loo baahdo) fariimaha lakabka codsiga qaybo jajab ah oo lagu daro madax lakabka gaadiidka mid kasta oo iyaga ka mid ah.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Lakabka gaadiidku wuxuu markaas u gudbiyaa qaybta lakabka shabakadda soo-diraha, halkaas oo qaybta ay ku duuban tahay xirmo lakabka shabakadeed (datagram) oo loo diro. Dhamaadka helitaanka, lakabka shabakadu waxay ka soo saartaa qaybta lakabka gaadiidka ee xogta oo u gudbisa lakabka gaadiidka. Marka xigta, lakabka gaadiidka ayaa socodsiiya qaybta la helay si xogteeda ay u noqoto mid la heli karo codsiga helitaanka.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Mabaadi'da gudbinta xogta lagu kalsoonaan karo

Gudbinta xogta lagu kalsoonaan karo oo ku saabsan kanaal gebi ahaanba ammaan ah

Kiiska ugu fudud. Dhinaca dirista waxay si fudud uga helaysaa xogta lakabka sare, waxay abuurtaa baakidh ay ku jirto, waxayna u dirtaa kanaalka.

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 + надежный канал
    }
}

Macaamiil

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)
    }
}

Xogta lagu kalsoonaan karo oo lagu gudbiyo kanaalka oo leh khaladaad suurtagal ah

Talaabada xigta waa in la qiyaaso in dhammaan baakadaha la kala qaado loo helo sida ay u kala horreeyaan, laakiin qashinka iyaga ku jira ayaa laga yaabaa in la kharribmo sababtoo ah xaqiiqda ah in kanaalka mararka qaarkood uu gudbiyo xogta iyada oo qalloocan.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Xaaladdan, hababka soo socda ayaa loo isticmaalaa:

  • ogaanshaha qaladka;
  • jawaab celin;
  • dib u gudbinta.

Nidaamyada wareejinta xogta ee lagu kalsoonaan karo ee leh habab isku mid ah oo lagu soo celiyo gudbinta marar badan ayaa loo yaqaan borotokoolka Ku celiska ReQuest (ARQ).
Intaa waxaa dheer, waxaa habboon in la tixgeliyo suurtagalnimada khaladaadka ku jira rasiidhada, marka qaybta qaata aysan heli doonin wax macluumaad ah oo ku saabsan natiijooyinka wareejinta xirmada ugu dambeysa.
Xalka dhibaatadan, oo sidoo kale loo isticmaalo TCP, waa in lagu daro goob cusub xirmada xogta oo ka kooban lambarka isku xigxiga ee xirmada.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Xogta lagu kalsoonaan karo oo lagu gudbiyo kanaal aan la isku halayn karin oo ay ku xiran tahay baakad qalloocan iyo luminta

Iyada oo ay weheliso qallooca, nasiib daro, waxaa jira khasaare baakidh ah ee shabakada.
Si loo xaliyo dhibaatadan, hababka ayaa loo baahan yahay:

  • go'aaminta xaqiiqda luminta baakidhka;
  • dib u geynta baakadaha lumay ee loo dhiibay xisbiga.

Intaa waxaa dheer, marka lagu daro luminta xirmada, waxaa lagama maarmaan ah in la bixiyo suurtagalnimada luminta rasiidka ama, haddii aysan waxba lumin, gaarsiinteeda dib u dhac weyn. Dhammaan kiisaska, wax la mid ah ayaa la sameeyaa: baakadda ayaa dib loo soo gudbiyaa. Si loo xakameeyo wakhtiga, farsamadani waxay isticmaashaa saacada tirinta, kaas oo kuu ogolaanaya inaad go'aamiso dhamaadka muddada sugitaanka. Markaa xirmada net TCPKeepAlive waxaa loo dejiyay 15 ilbiriqsi si caadi ah:

// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
    defaultTCPKeepAlive = 15 * time.Second
)

Dhanka wax diraya waxay u baahan yihiin inay bilaabaan saacad kasta mar kasta oo baakidh la gudbiyo (labadaba mar iyo mar labaadba), ka xakamayso joojinta saacada oo joojiso.

Markaa, waxaanu barannay fikradaha muhiimka ah ee hab-maamuuska wareejinta xogta ee la isku halayn karo:

  • jeegaggu;
  • tirooyinka isku xigxiga ee xirmooyinka;
  • saacadaha;
  • rasiidhada togan iyo kuwa taban.

Laakiin intaas oo dhan maaha!

Hab-maamuuska wareejinta xogta lagu kalsoonaan karo oo leh dhuumo qaadasho

Kala duwanaanshiyaha aan horay u tixgelinnay, nidaamka gaarsiinta la isku halayn karo waa mid aan waxtar lahayn. Waxay bilaabataa inay "gaabiso" gudbinta ay bixiso kanaalka isgaadhsiinta marka RTT uu kordho. Si loo kordhiyo waxtarkeeda oo si wanaagsan looga faa'iidaysto awoodda kanaalka isgaarsiinta, dhuumaha ayaa la isticmaalaa.

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Isticmaalka tuubada tuubada waxay keenaysaa:

  • kordhinta tirada tirooyinka isku xigxiga, maadaama dhammaan baakadaha la soo diray (marka laga reebo dib u gudbinta) ay tahay in si gaar ah loo aqoonsado;
  • Baahida loo qabo in la kordhiyo bakhaarrada dhinaca gudbinta iyo qaabilaadda.

Tirada isku xigxiga iyo shuruudaha cabbirka kaydinta waxay ku xiran tahay ficillada hab-maamuusku uu ka jawaabo musuqmaasuqa, luminta, iyo daahitaanka xirmada. Marka laga hadlayo dhuumaha, waxaa jira laba hab oo lagu saxo khaladaadka:

  • soo celi baakooyinka N dib;
  • ku celcelin doorasho.

Baakadaha N dib ugu noqoshada - borotokoolka daaqada simbiriirixan

Aasaaska Wareejinta Xogta Lagu kalsoonaan karo

Soo diruhu waa inuu taageeraa saddex nooc oo dhacdooyin ah:

  • wac hab-maamuus heer sare ah. Marka shaqada diritaanka xogta loo yaqaan "laga bilaabo korka", dhinaca soo diraya marka hore waxay hubinayaan heerka buuxinta daaqada (taas oo ah, joogitaanka fariimaha N la soo diray ee sugaya helitaanka rasiidhada). Haddii daaqadu madhan tahay, baakidh cusub ayaa la soo saaray oo la kala qaadaa, qiyamka doorsoomayaasha waa la cusboonaysiiyaa. Haddii kale, dhinaca dirista waxay ku soo celisaa xogta lakabka sare, tani waa calaamad muujinaysa in daaqadu buuxsanto. Caadi ahaan lakabka sare wuxuu isku dayi doonaa inuu gudbiyo xogta mar kale muddo ka dib. Codsiga dhabta ah, soo diruhu waxay u badan tahay inuu kaydiyo xogta (halkii uu isla markiiba u diri lahaa) ama wuxuu lahaan doonaa habka isku-dhafka (sida semaphore ama calan) kaas oo u oggolaanaya lakabka sare inuu waco shaqada diritaanka kaliya marka daaqadu faaruqsan tahay .
  • helitaanka xaqiijin Hab-maamuuska, baakidh leh nambarka isku xigxiga N, waxa la soo saaray qirasho guud oo muujinaysa in dhammaan baakadaha wata lambarrada taxanaha ah ee ka horreeya N si guul leh loo helay.
  • Muddadii sugitaanka way dhacday. Si loo go'aamiyo xaqiiqooyinka khasaaraha iyo dib u dhaca baakadaha iyo rasiidhada, hab-maamuuska waxa uu isticmaalayaa saacad. Haddii muddada wakhtigu dhammaatay, dhinaca soo diraya waxay soo dirtaa dhammaan baakadaha aan la aqoonsan ee la soo diray.

Ku celcelin xul ah

Marka cabbirka daaqada iyo badeecada dib u dhigista faafinta ay weyn yihiin, tiro badan oo baakado ah ayaa laga yaabaa inay ku jiraan dhuumaha. Xaaladdan oo kale, hal cilad baakidh ah ayaa laga yaabaa inay keento tiro badan oo baakidhooyin ah in dib loo gudbiyo, kuwaas oo intooda badan aan loo baahnayn.

Tusaale:

Ugu fiican aragti ahaan dhaqamada waxaa lagu soo aruuriyaa fulin dhab ah TCP. Oo haddii qof ogaado sida ugu wanaagsan - soo dhaweyn.

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"))
    }
}

Macaamiil

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)
    }
}

gunaanad

Farsamooyin lagu hubinayo wareejinta iyo isticmaalka xogta la isku halayn karo

Mechanism
Codsi, faallo

Hubi wadarta
Loo isticmaalo in lagu ogaado khaladaadka yar ee xirmada la kala qaado

Saacadda
Waxay tiriyaa muddada u dhexaysa waxayna muujisaa marka uu dhacay Midda dambe waxay la macno tahay in iyada oo ay jirto ixtimaalka sare ee baakadda ama rasiidhkeeda ay lunto inta lagu jiro gudbinta. Haddii baakidh la keeno daahitaan, laakiin aan la lumin (ku dhicis degdeg ah ee muddada u dhaxaysa), ama rasiidka lumo, dib u gudbintu waxay keentaa baakidh nuqul ah oo dhinaca hesha ah.

Nambarada taxan
Waxaa loo istcimaalay tirinta isku xigxiga ee xirmooyinka xogta laga soo diro soo diraha loo gudbiyo qaataha. Nusqaamaha tirooyinka isku xigxiga ee xirmooyinka la helay ayaa u oggolaanaya qaataha inuu ogaado khasaaraha xirmada. Isla lambarada isku xigxiga ee baakidhku waxay ka dhigan yihiin in baakooyinka midba midka kale nuqul ka yahay

Xaqiijinta
Waxaa keenay dhamaadka helista oo tusinaya dhamaadka dirida in xirmada ama kooxda xidhmooyinka u dhiganta si guul leh loo helay. Caadi ahaan qirashadu waxa ay ka kooban tahay tirooyinka isku xigxiga ee xidhmooyinka si guul leh loo helay. Iyadoo ku xiran hab-maamuuska, xaqiijinta shaqsi iyo koox ayaa la kala saaraa

Xaqiijinta taban
Wuxuu isticmaalay qaataha si uu ugu wargaliyo soo diraha in baakadda si khaldan loo helay. Ictiraafka taban waxaa badanaa ka mid ah lambarka isku xigxiga ee xirmada oo aan si sax ah loo helin

Daaqadda, gudbinta
Yaree tirada tirooyinka isku xigxiga ee loo isticmaali karo gudbinta xirmooyinka. Multicast iyo gacan-qaadka ayaa si weyn u kordhin kara soosaarka borotokoolka marka loo eego sugitaanka qirashada. Sida aan arki doonno, cabbirka daaqada waxaa lagu xisaabin karaa iyadoo lagu saleynayo soo dhaweynta iyo awoodaha soo dhaweynta ee dhamaadka helitaanka, iyo sidoo kale heerka culeyska shabakada

Tusaalayaal badan oo isticmaalka Go ee isku xidhka

В kayd.

Source: www.habr.com

Add a comment