ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ стрСмится Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² сСтях ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ…, посвящаСтся.

ΠšΡ€Π°Ρ‚ΠΊΠΎ

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ основы Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° Go, Π² Ρ‚ΠΎΠΌ числС UDP ΠΈ TCP. По ΠΌΠΎΡ‚ΠΈΠ²Π°ΠΌ Ρ€Π°Π·, Π΄Π²Π°, Ρ‚Ρ€ΠΈ ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ "ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ сСти. Нисходящий ΠΏΠΎΠ΄Ρ…ΠΎΠ΄", Π° Ρ‚ΠΎ всС ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π’Π°Π½Π½Π΅Π½Π±Π°ΡƒΠΌΠ° ΠΈ ΠžΠ»ΠΈΡ„Π΅Ρ€ΠΎΠ².

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» транспортного уровня

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ логичСскоС соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ процСссами, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… хостах. ЛогичСскоС соСдинСниС с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ выглядит ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π», нСпосрСдствСнно ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠΉ процСссы.

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ транспортного уровня ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌΠΈ систСмами, Π½ΠΎ Π½Π΅ сСтСвыми ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (ΠΊΡ€ΠΎΠΌΠ΅ β€” DPI). На сторонС отправитСля транспортный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ уровня, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ процСсса, Π² ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ транспортного уровня, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ сСгмСнтами.

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Π­Ρ‚ΠΎ дСлаСтся Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ΠΌ (ΠΏΡ€ΠΈ нСобходимости) сообщСний ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ уровня Π½Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° транспортного уровня.

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Π”Π°Π»Π΅Π΅ транспортный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ сСгмСнт сСтСвому ΡƒΡ€ΠΎΠ²Π½ΡŽ отправитСля, Π³Π΄Π΅ сСгмСнт инкапсулируСтся Π² ΠΏΠ°ΠΊΠ΅Ρ‚ сСтСвого уровня (Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ) ΠΈ отсылаСтся. На ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ сторонС сСтСвой ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ сСгмСнт транспортного уровня ΠΈΠ· Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ Π²Π²Π΅Ρ€Ρ… транспортному ΡƒΡ€ΠΎΠ²Π½ΡŽ. Π”Π°Π»Π΅Π΅ транспортный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ сСгмСнт Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ стали доступны ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ-ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ.

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

НадСТная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ случай. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ сторона просто ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, создаСт содСрТащий ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ отправляСт Π΅Π³ΠΎ Π² ΠΊΠ°Π½Π°Π».

Π‘Π΅Ρ€Π²Π΅Ρ€

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

НадСТная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ ошибками

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ этап β€” это ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹, Π½ΠΎ Π±ΠΈΡ‚Ρ‹ Π² Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Ρ‹, Π² связи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Π½Π°Π» ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ с искаТСниями.

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹:

  • обнаруТСния ошибки;
  • ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи;
  • ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ повторСния ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ с автоматичСским запросом ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ (Automatic Repeat reQuest, ARQ).
Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, стоит ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ошибок ΠΈ Π² квитанциях, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ сторона Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ послСднСго ΠΏΠ°ΠΊΠ΅Ρ‚Π°.
РСшСниС этой Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² Ρ‚ΠΎΠΌ числС Π² TCP, состоит Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ… Π½ΠΎΠ²ΠΎΠ³ΠΎ поля, содСрТащСго порядковый Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π°.

ΠžΡΠ½ΠΎΠ²Ρ‹ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

НадСТная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΌΡƒ искаТСниС ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

ΠžΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с искаТСниями, ΠΊ соТалСнию, Π² сСти присутствуСт потСря ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².
И для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹:

  • опрСдСлСния Ρ„Π°ΠΊΡ‚Π° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²;
  • ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ доставки потСрянных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ сторонС.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΊΠ²ΠΈΡ‚Π°Π½Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ, Ссли Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ потСряно, Π΅Π΅ доставки со Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. Π’ΠΎ всСх случаях производится ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅: повторная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Для контролирования Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ отсчСта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания. Π’Π°ΠΊ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ net ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 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. А Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ β€” welcome.

Π‘Π΅Ρ€Π²Π΅Ρ€

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 для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅Ρ‚ΡŒΡŽ

Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com