猿问

去udp请求(数据包)丢失

我为 tcp 和 udp 连接编写了简单的服务器和客户端


package main


//server.go


import (

    "fmt"

    "net"

    "os"

    "os/signal"

    "syscall"

)


func main() {

    tcp := 0

    udp := 0


    defer func(o, t *int) {

        fmt.Println(*o, *t)

    }(&tcp, &udp)


    go func() {

        l, err := net.ListenTCP("tcp", &net.TCPAddr{

            IP:   net.ParseIP("0.0.0.0"),

            Port: 3000,

        })

        if err != nil {

            panic(err)

        }


        b := make([]byte, 24)


        for {

            conn, err := l.Accept()

            if err != nil {

                continue

            }


            n, err := conn.Read(b)

            if err != nil {

                continue

            }


            r := string(b[:n])


            if r == "close" {

                conn.Close()

                break

            } else {

                _, err = conn.Write([]byte("pong"))

                if err != nil {

                    continue

                }

            }


            conn.Close()

            tcp++

        }


        l.Close()

    }()


    go func() {

        conn, err := net.ListenUDP("udp", &net.UDPAddr{

            IP:   net.ParseIP("0.0.0.0"),

            Port: 3000,

        })

        if err != nil {

            panic(err)

        }


        b := make([]byte, 24)


        for {

            n, addr, err := conn.ReadFromUDP(b)

            if err != nil {

                continue

            }


            r := string(b[:n])


            if r == "close" {

                break

            } else {

                _, err = conn.WriteToUDP([]byte("pong"), addr)

                if err != nil {

                    continue

                }

            }


            udp++

        }


        conn.Close()

    }()


    signals := make(chan os.Signal, 1)

    signal.Notify(signals, os.Interrupt, syscall.SIGTERM)


    <-signals

}

并得到一个奇怪的行为:并非所有 udp 请求都在许多连接上发送或处理。

当我发送 100 或 200 时,服务器和客户端都告诉我所有请求都有效,但从 1000 开始,服务器和客户端的 udp 请求丢失了大约 5%,但没有恐慌。
我知道 udp 允许数据包丢失,但 5% 的本地主机请求似乎是一个错误。


月关宝盒
浏览 109回答 1
1回答

桃花长相依

我们知道,UDP是无连接的,所以丢包可能就是UDP的这种特性造成的。可以有多种方法来降低数据包丢失率。降低客户端发送数据包的速率调用SetWriteBuffer增加客户端缓冲区大小并设置SetReadBuffer增加服务器端缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;conn,&nbsp;err&nbsp;:=&nbsp;net.DialUDP("udp",&nbsp;nil,&nbsp;addr) &nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;conn.SetWriteBuffer(64&nbsp;*&nbsp;1024&nbsp;*&nbsp;1024)通过查看系统网络信息netstat -s -udp,获取UDP统计信息。您可以尝试在服务器端更改rmem_max和的默认值。rmem_default详情请参考1和2
随时随地看视频慕课网APP

相关分类

Go
我要回答