Когда я читаю из буферов tcp, какой номер я должен выбрать для значения mtu

Вот мой код с 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-заголовок, поэтому какой номер я должен ввести здесь?

В моей сети используется протокол ppoe, поэтому по умолчанию (1518 - 18 - 8) 8 - заголовок протокола ppoe, rasult - 1492, тогда какой номер я должен ввести туда 1492 или 1464? (1492-28)

Обратите внимание, что использование размера MTU для чтения из потока TCP в большинстве случаев бессмысленно. Стек TCP повторно собирает пакеты, и вы не можете ими управлять. В большинстве случаев вы хотели бы читать, используя наименьшее количество системных вызовов, поэтому вы часто заключаете соединение в bufio.

JimB 26.10.2018 18:48
0
1
159
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, разница между 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
    }
  }

И это приспособится. NB make () - относительно дорогой вызов, поэтому вы можете посмотреть на sync.pool или другие подходы для управления буферами.

Другие вопросы по теме