2

Silverlight の上にオーディオ ビデオ コラボレーション アプリケーションを実装し、それを調整しようとしています。私たちが経験している問題の 1 つは、パケットがドロップされるたびにストリーム レイテンシが増加することです。パケット損失が検出され、要求され、失われたパケットが再送信されるまで待機する必要があります。もちろん、これはオーディオ ストリームの一貫性に大きく影響します。(できれば UDP に切り替えたいと思いますが、Silverlight はそのブラウザー内でサポートしていません。また、Nagle アルゴリズムも無効にしているため、一般的に、送信する byte[] 配列を送信するとすぐに、それは送信され、単一のパケットで送信されます. TCP パケット サイズ != 送信されるデータの量であることは承知していますが、Nagle アルゴリズムを無効にすると、それに近い値になります. また、適応型ジッタ バッファあるので、失われたパケットに対処しますが、TCP/IP 経由でパケットが失われると、バッファする必要があるオーディオの量が大幅に増加し、したがって遅延が増加します)。

そのため、パケットの送信方法を最適化して、ドロップされたパケットの影響を軽減する方法があるかどうかを確認しようとしています. 現在、実装を検討しているいくつかの競合するソリューションがあります。

(1) パケットを大きくしようとすることができます。現在、同じ TCP ストリームを介して、大きい (~1024 バイトのビデオ) パケットと小さい (~70 バイトのオーディオ) パケットを組み合わせて送信しています。しかし、オーディオ データとビデオ データを一緒に多重化することもできます。つまり、余裕があるときはいつでもビデオ データの一部をオーディオ パケットに添付することができます。これにより、個々のパケットがいくらか大きくなりますが、パケットの総数は削減されます。

(2) オーディオとビデオを 2 つの別個の TCP ストリームに分割できます。これは、パケットが失われたためにビデオ ストリームが停止した場合でも、オーディオ ストリームは停止しないことを意味し、その逆も同様です。もちろん、オーバーヘッドがわずかに増加し、送信されるパケットの総数が減少することはありません。

(3) 音声を複数の個別の TCP ストリームに逆多重化し、それらを相手側で再構成することができます。これにより、事実上、単一の UDP スタイルのパケット配信を「偽造」することができます。8 つのオーディオ ストリームがあり、そのうちの 1 つがパケット損失のために停止した場合、他のストリームは時間どおりにデータを配信でき、オーディオ パケットの 1/8 を処理するだけで済みます。停止したストリームが追いつくまで利用できません。もちろん、これは理想的ではありませんが、ストリーム全体が停止して、失われたパケットが再送信されるまでパケットを再生できないよりも、より良いエクスペリエンスが得られる可能性があります。

これらの可能性について何か考えはありますか?他の提案はありますか?それとも、3 つすべてをコーディングしてからテストする必要があるのでしょうか。

4

4 に答える 4

1

Nagle アルゴリズムを再度有効にすると、(i) 自分で決定するのではなく、パス MTU に従って最大サイズのバッファーを TCP に送信させる。(ii) (1) オーディオとビデオのパケットをピギーバックするというあなたの提案を実現します。(iii) パケットの総数を減らす。Nagle アルゴリズムを使用する場合と使用しない場合の飽和状態の TCP 接続の定常状態のパフォーマンスは同じであるため、最初のウィンドウ フィル中以外は何も失われません。

また、可能な限り最大のソケット送信バッファーを実行する必要があります。少なくとも 128k、または可能であればその 2 倍または 4 倍。また、できるだけ大きなソケット受信バッファーを使用する必要がありますが、ソケットを接続する前に 64k を超えるソケット受信バッファーを設定する必要があるため、TCP ハンドシェイク中にウィンドウのスケーリングについて相手側に通知できます。

于 2010-11-21T03:15:15.240 に答える
0

このアプリケーションはインターネット経由で使用されますか? インターネットの品質が原因で、パケットが失われる理由はありますか? その場合、可能な限り耐障害性を備えたアプリケーションを開発するだけでなく、インターネット回線が許容できる品質であることを確認することもできます。今日の良好なインターネット回線では、パケット損失が 0.1% を超えてはなりません。パケット損失ツールを使用して、インターネット回線と ISP をテストできます。無料で使えますので、お気軽にご利用ください。

于 2010-11-20T22:24:47.163 に答える
0

ストールの原因がパケット損失であるとどのように判断しましたか?

ストリームを分離してもあまり役に立たないと思います。オーディオとビデオの同期を維持しようとすると、さらに問題が発生するだけです。

いずれにせよ、使用する微調整に関係なく、パケットを再送信する必要がある TCP/IP によって制限されます。私が調べる最大のことは、サーバーとクライアントの TCP スタックでより高度なオプションが有効になっているかどうかです。特に、選択的確認応答と高速再送信について言及しています (最近の OS にはデフォルトでこれらがあるはずです)。高速再送信では、欠落が検出されたときにクライアントが非常に迅速に欠落パケ​​ットを要求し、選択的確認応答により、サーバーはストリームの欠落部分のみを再送信します。

ただし、最終的には、1 つのパケットの損失を許容できない場合、十分な大きさのジッター バッファーを使用していないように思えます。また、アプリケーションが tcp スタックにデータを送信するタイミングが一貫していない可能性もあります。私はいくつかのパケット キャプチャを取得し、ネットワークで何が起こっているかを把握して、そこから何ができるかを確認します。

于 2010-11-21T03:42:21.463 に答える
0

I second @Kevin Nisbet on the buffer (unfortunately). If you're using TCP instead of UDP, the buffer needs to be as large as it takes for the server get notified about the missing bytes and for them to reach the client.

Since TCP delivers data to the application as an ordered stream, when a packet gets lost, the stack cannot deliver any additional byte to the app until the ack reporting the missing bytes is sent to the server, processed and the bytes arrive on the client. Meanwhile, the only thing keeping your app running is the buffer. Do you know how long does it take for the round-trip, including processing?

Without Selective Ack, anything received after that lost byte is useless and needs to be retransmitted. The client will ack the last byte received and the server needs to re-retransmit everything from that point on.

With Selective Ack at least the server only needs to send the missing chunk, but the stack needs to wait for the chunk to arrive nonetheless. It can't give the data it has received so far to the app and then fill in the missing parts. That's what UDP does :) Maybe you should write to MS...

Coming from the network side, I cringe (a bit) about sending multiple copies of the same content. Is bandwidth plentiful in your application? Maybe some sort of redundancy (FEC or similar) is better than duplicating your content. Besides, if packet loss could be happening I don't think it would be wise to shove more traffic on the network. Is your computer running half-duplex? :-D

于 2010-12-30T21:14:05.757 に答える