0

私の目的は次のとおりです。

  • ユーザーにルーターのポートを開くように依頼しないでください
  • 私のアプリケーションでコードによってすべてを行う

それは可能ですか?このアプリケーションは、同じアプリケーションがインストールされている他のマシンでのみ動作することになっていることを考えると、それを実行できるある種のプロトコルをゼロから作成できますか?

私の一般的な考え方は、接続をできるだけ速くすることです。また、小さなパケットを交換する必要があります。遅延を減らすことは、単に高スループットを実現することよりもはるかに重要です。

4

2 に答える 2

5

NATを台無しにしないでください。とにかく、それはレイテンシーの助けにはなりません。かなり高レベルのプロトコルであり、比較的遅いTCP/IPを使用しています。つまり、プロトコルはあなたのために多くの素晴らしい仕事をしますが、待ち時間の点でコストがかかります。(接続状態を維持し、パケットを整然と保ち、パケット配信などを保証する適切な仕事をします。)

非常に低遅延のネットワークチャネルが必要な場合は、UDPを使用します。これは低レベルであり、TCPほど多くの作業を行いません。UDPは、接続を開いたままにせずに各パケットを宛先に配信するために最善を尽くします。パケットは必ずしも順番に到着するとは限りません。また、パケットが宛先に到達したかどうかを知る方法があります。

あなたはそれらのものを自分で構築する必要があります-またはそれらなしで生きることを学ぶ必要があります。

UDPで構築されたアプリケーションは、多くの情報を繰り返す傾向があり、エラーの余地が大きいプロトコルロジックを実装します。その結果、一般的にレイテンシーは低くなりますが、一般的に信頼性または転送速度のいずれかが犠牲になります。

また、低遅延が必要な場合は、SSHなどを介したトンネリングなどの別のプロトコルを介してトンネリングしないでください。これにより、レイテンシが増加します。

于 2012-07-08T16:45:29.527 に答える
0

この回答は、ネットワークの設定を調整するように顧客に依頼しないという要件に合わせて調整されています。顧客にネットワーク上の変更を依頼しても問題がない場合は、Rafaelが提案するように、独自のカスタムアプリケーションを実装する必要があります。

暗号化する必要がある場合は、ポート80を介したHTTPプロトコル、またはポート443を介したHTTPS(HTTP over SSL / TLS)プロトコルを使用できます。または、ポート22でSSHを使用します。

これらは通常ファイアウォールによって開かれるポートにすぎないため、通過する可能性があります。それらが開いているという保証はありません。

HTTPまたはHTTPSを使用するときにHTTPプロトコルを使用する理由は、ファイアウォールがディープパケットインスペクションを実行している可能性があり、期待と一致しない場合は接続をブラックホール化またはリセットする可能性があるためです。ポート22経由でSSHを使用する場合も同様です。443経由でSSLを使用する方がよい場合があります。ファイアウォールがデータを復号化していないことを期待して、HTTP検査を実行します(復号化する可能性があることに注意してください)。

実装には、 libCURLまたはBoost.Asioを使用できます。

于 2012-07-08T16:47:46.523 に答える