2009-06-23 10 views
5

Mam prosty skrypt w języku Python, który używa modułu gniazda do wysyłania pakietu UDP. Skrypt działa dobrze na moim Windowsie, ale na moim komputerze z Ubuntu Linux wysyłany przeze mnie pakiet jest nieco inny. W systemie Windows pole flag w nagłówku IP wynosi zero, ale użycie tego samego kodu w systemie Linux utworzyło pakiet z polem flag ustawionym na 4. Chciałbym zmodyfikować mój skrypt tak, aby działał on konsekwentnie w systemach Windows i Linux.Ustawianie pola flag nagłówka IP

Czy istnieje metoda kontrolowania pola flag w module gniazda? Czy jest to ustawienie, które muszę zmienić w Linuksie?

+1

Byłoby miło zobaczyć scenariusz dla kontekstu. – Almad

Odpowiedz

2

Zgaduję, że pole flags jest ustawione na 2 = b010 zamiast 4 - flagi równe 4 to niepoprawny pakiet IP. Pamiętaj, że flagi są wartością 3-bitową w IP Header. Spodziewam się zobaczyć datagramy UDP z flagami o wartości 2, co oznacza "Nie fragmentuj".

Jeśli chodzi o twoje pytanie, nie sądzę, że istnieje sposób na ustawienie flag IP bezpośrednio, bez przechodzenia przez całą drogę do korzystania z raw sockets. Nie martwiłbym się tym, ponieważ większość aplikacji nie ma dobrego powodu, aby zrywać bezpośrednio z IP lub nawet z nagłówkami UDP/TCP.

+0

Tak, wireshark powiedział mi, że pole flag ma wartość 4, ale przy bliższej inspekcji został ustawiony tylko bit "Nie fragmentuj". Martwię się, że mój pakiet może zostać upuszczony z powodu flagi "nie fragmentuj". – user83753

+0

To tylko różnica zachowań stosu IP Linuksa. więcej informacji na ten temat można znaleźć tutaj: https://bugzilla.novell.com/show_bug.cgi?id=211867 – SashaN

1

construct może wykonać zadanie?

+0

Fajny moduł, popatrzę na to. Nie rozwiązuje to jednak mojego bezpośredniego problemu z bitem flagowym. – user83753

6

Oto trasa, którą podjąłem. Śledziłem link zamieszczony przez SashaN w komentarzu do odpowiedzi D. Shwleya i dowiedziałem się, dlaczego bit "nie fragmentuj" jest ustawiony w pakietach UDP Linuksa. Okazuje się, że ma to coś wspólnego z odkryciem PMTU. Krótko mówiąc, możesz wyczyścić bit "nie fragmentuj" z pakietów UDP w Pythonie, używając funkcji setsockopts w obiekcie gniazda.

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 
Powiązane problemy