2009-06-23 23 views
5

Ho un semplice script Python che utilizza il modulo socket per inviare un pacchetto UDP. Lo script funziona bene sul mio Windows box, ma sul mio Ubuntu Linux PC il pacchetto che invia è leggermente diverso. Su Windows il campo flags nell'header IP è zero, ma usando lo stesso codice su Linux ho creato un pacchetto con il campo flags impostato su 4. Vorrei modificare il mio script in modo che abbia un comportamento coerente su Windows e Linux.Impostazione del campo flags dell'intestazione IP

Esiste un metodo per controllare il campo flags nel modulo socket? Oppure, questa è un'impostazione che devo cambiare in Linux?

+1

Sarebbe bello vedere lo script per il contesto. – Almad

risposta

2

Suppongo che il campo flags sia effettivamente impostato su 2 = b010 anziché su 4 - flags pari a 4 è un pacchetto IP non valido. Ricorda che i flag sono un valore a 3 bit nello IP Header. Mi aspetto di vedere i datagrammi UDP con un valore flags di 2 che significa "Do not framment".

Per quanto riguarda la tua domanda, non credo che ci sia un modo per impostare direttamente gli IP flag senza utilizzare fino allo raw sockets. Non me ne preoccuperei poiché molte applicazioni non hanno davvero una buona ragione per eliminare direttamente le intestazioni IP o anche UDP/TCP.

+0

Sì, wireshark mi ha detto che il campo flags aveva un valore 4 ma a un'ispezione più ravvicinata era impostato solo il "Do not framment bit". Sono preoccupato che il mio pacchetto potrebbe essere lasciato cadere a causa del flag di non frammentazione. – user83753

+0

È solo la differenza che si comporta lo stack IP di Linux. ulteriori informazioni a riguardo possono essere trovate qui: https://bugzilla.novell.com/show_bug.cgi?id=211867 – SashaN

1

construct potrebbe fare il lavoro?

+0

Cool module, darò un'occhiata a quello. Tuttavia, non risolve il mio problema immediato con il bit della bandiera. – user83753

6

Ecco il percorso che ho preso. Ho seguito il link postato da SashaN nei commenti della risposta di D.Shwley e ho imparato un po 'sul perché il bit "do not framment" è impostato nei pacchetti UDP di Linux. Si scopre che ha qualcosa a che fare con la scoperta di PMTU. Per farla breve, è possibile cancellare il bit non frammentare dai pacchetti UDP in Python usando la funzione setsockopts nell'oggetto socket.

import socket 
IP_MTU_DISCOVER = 10 
IP_PMTUDISC_DONT = 0 # Never send DF frames. 
IP_PMTUDISC_WANT = 1 # Use per route hints. 
IP_PMTUDISC_DO = 2 # Always DF. 
IP_PMTUDISC_PROBE = 3 # Ignore dst pmtu. 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.connect(("10.0.0.1", 8000)) 
s.send("Hello World!") # DF bit is set in this packet 
s.setsockopt(socket.SOL_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DONT) 
s.send("Hello World!") # DF bit is cleared in this packet 
Problemi correlati