2009-06-23 14 views
5

Ich habe ein einfaches Python-Skript, das das Socket-Modul verwendet, um ein UDP-Paket zu senden. Das Skript funktioniert gut auf meiner Windows-Box, aber auf meinem Ubuntu Linux-PC ist das Paket, das es sendet, etwas anders. Unter Windows ist das Flag-Feld im IP-Header gleich Null, aber mit demselben Code unter Linux wurde ein Paket mit dem flags-Feld auf 4 erstellt. Ich möchte mein Skript so ändern, dass es unter Windows und Linux konsistent ist.Das Flag-Feld des IP-Headers setzen

Gibt es eine Methode, um das Flag-Feld im Socket-Modul zu steuern? Oder ist das eine Einstellung, die ich unter Linux ändern muss?

+1

Es wäre schön, das Skript für den Kontext zu sehen. – Almad

Antwort

2

Ich vermute, dass das Flags-Feld tatsächlich auf 2 = b010 statt 4 gesetzt ist - Flags gleich 4 ist ein ungültiges IP-Paket. Denken Sie daran, dass Flags ein 3-Bit-Wert in IP Header ist. Ich würde erwarten, UDP-Datagramme mit einem Flags-Wert von 2 zu sehen, was "nicht fragmentieren" bedeutet.

Was Ihre Frage betrifft, glaube ich nicht, dass es eine Möglichkeit gibt, die IP-Flags direkt zu setzen, ohne den gesamten Weg zur Verwendung von raw sockets zu gehen. Ich würde mir darüber keine Sorgen machen, da die meisten Anwendungen keinen guten Grund haben, direkt mit IP- oder sogar UDP/TCP-Headern zu experimentieren.

+0

Ja, wireshark hat mir gesagt, dass das Feld flags einen Wert von 4 hat, aber bei näherer Betrachtung wurde nur das "Fragment nicht teilen" gesetzt. Ich mache mir Sorgen, dass mein Paket wegen der Nicht-Fragment-Markierung verloren gehen könnte. – user83753

+0

Es ist nur ein Unterschied, dass sich der IP-Stack von Linux verhält. Weitere Informationen dazu finden Sie hier: https://bugzilla.novell.com/show_bug.cgi?id=211867 – SashaN

1

construct könnte die Arbeit tun?

+0

Kühles Modul, ich werde mir das ansehen. Es löst jedoch nicht mein unmittelbares Problem mit dem Flag-Bit. – user83753

6

Hier ist die Route, die ich am Ende genommen habe. Ich folgte dem Link von SashaN in den Kommentaren von D.Shwleys Antwort und lernte etwas darüber, warum das Bit "nicht fragmentieren" in Linux UDP-Paketen gesetzt ist. Stellt sich heraus, dass es etwas mit PMTU Entdeckung zu tun hat. Lange Rede, kurzer Sinn: Sie können das Fragment nicht fragmentieren von Ihren UDP-Paketen in Python löschen, indem Sie die Funktion setsockopts im Socket-Objekt verwenden.

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 
Verwandte Themen