![рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░ CPAP](https://habrastorage.org/webt/dt/6u/6m/dt6u6mkbykipwnlqrxpqkxgabp8.jpeg)
рдЬреЛ рд▓реЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рдорд░реНрдкрд┐рдд рд╣реИрдВред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд, Go, UDP TCP. , , " . ", .
рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рд▓реЗрдпрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рд╡рд┐рднрд┐рдиреНрди рдореЗрдЬрдмрд╛рдиреЛрдВ рдкрд░ рдЪрд▓ рд░рд╣реА рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдмрдВрдз рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдПрдХ рдЪреИрдирд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
![рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдмрдВрдз](https://habrastorage.org/webt/6z/kb/2t/6zkb2tzuvsxqwispzl7i3enweyg.png)
, ( тАФ DPI). , , , .
![рдбреЗрдЯрд╛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди](https://habrastorage.org/webt/v2/ds/5n/v2ds5nwztqj3cufrsvbslxsdwuk.png)
( ) .
![рдкрд░рд┐рд╡рд╣рди рд╕реНрддрд░ рдХреЗ рд╣реЗрдбрд░](https://habrastorage.org/webt/yj/mk/z7/yjmkz7wzjh63a8hn3y3udomm2nw.png)
, () . . , -.
![рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо](https://habrastorage.org/webt/pb/sa/ix/pbsaixvqmzcoazgfk-4yxuluxqm.png)
. , .
package main
import (
"log"
"net"
)
func main() {
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)
println(string(buf[0:n]), " form ", addr.IP.String())
if err != nil {
log.Fatal(err)
}
}
}
package main
import (
"fmt"
"log"
"net"
"time"
)
func main() {
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
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)
}
time.Sleep(time.Second * 1)
}
}
тАФ , , , , , .
![рдЪреИрдирд▓ рд╡рд┐рдХреГрддрд┐](https://habrastorage.org/webt/bf/lt/sn/bfltsnnzlsk3oognk7lqhzjmnlk.png)
:
, , (Automatic Repeat reQuest, ARQ).
, , .
, TCP, , .
![рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдкреИрдХ рдХрд░реЗрдВ](https://habrastorage.org/webt/bm/6h/s7/bm6hs7dqiraracspl-jthxqz3to.png)
,
, , .
:
, , , , . : . , . net TCPKeepAlive 15 :
const (
defaultTCPKeepAlive = 15 * time.Second
)
( , ), .
, :
!
, , . ┬л┬╗ , , RTT. , .
![рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреА рдЫрд╡рд┐ рд▓рдЧрднрдЧ рдПрдХ рд╡рд┐рд╖рдп рд╣реИ](https://habrastorage.org/webt/gp/es/cp/gpescpmztt2yvg0h5atwq9vwmlc.png)
:
, , . :
N тАФ
![рдлрд┐рд╕рд▓рдиреЗ рд╡рд╛рд▓реА рдЦрд┐рдбрдХреА](https://habrastorage.org/webt/fy/uz/33/fyuz33y3zh7fqaoppwtcqfqefju.png)
:
- . ┬л┬╗ , ( 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)
}
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 {
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)
}
}
,
рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг
рдореЗрдВ рднрдВрдбрд╛рд░ ред