Come impostare il bit di flag "non frammentare" per il pacchetto TCP in Go?
Per prima cosa è necessario sapere che TCP non ama i frammenti IP. La maggior parte, se non tutte, le implementazioni principali evitano la frammentazione per i segmenti TCP utilizzando il rilevamento MTU del percorso.
Il TL; DR è che il pacchetto IP tipico contenente un segmento TCP ha un set di bit DF. Puoi (e dovresti) provarlo. Qui sto annusando qualche secondo di traffico tra la mia macchina e 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 che il bit DF è impostato. Confesso in altre acquisizioni che ho visto il segmento TCP occasionale in un pacchetto IP senza un bit DF; Sospetto che lo rfc1191 abbia una spiegazione per questo.
Ora torniamo alla tua domanda, penso che ci sia alcun modo portabile per impostare il bit DF e questa è una domanda più diffusa (non c'è nemmeno un modo POSIX-portatile). Esiste (probabilmente) una porta di fuga nel pacchetto pertinente per l'implementazione sotto golang.org/x/sys.
Ad esempio, su un Unix che supporta IP_DONTFRAG
come FreeBSD, è possibile utilizzare unix.SetsockoptInt
e scavare il valore costante pertinente.
Su Linux non c'è IP_DONTFRAG
, come hai scoperto da the question you linked. La soluzione alternativa sembra essere quella di utilizzare IP_MTU_DISCOVER
che risulta disponibile come a constant in the unix package. Puoi usare lo stesso unix.SetsockoptInt
per impostarlo.
Forse è necessario il proprio loop per non consentire il frammento, come in https://github.com/beatgammit/arduino-tcp-server/blob/master/TCPServer.ino – VonC
@VonC Ciao, non lo faccio t comprendere appieno perché l'impostazione del primo byte come 0x81 (come menzionato nel loro README) potrebbe impedire il frammento. Il mio istinto è che questo numero magico potrebbe formare il byte per un pacchetto senza frammentare, ma in realtà il pacchetto può ancora essere frammentato. Sono corretto o mi manca qualcosa qui? Grazie!! – zzy
Buona domanda. Non lo so, tranne la sezione 5.7 di https://datatracker.ietf.org/doc/rfc6455/?include_text=1 ha esempi di frame singolo che iniziano con '0x81'. – VonC