
Quem procura entender as redes e protocolos é dedicado.
Brevemente, Go, UDP TCP. , , " . ", .
Protocolo da camada de transporte
Fornece uma conexão lógica entre processos de aplicativos em execução em diferentes hosts. Uma conexão lógica do ponto de vista dos aplicativos se parece com um canal que conecta diretamente processos.

, ( — DPI). , , , .

( ) .

, () . . , -.

. , .
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)
}
}
— , , , , , .

:
, , (Automatic Repeat reQuest, ARQ).
, , .
, TCP, , .

,
, , .
:
, , , , . : . , . net TCPKeepAlive 15 :
const (
defaultTCPKeepAlive = 15 * time.Second
)
( , ), .
, :
!
, , . «» , , RTT. , .

:
, , . :
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)
}
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)
}
}
,
Outros exemplos de uso do Go para redes
No repositório .