เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เปเบเปˆเบœเบนเป‰เบ—เบตเปˆ เบชเบฐเปเบซเบงเบ‡เบซเบฒ เบญเบธเบ—เบดเบ”เบ•เบปเบ™เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบเปเบฅเบฐเป‚เบ›เป‚เบ•เบ„เบญเบ™.

เป„เบฅเบเบฐเบชเบฑเป‰เบ™เป†

เบšเบปเบ”เบ„เบงเบฒเบกเบชเบปเบ™เบ—เบฐเบ™เบฒเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰, เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบš Go, เบฅเบงเบกเบ—เบฑเบ‡ UDP เปเบฅเบฐ TCP. เบญเบตเบ‡เปƒเบชเปˆ เป€เบงเบฅเบฒ, ะดะฒะฐ, เบชเบฒเบก เปเบฅเบฐเบ›เบถเป‰เบก "เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ„เบญเบกเบžเบดเบงเป€เบ•เบต. เบงเบดเบ—เบตเบเบฒเบ™เป€เบ—เบดเบ‡เบฅเบปเบ‡เบฅเบธเปˆเบก", เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เบธเบเบ„เบปเบ™เปเบกเปˆเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบžเบฝเบ‡เปเบ•เปˆ Tannenbaum เปเบฅเบฐ Oliferov.

เป‚เบ›เบฃเป‚เบ•เบ„เปเบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡

เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เบฎเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบกเบตเป€เบซเบ”เบœเบปเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เปˆเบฒเบ‡เป†.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เป‚เบ›เบฃเป‚เบ•เบ„เปเบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡ เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบเบฅเบฐเบšเบปเบš end, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™ routers เป€เบ„เบทเบญเบ‚เปˆเบฒเบ (เบเบปเบเป€เบงเบฑเป‰เบ™ - DPI). เปƒเบ™เบ”เป‰เบฒเบ™เบœเบนเป‰เบชเบปเปˆเบ‡, เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบˆเบฐเบ›เปˆเบฝเบ™เบ‚เปเป‰เบกเบนเบ™เบŠเบฑเป‰เบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบŠเบธเบ”เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ segments.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เปเบเบ (เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™) เบ‚เปเป‰เบ„เบงเบฒเบกเบŠเบฑเป‰เบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ fragments เปเบฅเบฐเป€เบžเบตเปˆเบก header เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบเบฑเบšเปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบˆเบฐเบœเปˆเบฒเบ™ segment เป„เบ›เบซเบฒเบŠเบฑเป‰เบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบœเบนเป‰เบชเบปเปˆเบ‡, เบšเปˆเบญเบ™เบ—เบตเปˆ segment เป„เบ”เป‰เบ–เบทเบ encapsulated เปƒเบ™ packet เบŠเบฑเป‰เบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ (datagram) เปเบฅเบฐเบชเบปเปˆเบ‡. เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบฎเบฑเบš, เบŠเบฑเป‰เบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบชเบฐเบเบฑเบ”เบชเปˆเบงเบ™เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบˆเบฒเบ datagram เปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™เป€เบ–เบดเบ‡เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡. เบ•เปเปˆเป„เบ›, เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบˆเบฐเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบš.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบœเปˆเบฒเบ™เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ—เบตเปˆเบ›เบญเบ”เป„เบžเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™

เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”. เบ”เป‰เบฒเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบŠเบฑเป‰เบ™เป€เบ—เบดเบ‡, เบชเป‰เบฒเบ‡เบŠเบธเบ”เบ—เบตเปˆเบกเบตเบกเบฑเบ™, เปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™เป„เบ›เบซเบฒเบŠเปˆเบญเบ‡เบ—เบฒเบ‡.

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 + ะฝะฐะดะตะถะฝั‹ะน ะบะฐะฝะฐะป
    }
}

เบฅเบนเบเบ„เป‰เบฒ

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

เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบœเปˆเบฒเบ™เบŠเปˆเบญเบ‡เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เบเบฒเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเบกเบฑเบ™เบ–เบทเบเบชเบปเปˆเบ‡, เปเบ•เปˆเบšเบดเบ”เปƒเบ™เบžเบงเบเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ–เบทเบเบ—เปเบฒเบฅเบฒเบเบเป‰เบญเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบšเบดเบ”เป€เบšเบทเบญเบ™.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ™เบตเป‰, เบเบปเบ™เป„เบเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰:

  • เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹;
  • เบ„เปเบฒเบ„เบถเบ”เบ„เปเบฒเป€เบซเบฑเบ™;
  • retransmission.

เป‚เบ›เป‚เบ•เบ„เบญเบ™เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ—เบตเปˆเบกเบตเบเบปเบ™เป„เบเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบซเบกเปˆเบซเบผเบฒเบเบ„เบฑเป‰เบ‡เปเบกเปˆเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒเป‚เบ›เป‚เบ•เบ„เบญเบ™ repeat reQuest (ARQ) เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.
เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเปˆเบฒเบเบฎเบฑเบšเบˆเบฐเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบ”เป†เบเปˆเบฝเบงเบเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบŠเบญเบ‡เบชเบธเบ”เบ—เป‰เบฒเบ.
เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบเบฑเบ‡เปƒเบŠเป‰เปƒเบ™ TCP, เปเบกเปˆเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเปƒเบซเบกเปˆเปƒเบชเปˆเบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบœเปˆเบฒเบ™เบŠเปˆเบญเบ‡เบ—เบตเปˆเบšเปเปˆเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฒเบ™เบšเบดเบ”เป€เบšเบทเบญเบ™เบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เปเบฅเบฐเบเบฒเบ™เบชเบนเบ™เป€เบชเบ

เบ„เบฝเบ‡เบ„เบนเปˆเบเบฑเบšเบเบฒเบ™เบšเบดเบ”เป€เบšเบทเบญเบ™, เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบกเบตเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ.
เปเบฅเบฐเป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบเบปเบ™เป„เบเปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™:

  • เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”;
  • เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบŠเบธเบ”เบ—เบตเปˆเบชเบนเบ™เป€เบชเบเป„เบ›เปƒเบซเป‰เบœเบนเป‰เบฎเบฑเบš.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบชเบนเบ™เป€เบชเบเบŠเบธเบ”, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™เบซเบผเบท, เบ–เป‰เบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบชเบนเบ™เป€เบชเบ, เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบŠเบฑเบเบŠเป‰เบฒเบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ. เปƒเบ™เบ—เบธเบเบเปเบฅเบฐเบ™เบต, เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™เปเบกเปˆเบ™เป€เบฎเบฑเบ”: เบŠเบธเบ”เป„เบ”เป‰เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™. เป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบกเป€เบงเบฅเบฒ, เบเบปเบ™เป„เบเบ™เบตเป‰เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเบ™เบฑเบšเบ–เบญเบเบซเบผเบฑเบ‡, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เป„เบฅเบเบฐเบฅเปเบ–เป‰เบฒ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบŠเบธเบ” เบชเบธเบ”เบ—เบด TCPKeepAlive เบ–เบทเบเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™ 15 เบงเบดเบ™เบฒเบ—เบตเบ•เบฒเบกเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™:

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

เบ”เป‰เบฒเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบˆเบฑเบšเป€เบงเบฅเบฒเบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเปเบžเบฑเบเป€เบเบฑเบ”เบ–เบทเบเบชเบปเปˆเบ‡ (เบ—เบฑเบ‡เบ„เบฑเป‰เบ‡เบ—เบณเบญเบดเบ” เปเบฅเบฐเบ„เบฑเป‰เบ‡เบ—เบตเบชเบญเบ‡), เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบฅเบปเบšเบเบงเบ™เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒ เปเบฅเบฐเบขเบธเบ”เบกเบฑเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰:

  • checksums;
  • เป€เบฅเบเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบŠเบธเบ”;
  • เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒ;
  • เปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™เปƒเบ™เบ—เบฒเบ‡เบšเบงเบเปเบฅเบฐเบ—เบฒเบ‡เบฅเบปเบš.

เปเบ•เปˆเบ™เบฑเป‰เบ™เบšเปเปˆเปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”!

เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบงเบฒเบ‡เบ—เปเปˆ

เปƒเบ™เบ•เบปเบงเปเบ›เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบฅเป‰เบง, เป‚เบ›เป‚เบ•เบ„เบญเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบ. เบกเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐ "เบŠเป‰เบฒเบฅเบปเบ‡" เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เป‚เบ”เบเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเป‰เบญเบ™เบงเปˆเบฒ RTT เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™. เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ•เบดเบžเบฒเบšเบ‚เบญเบ‡เบกเบฑเบ™เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒ, เบ—เปเปˆเปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ—เปเปˆโ€‹เบ™เปเบฒโ€‹เป„เบ›โ€‹เบชเบนเปˆโ€‹เบเบฒเบ™โ€‹:

  • เบเบฒเบ™เป€เบžเบตเปˆเบกเบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบเบฅเปเบฒเบ”เบฑเบš, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบชเบปเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ” (เบเบปเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™) เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ;
  • เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบ—เบฐเบงเบตเบเบฒเบ™ buffers เปƒเบ™เบ”เป‰เบฒเบ™เบชเบปเปˆเบ‡เปเบฅเบฐเบฎเบฑเบš.

เบŠเปˆเบงเบ‡เป€เบฅเบเบฅเบณเบ”เบฑเบš เปเบฅเบฐเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฐเปœเบฒเบ”เบ‚เบญเบ‡เบšเบฑเบŸเป€เบŸเบตเปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฒเบ™เบเบฐเบ—เบณเบ—เบตเปˆเป‚เบ›เบฃเป‚เบ•เบ„เปเป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเปœเบญเบ‡เบ•เปเปˆเบเบฒเบ™เบชเปเป‰เบฅเบฒเบ”เบšเบฑเบ‡เบซเบผเบงเบ‡เบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”, เบเบฒเบ™เบชเบนเบ™เป€เบชเบ, เปเบฅเบฐเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ—เปเปˆ, เบกเบตเบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”:

  • return N เปเบžเบฑเบเป€เบเบฑเบ”เบ„เบทเบ™;
  • เบเบฒเบ™เบ„เป‰เบฒเบ‡เบซเป‰เบญเบ‡เบ—เบตเปˆเป€เบฅเบทเบญเบ.

เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™ N packets - sliding window protocol

เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบœเบนเป‰เบชเบปเปˆเบ‡เบ•เป‰เบญเบ‡เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเบฒเบกเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป€เบซเบ”เบเบฒเบ™:

  • เป‚เบ—เบซเบฒเป‚เบ”เบเป‚เบ›เป‚เบ•เบ„เบญเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบเบงเปˆเบฒ. เป€เบกเบทเปˆเบญเบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒ "เบˆเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡", เบเปˆเบฒเบเบชเบปเปˆเบ‡เบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡ N เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบชเบปเปˆเบ‡เบกเบฒเบฅเปเบ–เป‰เบฒเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™). เบ–เป‰เบฒเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เปเบžเบฑเบเป€เบเบฑเบ”เปƒเบซเบกเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ•เปเปˆ, เปเบฅเบฐเบ„เปˆเบฒเบ•เบปเบงเปเบ›เบˆเบฐเบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ”เป‰เบฒเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบกเบนเบ™เป„เบ›เบซเบฒเบŠเบฑเป‰เบ™เป€เบ—เบดเบ‡, เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบŠเบตเป‰เบšเบญเบเบงเปˆเบฒเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเป€เบ•เบฑเบก. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเบŠเบฑเป‰เบ™เป€เบ—เบดเบ‡เบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡. เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบœเบนเป‰เบชเบปเปˆเบ‡เบญเบฒเบ”เบˆเบฐเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™ (เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ—เบฑเบ™เบ—เบต) เบซเบผเบทเบกเบตเบเบปเบ™เป„เบเบเบฒเบ™ synchronization (เป€เบŠเบฑเปˆเบ™ Semalt เบซเบผเบทเบ—เบธเบ‡) เบ—เบตเปˆเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบŠเบฑเป‰เบ™เป€เบ—เบดเบ‡เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเป€เบกเบทเปˆเบญเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. .
  • เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบขเบทเบ™โ€‹เบขเบฑเบ™โ€‹. เปƒเบ™เป‚เบ›เบฃเป‚เบ•เบ„เป, เบชเบณเบฅเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบกเบตเป€เบฅเบเบฅเบณเบ”เบฑเบš N, เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ—เบปเปˆเบงเป„เบ›เปเบกเปˆเบ™เบญเบญเบเป‚เบ”เบเบŠเบตเป‰เบšเบญเบเบงเปˆเบฒเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบกเบตเป€เบฅเบเบฅเบณเบ”เบฑเบšเบเปˆเบญเบ™เปœเป‰เบฒ N เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง.
  • เป„เบฅเบเบฐเบฅเปเบ–เป‰เบฒเป„เบ”เป‰เปเบปเบ”เบญเบฒเบเบธเปเบฅเป‰เบง. เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบฅเบฐเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบ‚เบญเบ‡เบŠเบญเบ‡เปเบฅเบฐเปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™, เป‚เบ›เป‚เบ•เบ„เบญเบ™เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒ. เบ–เป‰เบฒเบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเปเบปเบ”เป€เบงเบฅเบฒเปเบปเบ”เป€เบงเบฅเบฒ, เบเปˆเบฒเบเบชเบปเปˆเบ‡เบˆเบฐเบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเป‰เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™.

เบเบฒเบ™เบ„เป‰เบฒเบ‡เบซเป‰เบญเบ‡เบ—เบตเปˆเป€เบฅเบทเบญเบ

เป€เบกเบทเปˆเบญเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเปเบฅเบฐเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบžเบฑเบ™เบ”เป‰เบงเบเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, เบˆเปเบฒเบ™เบงเบ™เปเบžเบฑเบเป€เบเบฑเบ”เบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบเบญเบฒเบ”เบˆเบฐเบขเบนเปˆเปƒเบ™เบ—เปเปˆ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ”เบฝเบงเบญเบฒเบ”เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบˆเปเบฒเบ™เบงเบ™เปเบžเบฑเบเป€เบเบฑเบ”เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบซเบกเปˆ, เป€เบŠเบดเปˆเบ‡เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡.

เบ•เบปเบงเบขเปˆเบฒเบ‡:

เบ”เบตโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ” เบ—เบดเบ”เบชเบฐเบ”เบต เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบ–เบทเบเป€เบเบฑเบšเบเปเบฒเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบˆเบดเบ‡ TCP. เปเบฅเบฐโ€‹เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบœเบนเป‰โ€‹เปƒเบ”โ€‹เบœเบนเป‰โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบฎเบนเป‰โ€‹เบˆเบฑเบโ€‹เบ”เบตโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ” - เบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบš.

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

เบฅเบนเบเบ„เป‰เบฒ

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

เบชเบฐเบซเบฅเบธเบš

เบเบปเบ™เป„เบเป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบเบปเบ™เป„เบ
เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹, เบ„เปเบฒโ€‹เป€เบซเบฑเบ™โ€‹

เบเบงเบ”เบชเบญเบšเบฅเบงเบก
เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบเปƒเบ™เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™

เบˆเบฑเบšเป€เบงเบฅเบฒ
เบ™เบฑเบšเบฅเบปเบ‡เป„เบฅเบเบฐเปเบปเบ”เป€เบงเบฅเบฒ เปเบฅเบฐเบŠเบตเป‰เบšเบญเบเป€เบงเบฅเบฒเบ—เบตเปˆเบกเบฑเบ™เปเบปเบ”เบญเบฒเบเบธ. เบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเบนเบ‡, เปเบžเบฑเบเป€เบเบฑเบ”เบซเบผเบทเปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบชเบนเบ™เป€เบชเบเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡. เบ–เป‰เบฒเปเบžเบฑเบเป€เบเบฑเบ”เบ–เบทเบเบˆเบฑเบ”เบชเบปเปˆเบ‡เบ”เป‰เบงเบเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒ, เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เป€เบชเบ (เปเบปเบ”เป€เบงเบฅเบฒเบเปˆเบญเบ™เป„เบงเบญเบฑเบ™เบ„เบงเบ™เบ‚เบญเบ‡เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเปเบปเบ”เป€เบงเบฅเบฒ), เบซเบผเบทเปƒเบšเบฎเบฑเบšเป€เบ‡เบดเบ™เบซเบฒเบเป„เบ›, เบเบฒเบ™เบชเบปเปˆเบ‡เบ•เปเปˆเบˆเบฐเบžเบฒเปƒเบซเป‰เปเบžเบฑเบเป€เบเบฑเบ”เบŠเปเป‰เบฒเบเบฑเบ™เบขเบนเปˆเบ”เป‰เบฒเบ™เบเบฒเบ™เบฎเบฑเบš.

ialเบฒเบเป€เบฅเบเบŠเบตเบฃเบฝเบง
เปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบฅเบฝเบ‡เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบˆเบฒเบเบœเบนเป‰เบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบœเบนเป‰เบฎเบฑเบš. เบŠเปˆเบญเบ‡เบซเบงเปˆเบฒเบ‡เปƒเบ™เบ•เบปเบงเป€เบฅเบเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบœเบนเป‰เบฎเบฑเบšเบชเบฒเบกเบฒเบ”เบเบงเบ”เบžเบปเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”. เป€เบฅเบเบฅเบณเบ”เบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ”เบฝเบงเบเบฑเบ™เปเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเปเบžเบฑเบเป€เบเบฑเบ”เบ™เบฑเป‰เบ™เบŠเปเป‰เบฒเบเบฑเบ™

เบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™
เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบˆเบธเบ”เบฎเบฑเบš เปเบฅเบฐเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบˆเบธเบ”เบชเบปเปˆเบ‡เบ—เบตเปˆเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™ เบซเบผเบทเบเบธเปˆเบกเบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เป„เบ”เป‰เบฎเบฑเบšเบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ›เบฐเบเบญเบšเบกเบตเบ•เบปเบงเป€เบฅเบเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบŠเบธเบ”เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”. เบญเบตเบ‡เบ•เบฒเบกเบžเบดเบ—เบตเบเบฒเบ™, เบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบ‚เบญเบ‡เบšเบธเบเบ„เบปเบ™ เปเบฅเบฐเบเบธเปˆเบกเปเบกเปˆเบ™เบˆเปเบฒเปเบ™เบเป„เบ”เป‰

เบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบ—เบฒเบ‡เบฅเบปเบš
เปƒเบŠเป‰เป‚เบ”เบเบœเบนเป‰เบฎเบฑเบšเป€เบžเบทเปˆเบญเปเบˆเป‰เบ‡เปƒเบซเป‰เบœเบนเป‰เบชเบปเปˆเบ‡เบฎเบนเป‰เบงเปˆเบฒเปเบžเบฑเบเป€เบเบฑเบ”เป„เบ”เป‰เบฎเบฑเบšเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ—เบฒเบ‡เบฅเบปเบšเบ›เบฐเบเบญเบšเบกเบตเบˆเปเบฒเบ™เบงเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบŠเบธเบ”เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡

เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก, conveyorization
เบˆเปเบฒโ€‹เบเบฑเบ”โ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบงโ€‹เป€เบฅเบโ€‹เบฅเปเบฒโ€‹เบ”เบฑเบšโ€‹เบ—เบตเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เป€เบžเบทเปˆเบญโ€‹เบชเบปเปˆเบ‡โ€‹เบŠเบญเบ‡โ€‹เป„เบ”เป‰โ€‹. Multicast เปเบฅเบฐ handshake เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™, เบ‚เบฐเบซเบ™เบฒเบ”เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบฎเบฑเบšเปเบฅเบฐ buffering เบ‚เบญเบ‡เบˆเบธเบ”เบฎเบฑเบš, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบ.

เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Go เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบ

ะ’ เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™