![Una imagen para llamar la atención. CPAP](https://habrastorage.org/webt/dt/6u/6m/dt6u6mkbykipwnlqrxpqkxgabp8.jpeg)
Aquellos que buscan entender las redes y protocolos son dedicados.
Brevemente, Go, UDP TCP. , , " . ", .
Protocolo de capa de transporte
Proporciona una conexión lógica entre procesos de aplicación que se ejecutan en diferentes hosts. Una conexión lógica desde el punto de vista de las aplicaciones parece un canal que conecta directamente los procesos.
![Conexión lógica](https://habrastorage.org/webt/6z/kb/2t/6zkb2tzuvsxqwispzl7i3enweyg.png)
, ( — DPI). , , , .
![Encapsulación de datos](https://habrastorage.org/webt/v2/ds/5n/v2ds5nwztqj3cufrsvbslxsdwuk.png)
( ) .
![Encabezados de nivel de transporte](https://habrastorage.org/webt/yj/mk/z7/yjmkz7wzjh63a8hn3y3udomm2nw.png)
, () . . , -.
![Algoritmo de interacción](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)
}
}
— , , , , , .
![Distorsión de canal](https://habrastorage.org/webt/bf/lt/sn/bfltsnnzlsk3oognk7lqhzjmnlk.png)
:
, , (Automatic Repeat reQuest, ARQ).
, , .
, TCP, , .
![Número de serie del paquete](https://habrastorage.org/webt/bm/6h/s7/bm6hs7dqiraracspl-jthxqz3to.png)
,
, , .
:
, , , , . : . , . net TCPKeepAlive 15 :
const (
defaultTCPKeepAlive = 15 * time.Second
)
( , ), .
, :
!
, , . «» , , RTT. , .
![La imagen de la tubería informática es casi un tema](https://habrastorage.org/webt/gp/es/cp/gpescpmztt2yvg0h5atwq9vwmlc.png)
:
, , . :
N —
![Ventana deslizante](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)
}
}
,
Otros ejemplos de uso de Go para redes
En el repositorio .