Как использовать GSO для отправки UDP-пакетов

# #go #network-programming

Вопрос:

Можно ли использовать общую разгрузку сегментации Linux (GSO)?

Ответ №1:

Да и Нет

GSO устанавливается в ядре, в частности в Сетевом драйвере. В этой статье рассматривается конкретика. Включение GSO обычно выполняется с помощью ethtool утилиты в Linux:

 ethtool --offload  eth0 gso on
 

Поэтому, если предположить, что это задано, то это повлияет на весь трафик, проходящий через интерфейс, включая тот, который генерируется приложением Go.

Это было бы сложнее, но также можно использовать программу go для включения GSO через протокол ethtool. Вероятно, вы можете найти пакет ethtool go для этого.

Обновить

Как вы указали, вы можете оптимизировать GSO (после включения его в соответствии с приведенной выше информацией) еще больше, установив параметры сокета размера сегмента. Из блога cloudflare, которым вы поделились, показано, как это сделать на C:

 setsockopt(fd, SOL_UDP, UDP_SEGMENT, amp;gso_size, sizeof(gso_size)))
 

Под капотом это делается с помощью операционной системы Syscall.

Я предполагаю, что вы используете go-quic as QUIC, на который ссылается блог Cloudflare. go-quic можно взять готовую сетку.PacketConn, поэтому вам нужно будет создать его с нуля и добавить опцию сокета сегментации:

 s, err := syscall.Socket(...)
if err != nil {
        // error handling
}
if err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.UDP_SEGMENT, gso_size); err != nil {
        syscall.Close(s)
        // error handling
}
if err := syscall.Bind(s, ...); err != nil {
        syscall.Close(s)
        // error handling
}
if err := syscall.Listen(s, ...); err != nil { // or syscall.Connect
        syscall.Close(s)
        // error handling
}
f := os.File(s, ...)
ln, err := net.FileLitsener(f) // or net.FileConn, net.FilePacketConn

//ln can now be used by go-quic
 

Примечание: gso_size-это int, и его необходимо знать заранее

Комментарии:

1. Согласно blog.cloudflare.com/… требуются дополнительные параметры сокета/дополнительные данные.