为了账号安全,请及时绑定邮箱和手机立即绑定

去udp请求(数据包)丢失

去udp请求(数据包)丢失

Go
月关宝盒 2023-03-07 14:30:55
我为 tcp 和 udp 连接编写了简单的服务器和客户端package main//server.goimport (    "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% 的本地主机请求似乎是一个错误。
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

我们知道,UDP是无连接的,所以丢包可能就是UDP的这种特性造成的。可以有多种方法来降低数据包丢失率。

  • 降低客户端发送数据包的速率

  • 调用SetWriteBuffer增加客户端缓冲区大小并设置SetReadBuffer增加服务器端缓冲区大小

    conn, err := net.DialUDP("udp", nil, addr)

    err = conn.SetWriteBuffer(64 * 1024 * 1024)
  • 通过查看系统网络信息netstat -s -udp,获取UDP统计信息。您可以尝试在服务器端更改rmem_max和的默认值。rmem_default详情请参考12


查看完整回答
反对 回复 2023-03-07
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信