socket lib golang sockets go tcp

sockets - socket - golang lib



¿Cómo establecer el bit de marca "no fragmentar" para el paquete TCP en Go? (1)

¿Cómo establecer el bit de marca "no fragmentar" para el paquete TCP en Go?

Primero, debes saber que a TCP realmente no le gustan los fragmentos de IP. La mayoría de las implementaciones principales, si no todas, evitan la fragmentación de los segmentos TCP al usar la detección MTU de rutas.

El TL; DR es que el paquete IP típico que contiene un segmento TCP tiene un bit DF configurado. Puedes (y deberías) probar esto. Aquí estoy olfateando unos segundos de tráfico entre mi máquina y stackoverflow.com:

% tshark -w /tmp/tcp.pcap tcp and host stackoverflow.com <wait a few seconds> % tshark -r /tmp/tcp.pcap -T fields -e ip.flags | sort | uniq -c 186 0x00000002

0x02 significa que el bit DF está configurado. Confieso en otras capturas que he visto el segmento ocasional de TCP en un paquete de IP sin un bit de DF; Sospecho que rfc1191 tiene una explicación para esto.

Ahora volviendo a su pregunta, creo que no hay una forma portátil de configurar el bit DF y esta es una pregunta más generalizada (ni siquiera hay una forma portátil POSIX). Hay (probable) una ventana de escape en el paquete relevante para su implementación en golang.org/x/sys .

Por ejemplo, en un Unix que sea compatible con IP_DONTFRAG , como FreeBSD, se podría usar unix.SetsockoptInt y excavar el valor constante correspondiente.

En Linux no hay IP_DONTFRAG , como descubrió a partir de la pregunta que ha vinculado . La solución alternativa parece ser usar IP_MTU_DISCOVER que está disponible como una constante en el paquete de Unix . Puede usar ese mismo unix.SetsockoptInt para configurarlo.

Tengo la intención de establecer el bit de la bandera "do not fragment" en Go, lo mismo que esta publicación mientras está en C. Revisé la lista de constantes pero no encontré esta opción. Entonces, ¿cuál es la opción correspondiente en Go?

¡Gracias por adelantado!