![Une image pour attirer l'attention CPAP](https://habrastorage.org/webt/dt/6u/6m/dt6u6mkbykipwnlqrxpqkxgabp8.jpeg)
Ceux qui cherchent à comprendre les réseaux et protocoles sont dédiés.
Brièvement, Go, UDP TCP. , , " . ", .
Protocole de couche transport
Fournit une connexion logique entre les processus d'application s'exécutant sur différents hôtes. Une connexion logique du point de vue des applications ressemble à un canal qui connecte directement les processus.
![Connexion logique](https://habrastorage.org/webt/6z/kb/2t/6zkb2tzuvsxqwispzl7i3enweyg.png)
, ( — DPI). , , , .
![Encapsulation de données](https://habrastorage.org/webt/v2/ds/5n/v2ds5nwztqj3cufrsvbslxsdwuk.png)
( ) .
![En-têtes de niveau de transport](https://habrastorage.org/webt/yj/mk/z7/yjmkz7wzjh63a8hn3y3udomm2nw.png)
, () . . , -.
![Algorithme d'interaction](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)
}
}
— , , , , , .
![Distorsion de canal](https://habrastorage.org/webt/bf/lt/sn/bfltsnnzlsk3oognk7lqhzjmnlk.png)
:
, , (Automatic Repeat reQuest, ARQ).
, , .
, TCP, , .
![Numéro de série du pack](https://habrastorage.org/webt/bm/6h/s7/bm6hs7dqiraracspl-jthxqz3to.png)
,
, , .
:
, , , , . : . , . net TCPKeepAlive 15 :
const (
defaultTCPKeepAlive = 15 * time.Second
)
( , ), .
, :
!
, , . «» , , RTT. , .
![L'image du pipeline informatique est presque un sujet](https://habrastorage.org/webt/gp/es/cp/gpescpmztt2yvg0h5atwq9vwmlc.png)
:
, , . :
N —
![Fenêtre coulissante](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)
}
}
,
Autres exemples d'utilisation de Go pour la mise en réseau
Dans le référentiel .