2010-10-14 97 views
0

沒有小說,我會盡力解釋並希望它有道理。IP數據包/超時/間隔控制

我們有一個應用程序,通過簡單的HTTPS處理髮送數據到服務器,沒問題,一切正常。但是,如果數據包是通過衛星電話發送的,則傳輸延遲比在陸地線路高速網絡訪問中處理的典型毫秒長得多。因此,完全相同的數據包發送出去都通過Windows API自動分解時通過如下功能:

DECLARE INTEGER InternetOpen IN WININET.DLL 
DECLARE INTEGER InternetCloseHandle IN WININET.DLL 
DECLARE INTEGER InternetConnect IN WININET.DLL 
DECLARE INTEGER HttpOpenRequest IN WININET.DLL 
DECLARE INTEGER InternetQueryOption IN WININET.DLL 
DECLARE INTEGER InternetSetOption IN WININET.DLL 
DECLARE INTEGER HttpSendRequest IN WININET.DLL 
DECLARE INTEGER HttpQueryInfo IN WININET.DLL 
DECLARE INTEGER InternetReadFile IN WININET.DLL 

我沒有特別控制「數據包」,只是建立一個完整的請求和發送它,並得到一個回答。

發生什麼是這個。數據包通常以大量數據分割成更小的塊。然而,到達衛星時,它們不會以正確的順序重新組裝,因此最終目的地的接受失敗。

所以,現在的問題......有沒有一種方法可以讓Windows知道減慢數據包發送的頻率以幫助防止延遲問題?由於我們無法訪問衛星系統,因此我們無法證明這是問題所在,但看起來他們看到了數據包,只是不要以正確的順序將它們放在一起。

謝謝。

+0

這是很正常的。 TCP處理它。 '放慢'不會解決問題。 – 2010-10-14 14:31:54

+0

@Hans Passant,然後它的(衛星)端,並完全不受我們的控制? – DRapp 2010-10-14 14:35:27

+0

您從未*掌控IP數據包的路由方式。這條路線甚至可以在你傳送時改變。這可能導致可變延遲和數據包倒序。再次使用矮胖子是TCP的工作。 – 2010-10-14 14:39:58

回答

1

正如評論中所述,您無法控制TCP數據包的路由。 TCP作爲一種協議將數據分割成更小的塊(即使數據在Windows機器上約爲20Kb,TCP將把這些數據分割成幾個數據包,儘管Windows中的最大數據包大小約爲60Kb)。

您可以嘗試設置Windows使用的「MTU」設置。您可以在註冊表中執行此操作。這樣做可以讓您設置一個較小的「最大傳輸單元」大小,因爲您有高延遲連接。嘗試將MTU設置爲500或更少。

如果這些都不適合您的需求,您還可以查看RFC以瞭解如何編寫自己的TCP數據包標頭,以調整數據包的處理方式。看看這裏直接解決這個問題的RFC:http://tools.ietf.org/html/rfc1072