์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ธฐ๋ณธ

์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ธฐ๋ณธ

ํ•˜๋Š” ๋ถ„๋“ค์—๊ฒŒ ์ถ”๊ตฌํ•˜๋‹ค ๋„คํŠธ์›Œํฌ์™€ ํ”„๋กœํ† ์ฝœ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ „๋…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Go, UDP ๋ฐ TCP๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ฐ˜ ์‹œ๊ฐ„, ะดะฒะฐ, ์„ธ ๊ทธ๋ฆฌ๊ณ  "Computer Networks. Top-Down Approach"๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด Tannenbaum๊ณผ Oliferov์— ๋Œ€ํ•ด์„œ๋งŒ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์†ก ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ

์„œ๋กœ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ„๋„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ธฐ๋ณธ

์ „์†ก ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ ์ตœ์ข… ์‹œ์Šคํ…œ์—์„œ๋Š” ์ง€์›๋˜์ง€๋งŒ ๋„คํŠธ์›Œํฌ ๋ผ์šฐํ„ฐ์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ์™ธ: 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)
    }
}

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ„๋„์„ ํ†ตํ•œ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ „์†ก๋œ ๋ชจ๋“  ํŒจํ‚ท์ด ์ „์†ก๋œ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์‹ ๋˜์ง€๋งŒ ์ฑ„๋„์ด ๋•Œ๋•Œ๋กœ ์™œ๊ณก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ธํ•ด ํŒจํ‚ท์˜ ๋น„ํŠธ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ธฐ๋ณธ

์ด ๊ฒฝ์šฐ ๋‹ค์Œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜ ๊ฐ์ง€;
  • ํ”ผ๋“œ๋ฐฑ;
  • ์žฌ์ „์†ก.

์ „์†ก์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•œ ์œ ์‚ฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ–์ถ˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก ํ”„๋กœํ† ์ฝœ์„ ARQ(์ž๋™ ๋ฐ˜๋ณต ์š”์ฒญ) ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ์ˆ˜์‹ ์ž๊ฐ€ ๋งˆ์ง€๋ง‰ ํŒจํ‚ท ์ „์†ก ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์‹  ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
TCP์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ํŒจํ‚ท์˜ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ ํŒจํ‚ท์— ์ƒˆ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๊ธฐ๋ณธ

ํŒจํ‚ท ์™œ๊ณก ๋ฐ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฑ„๋„์„ ํ†ตํ•œ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์™œ๊ณก๊ณผ ํ•จ๊ป˜ ๋„คํŠธ์›Œํฌ์— ํŒจํ‚ท ์†์‹ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ํŒจํ‚ท ์†์‹ค ์‚ฌ์‹ค์„ ๊ฒฐ์ •ํ•˜๊ณ ;
  • ์†์‹ค๋œ ํŒจํ‚ท์„ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋‹ค์‹œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ํŒจํ‚ค์ง€ ๋ถ„์‹ค ์™ธ์—๋„ ์˜์ˆ˜์ฆ ๋ถ„์‹ค ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€๋น„ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ถ„์‹ค๋œ ๊ฒƒ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ฐฐ์†ก์ด ์ƒ๋‹นํžˆ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋™์ผํ•œ ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํŒจํ‚ท์ด ์žฌ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋Œ€๊ธฐ ๊ฐ„๊ฒฉ์˜ ๋์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์นด์šดํŠธ๋‹ค์šด ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒจํ‚ค์ง€์— ๊ทธ๋ฌผ 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. ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด - ํ™˜์˜.

์„œ๋ฒ„

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€