2012-10-29 45 views
5

我有一個扭曲海螺SSH服務器和典型的情形是這樣的:通過OpenSSH客戶端扭海螺 - 流量控制

混帳>> --- WAN1 --- >>扭海螺SVR >> --- WAN2 - >> Git服務器

'git push'會在WAN1上發送數據的速度比我能通過WAN2代理它快,所以我需要告訴客戶端放慢速度(遠在任何TCP數據包之前丟失會導致調整TCP窗口大小)以避免Twisted服務器上的緩衝過多。讀SSH的RFC這是通過不通過調用窗口確認來完成的,這將導致git push在syscall上寫入由openssh支持的管道。我可以通過將localWindowSize設置爲0來完成這一任務,並且飛行數據仍將着陸,因爲230上的謂詞應該仍然存在通過(給localWindowLeft)。我想知道這是否是正確的方法,或者我是否錯過了用Twisted SSH Conch進行流量控制的明顯問題? *

注:我承認有上(通道)方法stopWriting和startWriting佔位符,我可以重寫,所以我有鉤來控制變速器「混帳拉」的另一邊,但林感興趣的另一側。另外IPush/IPull製作者似乎不適用於這個級別,我不知道如何在沒有屠殺海螺的情況下將這些更高級的抽象關聯起來?

回答

3

我沒有使用Twisted,根本不知道海螺,但沒有人回答,我會給它一個鏡頭。

作爲一般原則,您可能希望在網絡中間緩衝很少(如果有的話)。 (Jim Gettys關於「緩衝區膨脹」的說明很有啓發性。)所以很顯然你提出了一個明智的問題。

我假設海螺在客戶端收到數據時在代碼中調用一個函數。在將數據傳送到後端服務器之前,是否只需從該呼叫中退出就足夠了?內核仍然會緩衝入站和出站套接字中的數據,因此不會立即向下遊客戶端發送信號,但我希望它能夠穩定在穩定狀態。

當然,作爲替代方案,您可以在不同於SSH的層上穿越此路由器。如果您在較低層建立隧道,以便您有一個端到端的TCP連接,那麼TCP堆棧應該找出一個好的窗口大小。

如果隧道在更高一層,做一個git push到中間服務器,然後使用post-receive鉤推對象的方式休息,那麼你獲得最大的緩衝(這一切都存放到磁盤)和更快對客戶的響應時間,儘管更長的總延遲。它具有明顯的優勢,即實施起來更簡單。

+0

「我假設Conch在客戶端收到數據時會調用一個函數,只要不能從該調用中返回,直到可以將數據傳遞到後端服務器爲止?」這不會在生產中作爲Twisted運行在事件循環中,如果我們阻塞數據到達時調用的函數,那麼它將首先刪除使用Twisted的任何好處。雖然我一直在反彈,但我想我會最終遷移到GoLang,在這裏crypto庫公開了一個乾淨的SSH實現,我可以控制這些東西。 –