15

ソケットにネットワーク エミュレーションを追加する方法を探しています。

基本的な解決策は、接続に帯域幅制限を追加する方法です。

私にとって理想的な解決策は次のとおりです。

  • 高度なネットワーク プロパティ (遅延、パケット損失) をサポート
  • オープンソース
  • 標準ソケットと同様の API を持つ (またはそれらをラップする)
  • Windows と Linux の両方で動作
  • IPv4 と IPv6 をサポート

システム レベルで、またはプロキシ (Dummynet、WANem、neten など) として機能するいくつかのオプションを見ましたが、各ソケットを手動でエミュレートできるようにしたいので、それは機能しません (たとえば、 , モデム エミュレーションと 3G エミュレーションで 1 つのソケットを開きます. 基本的に、これらのツールがどのように機能するかを知りたいです.

編集:この機能を自分の製品に組み込む必要があるため、追加のボックスや手動構成が必要なサードパーティ ツールを使用することはできません。それらのツールと同じことを行うコードを書きたいのですが、私の質問はそれを行う方法です。

エピローグ:後から考えると、私の質問は少し誤解を招くものでした。どうやら、ソケットで直接やりたいことを行う方法はありません。次の 2 つのオプションがあります。

送信/受信操作に遅延を追加します(@PaulCoccoli の回答に基づく):
送信と受信の前に遅延を追加することで、非常に大まかなネットワーク シミュレーションを取得できます (遅延の一定の遅延、送信の遅延、1 回あたり X バイトを超えて送信しないようにするため) 2 番目は帯域幅です)。
ポールの答えとコメントは私にとって大きなインスピレーションだったので、彼に賞金を授与します。

ネットワーク シミュレーション ロジックをプロキシとして追加します(@m0she および他の回答に基づく):
プロキシ経由でリクエストを送信するか、プロキシを使用してリクエストをインターセプトしてから、目的のシミュレーションを追加します。ただし、独自のプロキシ実装を作成する代わりに、既製のソリューションを使用する方が理にかなっています-私が見たところ、 Dummynetがおそらく最良の選択です (これは webpagetest.org が行っていることです)。他のオプションは以下の回答にあります。DonsProxy
も追加します。 これはより良い方法なので、この回答を受け入れます。

4

8 に答える 8

6

これを製品に組み込む場合は、実行時に独自の実装を選択できるように、ソケット API に抽象レイヤーを実装する必要があります。または、各ソケット関数のラッパーを実装し、独自のバージョンまたはシステムのバージョンのどちらを呼び出すかを選択できます。

レイテンシーの追加に関しては、ソケット API の実装でスレッドをスピンオフすることができます。そのスレッドでは、優先キューを時間順に並べます (つまり、このバックグラウンド スレッドは非常に基本的な離散イベント シミュレーションを行います)。送受信する各「パケット」は、配信時間とともにキューに入れることができます。各配達時間には、ある程度の遅延が追加される必要があります。ガウス分布を持つある種の乱数ジェネレーターを使用します。

バックグラウンド スレッドも接続の反対側をシミュレートする必要がありますが、その部分は既に実装されているように聞こえますか?

于 2012-07-13T18:55:11.700 に答える
6

それを行うソフトウェアにプロキシをコンパイルできます。これは、本格的なソックス プロキシの実装 (このようなもの) にすることも、目的にのみ役立つ (さらに、通信の宛先や他のソックス オーバーヘッドとのプレフィックスを必要としない) より単純なものにすることもできます。そのコードは、別のプロセスまたはプロセス内のスレッドとして実行できます。

プロキシにスロットリングを追加することは、それほど難しいことではありません。あなたはできる:

  • 帯域幅の制限を超えた場合にデータの転送を遅らせる
  • バッファーの読み取り/書き込み操作の前にタイマーを追加することにより、レイテンシーを追加します。
  • 接続ベースのプロトコル (TCP など) を使用している場合、パケットをドロップするのは意味がありませんが、データグラム ベースのプロトコル (UDP) を使用すると、実装も簡単になります。

接続作成 API は通常の posix/winsock とは少し異なりますが (マクロやその他の魔法を使用しない限り)、他のすべて (send/recv/select/close/etc..) は同じです。

于 2012-07-12T16:11:53.587 に答える
2

Mac OS X Lion 用のネットワーク リンク コンディショナーしか知りません。ダウンロードするには Mac 開発者である必要があるため、ダウンロード リンクをそこに置くことはできません。9to5mac.com からの説明のみ: http://9to5mac.com/2011/08/10/new-in-os-x-lion-network-link-conditioner-utility-lets-you-simulate-internet-and-bandwidth -条件/

于 2012-06-27T11:06:19.223 に答える
2

この回答は、Linux を使用する場合の部分的な解決策になる可能性があります: Linux で遅延およびドロップされたパケットをシミュレートします。これは、あらゆる種類のネットワークの問題をシミュレートできるnetemと呼ばれるカーネル モジュールを指します。

TCP 接続を使用する場合、多くのエラー処理 (失われたパッケージの回復など) がカーネルで行われるため、「パケット損失」が問題になる可能性があります。これをクロスプラットフォームでシミュレートするのは難しいかもしれません。

于 2012-06-27T15:30:31.833 に答える
1

WANem http://wanem.sourceforge.net/を確認してください。WANEM はオープン ソースであり、GNU General Public License の下でライセンスされています。

WANem を使用すると、アプリケーション開発チームは、ネットワーク遅延、パケット損失、パケット破損、切断、パケットの並べ替え、ジッターなどの WAN 特性をシミュレートするために使用できる透過的なアプリケーション ゲートウェイをセットアップできます。

于 2012-07-13T15:43:18.837 に答える
1

自分で制御できるソフトウェアのみのソリューションが必要な場合は、自分で実装する必要があります。私はそのような既存のパッケージがないことを知っています。

ソケット上のラッパー レイヤーによって遅延が発生する可能性はありますが、配信の損失や順不同を発生させるには十分ではありません。これらのアクティビティをシミュレートするには、2 つの TCP スタック間で転送中のデータを実際に傍受する必要があります。

私がお勧めするアプローチは、トンネリング デバイス (たとえばtunX) を使用することです。クライアントがサーバーへの経路が経由であると信じるように、ルートを設定する必要がありますtunX。追加のコード (おそらく別のスレッドで実行されている) はtunX、サーバーへのトラフィックを取得する真の物理インターフェイスを介してパケットを転送する前に、でトラフィックを無差別に傍受し、拡張された動作を実行します。物理インターフェイス上のサーバーから到着するパケットについては、逆のことが起こります。これらのパケットはクライアント コードによって傍受され、動作が拡張されてから転送されtunXます。

ただし、クライアント ソフトウェアをテストしているため、ソフトウェア自体が WAN シミュレート クライアントでない限り、リリースされたソフトウェアにこのコードを埋め込む理由がわかりません。

于 2012-07-16T18:58:42.220 に答える
1

通常、ポートごとに帯域幅または遅延を調整するネットワークデバイスをネットワークに追加します。その後、テストしたい特定のタイプのくだらないネットワークに割り当てられたポートに接続するだけで、目的を達成できます。コードの変更や修正は必要ありません。

これを行う最も簡単な方法は、プロキシとして機能する Linux サーバーに iptables ルールを追加することです。

別のデバイスなしで動作させたい場合は、クライアント PC でネットワークを調整するソフトウェア パッケージであるトリクルを試してください。(またはWindows の場合)

于 2012-06-27T14:53:52.847 に答える
1

Network Simulatorのようなツールを使用できると思います。Windows の場合は無料です。

唯一すべきことは、適切なポートを使用するようにプログラムをセットアップすることです (もちろん、ネットワークの設定も行います)。

于 2012-07-18T09:00:39.787 に答える