![Uma imagem para atrair a atenção CPAP](https://habrastorage.org/webt/dt/6u/6m/dt6u6mkbykipwnlqrxpqkxgabp8.jpeg)
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.
![Conexão lógica](https://habrastorage.org/webt/6z/kb/2t/6zkb2tzuvsxqwispzl7i3enweyg.png)
, ( — DPI). , , , .
![Encapsulamento de dados](https://habrastorage.org/webt/v2/ds/5n/v2ds5nwztqj3cufrsvbslxsdwuk.png)
( ) .
![Cabeçalhos de nível de transporte](https://habrastorage.org/webt/yj/mk/z7/yjmkz7wzjh63a8hn3y3udomm2nw.png)
, () . . , -.
![Algoritmo de interação](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)
}
}
— , , , , , .
![Distorção do canal](https://habrastorage.org/webt/bf/lt/sn/bfltsnnzlsk3oognk7lqhzjmnlk.png)
:
, , (Automatic Repeat reQuest, ARQ).
, , .
, TCP, , .
![Número de série da embalagem](https://habrastorage.org/webt/bm/6h/s7/bm6hs7dqiraracspl-jthxqz3to.png)
,
, , .
:
, , , , . : . , . net TCPKeepAlive 15 :
const (
defaultTCPKeepAlive = 15 * time.Second
)
( , ), .
, :
!
, , . «» , , RTT. , .
![A imagem do pipeline de computação é quase um tópico](https://habrastorage.org/webt/gp/es/cp/gpescpmztt2yvg0h5atwq9vwmlc.png)
:
, , . :
N —
![Janela de correr](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)
}
}
,
Outros exemplos de uso do Go para redes
No repositório .