2009-06-23 3 views
5

UDP paketi göndermek için soket modülünü kullanan basit bir Python betiğim var. Komut Windows penceremde iyi çalışıyor, ancak Ubuntu Linux PC'de gönderdiği paket biraz farklı. Windows'da IP üstbilgisindeki bayraklar alanı sıfırdır, ancak Linux'taki aynı kodu kullanan bayraklar alanı 4'e ayarlanmış bir paket oluşturmuştur. Komut dizilimde değişiklik yapmak istiyorum, böylece Windows ve Linux'ta tutarlı bir davranış sergiler.IP üstbilgisinin bayraklar alanını ayarlama

Soket modülündeki bayraklar alanını kontrol etmek için bir yöntem var mı? Ya da, Linux'ta değiştirmek zorunda olduğum bir ayar bu mu?

+1

Betiği bağlam için görmek güzel olurdu. – Almad

cevap

2

Bayraklar alanının aslında 4 yerine 2 = b010 olarak ayarlandığını tahmin ediyorum - 4'e karşılık gelen bayraklar geçersiz bir IP paketidir. Bayrakların IP Header'da 3 bitlik bir değer olduğunu unutmayın. UDP datagramlarını "Fragman yapma" anlamına gelen 2'lik bir bayrak değeriyle görmeyi beklerdim.

Sorunuza gelince, IP bayraklarını raw sockets'u kullanmadan tüm yolu kullanmadan doğrudan ayarlamanın bir yolu olduğuna inanmıyorum. Çoğu uygulama, doğrudan IP veya hatta UDP/TCP başlıklarıyla uğraşmak için iyi bir nedene sahip olmadığından, bu konuda endişelenmem.

+0

Evet, wireshark bana, bayrakların 4 değeri olduğunu söylemişti, ancak daha yakından incelendiğinde sadece "Parçalama biti" ayarlandı. Paketlemenin bayrağı yüzünden paketimin düşmüş olabileceğinden endişeleniyorum. – user83753

+0

Sadece linux'ın IP yığını davranır. hakkında daha fazla bilgi burada bulunabilir: https://bugzilla.novell.com/show_bug.cgi?id=211867 – SashaN

1

construct bu işi yapabilir mi?

+0

Cool modülüne bir bakacağım. Bu benim ani problemimi bayrak bitiyle çözmüyor. – user83753

6

İşte aldığım rota. D.Shwley'in cevabının yorumlarında SashaN tarafından yayınlanan bağlantıyı takip ettim ve Linux'un UDP paketlerinde "parçalara ayırma" parçasının neden oluştuğunu biraz öğrendim. Bunun PMTU keşfiyle ilgili bir şey olduğu ortaya çıkıyor. Uzun lafın kısası, soket nesnesindeki setsockopts işlevini kullanarak Python'daki UDP paketlerinizin parça parça bitini temizleyebilirsiniz.

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