2013-10-04 19 views
2

所以我有一個像下面這樣的插座:集「下一個標題」字節V6蟒蛇插座

sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("icmp")) 

,當我發出每RFC4443正確構造ICMP6 ECHO REQUEST與因爲數據包格式錯誤,顯然是因爲IPv6頭中的'next header'字節被設置爲每個RFC(#for ICMP)爲1,所以類型128和代碼0(也是有效的校驗和)數據包被目標堆棧丟棄。

兩件事情:1。 我知道socket.getprotobyname( 「ICMP」),使插座ICMP兼容IPv4(?右)... 2. Wireshark的讀取數據包作爲IPv6的,但協議爲ICMP不ICMPv6報...

設置套接字使用protocolbyname(「icmpv6」)(這是無效的,顯然,除非有人知道正確的字符串...我試過「icmp6」「icmpv6」,但可能有一些嘗試用我可以做的下劃線)。

或改變「下一個首部」字節之前,我將數據包發送到58

不得已構建手包。

任何人有想法?很明顯,我不是Python中最有經驗的人。

回答

1

對於遇到這個人, socket.getprotobyname('<proto>') 返回對應於在/ etc /協議(UNIX)在平面文件中列出的協議的整數和/ C/windows/system32/drivers/etc/protocols(Windows)。 檢查出來!這是IP頭中唯一的特定於其有效載荷內的數據的字節。 Unix機器上的列表包含所有協議,至少在Mac上是這樣,而Windows只包含最常見的協議。你也可以編輯這個文件。

4

這應該做到這一點:

socket.getprotobyname('ipv6-icmp') 
+0

嘿,謝謝,你是對的,我當然是短視的。非常感激。 – jeffery

+0

+1,q和a。這也幫助了我,因爲我一直在尋找確切的icmpv6字符串名稱。如果OP解決了他的問題,OP應該接受答案。 – fayyazkl