2016-06-11 13 views
5

Ho intenzione di impostare il bit di flag "non frammentare" in Go, la stessa cosa di this post mentre è in C. Ho controllato il constant list ma non ho trovato questa opzione. Quindi qual è l'opzione corrispondente in Go?Come impostare il bit di flag "non frammentare" per il pacchetto TCP in Go?

Grazie in anticipo!

+0

Forse è necessario il proprio loop per non consentire il frammento, come in https://github.com/beatgammit/arduino-tcp-server/blob/master/TCPServer.ino – VonC

+0

@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

+0

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

risposta

5

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.

Problemi correlati