2012-07-08 22 views
0

我的目的是:到C繞過NAT和開放端口++實現低延遲

  • 沒有要求用戶對他的路由器
  • 做的代碼一切都與我的應用程序
上打開端口

有可能做到這一點?考慮到這個應用程序只能與安裝了相同應用程序的其他機器一起工作,我可以從底層開始編寫某種協議嗎?

我的一般想法是儘可能快地建立連接,我也必須交換小數據包,降低延遲對於我來說比只具有高吞吐量更重要。

+0

你可以使用像80端口這樣的常開端口,但是如果你這樣做的話你會從互聯網流量中獲得爭用。 – Bojangles 2012-07-08 16:10:12

+0

@JamWaffles可以給我一個例子嗎?基本上我必須過濾數據包和/或簽名他們?我對TCP/IP協議棧的工作原理有了大致的瞭解,但現在我開始編寫這些東西,並且我必須更深入。 – user827992 2012-07-08 16:12:29

+2

您可以使用HTTP協議作爲傳輸方式,並且可以通過它發送和接收加密/簽名的數據。如果您使用SSL庫使用HTTPS,您可能會發現它更容易完成。那麼,港口將是443,而不是80. 443也是通常開放的。而且,有22端口的SSH。 – jxh 2012-07-08 16:16:37

回答

5

不要亂搞NAT。無論如何,這無助於延遲。您正在使用TCP/IP,這是一個相當高級的協議,並且相對較慢。那就是 - 協議爲你做了很多偉大的工作 - 但是在延遲方面需要付出代價。 (它保持連接狀態,並保持數據包有序,並保證數據包傳輸等方面做得不錯)。

如果您想要一個非常低延遲的網絡通道使用UDP-這是較低級別,並且幾乎不做與TCP一樣多的工作。 UDP只是盡最大努力將每個數據包發送到目的地,而不必保持連接打開,數據包不一定按順序到達,並且知道數據包是否到達目的地。

你需要自己建立這些東西 - 或學會在沒有它們的情況下生活。

構建在UDP上的應用程序傾向於重複大量的信息,並且實施協議邏輯有很​​大的出錯空間。其結果通常是較低的延遲 - 但通常以可靠性或傳輸速率爲代價。

此外 - 如果您需要低延遲,不要隧道通過另一種協議,如通過SSH隧道或其他協議。這隻會增加延遲。

+0

你知道這個圖書館嗎? http://udt.sourceforge.net/ – user827992 2012-07-08 16:51:53

+0

不,但是這看起來像是一個使用UPD實現低延遲高性能數據傳輸的人的例子。 – 2012-07-08 16:54:28

0

此答案適合您的要求,即您不要求客戶調整其網絡上的任何設置。如果您可以讓客戶在您的網絡上爲您更改內容,那麼您應該按照Rafael的建議實施您自己的自定義應用程序。

如果您需要加密,則可以通過端口80或HTTPS(即基於SSL/TLS的HTTP)協議通過端口443使用HTTP協議。或者通過端口22使用SSH。

這些只是通常由防火牆打開的端口,所以您很可能會通過。不能保證他們會公開。

使用HTTP或HTTPS時使用HTTP協議的原因是,防火牆可能正在執行深度數據包檢測,如果連接不符合預期,它可能會造成黑洞或重置連接。在端口22上使用SSH也是如此。您最好使用443以上的SSL,並希望防火牆不會解密數據以進行HTTP檢查(請記住它可能是解密)。可以使用libCURLBoost.Asio

+0

你知道這個圖書館嗎? http://udt.sourceforge.net/ – user827992 2012-07-08 16:51:29

+0

@ user827992:我聽說過它。這是一種有效利用可用帶寬的傳輸方式。但是,在通過防火牆獲取UDP流量時會遇到一些問題。 – jxh 2012-07-08 16:54:06