2009-06-23 11 views
5

Tengo un script de Python simple que usa el módulo de socket para enviar un paquete UDP. La secuencia de comandos funciona bien en mi cuadro de Windows, pero en mi PC con Ubuntu Linux, el paquete que envía es ligeramente diferente. En Windows, el campo de banderas en el encabezado IP es cero, pero al usar el mismo código en Linux se creó un paquete con el campo de indicadores establecido en 4. Me gustaría modificar mi script para que tenga un comportamiento consistente en Windows y Linux.Configuración del campo de indicadores del encabezado IP

¿Hay algún método para controlar el campo de banderas en el módulo de socket? O bien, ¿es esta una configuración que tengo que cambiar en Linux?

+1

Sería bueno ver la secuencia de comandos para el contexto. – Almad

Respuesta

2

Supongo que el campo de banderas está realmente configurado en 2 = b010 en lugar de 4 - banderas iguales a 4 es un paquete de IP no válido. Recuerde que flags es un valor de 3 bits en el IP Header. Esperaría ver datagramas UDP con un valor de flags de 2 que significa "No fragmentar".

En cuanto a su pregunta, no creo que haya una manera de establecer las banderas de IP directamente sin hacer todo el camino hasta usar raw sockets. No me preocuparía, ya que la mayoría de las aplicaciones realmente no tienen una buena razón para ensuciar con IP o incluso encabezados UDP/TCP directamente.

+0

Sí, wireshark me dijo que el campo de banderas tenía un valor de 4, pero en una inspección más cercana solo se estableció el "No fragmentar el bit". Me preocupa que mi paquete pueda ser descartado debido a la bandera de no fragmentar. – user83753

+0

Es solo la diferencia que se comporta la pila de IP de Linux. se puede encontrar más información al respecto aquí: https://bugzilla.novell.com/show_bug.cgi?id=211867 – SashaN

1

construct podría hacer el trabajo?

+0

Cool module, voy a echar un vistazo a eso. Sin embargo, no resuelve mi problema inmediato con el bit de la bandera. – user83753

6

Aquí está la ruta que terminé tomando. Seguí el enlace publicado por SashaN en los comentarios de la respuesta de D.Shwley y aprendí un poco sobre por qué el bit "no fragmentar" está establecido en los paquetes UDP de Linux. Resulta que tiene algo que ver con el descubrimiento PMTU. Para abreviar, puede borrar el bit de no fragmentar de sus paquetes UDP en Python utilizando la función setsockopts en el objeto 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 
Cuestiones relacionadas