当我从 tcp 缓冲区读取时,我应该 select 哪个数字作为 mtu 值

When I read from tcp buffers, which number should I select for the mtu value

这是我准备读取缓冲区时使用 golang 编写的代码:

func Listen() {
  listen, _ := net.Listen("tcp4", "127.0.0.1:7000")
  defer listen.Close()
  for {
    conn, _ := listen.Accept()
    go handler(&conn)
  }
}

func handler(c *net.Conn) {
  for {
    buf := make([]byte, 1464)
    n, _ := (*c).Read(buf)
    if n == 0 {
      continue
    }
  }
}

1464是我的网络mtu 1492 - 28 IP Header,所以我应该在这里输入哪个数字?

我的网络使用ppoe协议,所以默认是(1518 - 18 - 8) 8是ppoe协议头,结果是1492,那1492和1464应该输入哪个数字?(1492-28)

在事物的方案中,1464 与 1492 差别不大,所以选择较大的一个。也许增加一点净空!

如果您想要大小恰到好处的超紧缓冲区,请执行以下操作

func handler(c *net.Conn) {
  maxSize:=1464
  for {
    buf := make([]byte, maxSize)
    n, _ := (*c).Read(buf)
    if n == 0 {
      continue
    }
    if n > maxSize {
      maxSize=n
    }
  }

而且会调整。注意 make() 是一个相对昂贵的调用,因此您可能想看看 sync.pool 或其他管理缓冲区的方法