是否有一個實現獨立TCP堆棧的Python庫?Python TCP堆棧實現
,因爲我通過套接字(他們正在隧道邊向我這個插座)接收的數據包流,我不能使用普通的Python socket庫。當我收到一個指向特定端口的TCP SYN數據包時,我想接受連接(發送syn-ack),然後獲取由另一端發送的數據(正確確認)。
我當時希望有某種已經寫好的TCP堆棧可以使用。有任何想法嗎?我過去曾經使用lwip做過一個C項目 - 在python中的這些行將會是完美的。
是否有一個實現獨立TCP堆棧的Python庫?Python TCP堆棧實現
,因爲我通過套接字(他們正在隧道邊向我這個插座)接收的數據包流,我不能使用普通的Python socket庫。當我收到一個指向特定端口的TCP SYN數據包時,我想接受連接(發送syn-ack),然後獲取由另一端發送的數據(正確確認)。
我當時希望有某種已經寫好的TCP堆棧可以使用。有任何想法嗎?我過去曾經使用lwip做過一個C項目 - 在python中的這些行將會是完美的。
你不說你正在使用哪個平臺,但是如果你在使用linux,我會打開一個tun/tap interface並將IP數據包作爲一個真正的網絡接口返回到內核中,這樣內核可以完成所有工作那些棘手的TCP東西。
這是(例如)OpenVPN的工作原理 - 它通過UDP或TCP接收原始IP數據包,並通過tun/tap接口將它們隧道傳回內核。
我認爲有一個TUN/TAP接口窗口現在也將其用於OpenVPN的端口到Windows開發。
我喜歡這個想法。我使用的是linux,因此獲取tun/tap設備和tap0 intf設置並不困難。不幸的是,我不知道如何使用它。首先,我正在將我的原始未封裝數據包寫入tap0(使用原始套接字)。我看到tap0上顯示正確的SYN數據包(指向tap0的MAC和IP地址)。但是,如果我運行netcat偵聽tap0的IP地址,我不會看到它用syn-ack進行響應。我可以通過telnet連接到它(儘管內核似乎只是通過lo來縮短這個流量)。 任何關於如何讓這個工作的指針?謝謝尼克! – 2009-10-18 20:46:49
我知道這是不是直接的Python相關的,但如果你正在尋找做繁重的網絡處理,你應該考慮二郎神,而不是Python的。只是一個建議......你總是可以用Twisted做一個這樣的事情......如果你覺得喜歡冒險(並且有很多時間在你身邊);-)
爲什麼選擇Erlang?爲什麼不是C? C++? Java的? etc ... – jmucchiello 2009-10-17 01:22:07
因爲Erlang非常適合做異步進程。 – jldupont 2009-10-17 01:34:46
我投票贊成這項決定 - 投棄權票的人應該爲自己感到羞愧 - 要求某人質疑他們的工具要求沒有任何不妥。這就是說 - 爲什麼erlang具體? – 2009-10-17 01:35:14
掃視Scapy,它看起來像它可能能夠處理這些低級別的情況。我沒有自己使用它,所以我不能確認它是否解釋了你所做的。我只瀏覽了文檔。
Scapy很整潔,但我認爲它不會幫助我處理協議本身 - 只是將數據包解碼爲其組成字段? – 2009-10-18 20:49:13
如果您已經在插座的另一端,即轉發TCP包你致力於軟件,那麼也許TCPWatch會告訴你如何得到的SYN數據包。 SCAPY確實非常適合發送您想要的數據包,但我不確定它會作爲代理服務器。
http://hathawaymix.org/Software/TCPWatch
但是,如果你不承諾什麼是在發送端,則可以考慮使用雙絞線或海螺的paramiko做SSH轉發。即使你不需要加密,你仍然可以使用這些對你的CPU影響很小的河豚。這並不意味着你需要另一端的Conch,因爲SSH是標準化的,所以任何SSH軟件都應該工作。在SSH世界中,這通常被稱爲「端口轉發」,人們使用SSH終端客戶端登錄SSH服務器並設置端口轉發隧道。海螺和Paramiko允許您將其構建到Python應用程序中,以便不需要SSH終端客戶端。
我最終在Python中實現了一個非常基本的TCP棧。這正是我所從事的項目所需要的,但可以使用一些工作。如果你想看看它的來源,請訪問:http://github.com/dound/vns/blob/master/TCPStack.py – 2010-02-07 21:08:13