私はちょうどネットワークプログラミングの試験から帰ってきましたが、彼らが私たちに尋ねた質問の1つは「ビデオをストリーミングする場合、TCPまたはUDPを使用しますか?保存されたビデオとライブビデオストリームの両方について "。この質問に対して、彼らは単に保存されたビデオにはTCPの短い回答を、ライブビデオにはUDPを期待していましたが、帰宅途中でこれを考えましたが、ライブビデオのストリーミングにはUDPを使用する方が良いでしょうか?つまり、帯域幅があり、サッカーの試合やコンサートをストリーミングしていると言えば、本当にUDPを使用する必要があるのでしょうか?
このコンサートなどTCPを使用してストリーミングしている間、パケットを失い始め(あなたと送信者の間のネットワークで何か悪いことが起こりました)、1分間パケットを受け取らないとしましょう。ビデオストリームが一時停止し、1分が経過すると、パケットが再び通過し始めます(IPが新しいルートを見つけました)。すると、TCPが失われた分を再送信し、ライブストリームの送信を続けます。前提として、帯域幅はストリームのビットレートよりも高く、pingは高すぎないため、短時間で失われた1分間がストリームのバッファーとして機能します、再びパケット損失が発生しても、気付かないでしょう。
今、私はこれが良いアイデアではないいくつかのアプライアンスを考えることができます。例えば、ビデオ会議のように、あなたはneedが常にストリームの最後にあるようにします。 -チャットは恐ろしいだけですが、サッカーの試合中、またはコンサート中に、あなたがストリームから1分遅れている場合、それは重要ですか?さらに、すべてのデータを取得することが保証されており、エラーなしで入ってくるときに後で表示するために保存した方が良いでしょう。
だからこれは私の質問に私をもたらします。ライブストリーミングにTCPを使用することについて知らない欠点はありますか?それとも、帯域幅がある場合、TCPを使用する必要があるのは、それがネットワークに対して「より良い」(フロー制御)のであれば、どうでしょうか?
ライブビデオにTCPを使用することの欠点:
参考までに、ネットワークの説明には「パッケージ」という言葉を使用しないでください。ネットワークは「パケット」を送信します。
しかし、サッカーの試合中、またはコンサート中に、ストリームから1分遅れている場合は何が問題になりますか?
一部のサッカーファンにとっては、かなりの量です。ワールドカップの試合などの注目度の高いイベント中に、みんなからの歓声とうめき声を聞くことができる場合、エンコーディング(または何でも)によるデジタルビデオストリームに存在する数秒の遅延さえ非常に迷惑になる可能性があることが指摘されていますあなたがそれらを引き起こしたゲームの動きを見る前に、隣の人(誰もが不当なアナログプログラムを見ている)。
スポーツを大事に考えている人(そして少なくともここドイツではデジタルテレビの有料顧客の最大のグループ)にとって、ライブビデオストリームで1分間遅れることはまったく受け入れられないと思います(彼らのように) dこれが発生しない競合他社に切り替えます)。
通常、ビデオストリームはある程度フォールトトレラントです。そのため、一部のパッケージが失われた場合(たとえば、途中でルーターが過負荷になった場合)、コンテンツを表示することはできますが、品質は低下します。
ライブストリームがTCP/IPを使用していた場合、ドロップされたパッケージを待つのはforcedですbefore続行できます新しいデータを処理します。
それは二重に悪いです:
可能な限り最新の情報を表示することが目標である場合(そして、ライブストリームの場合、フレームが少し悪くても、通常は最新にしたい場合)、TCPはあなたに対して働きます。
記録されたストリームの場合、状況はわずかに異なります。おそらく、より多くのバッファリング(おそらく数分!)が行われ、パッケージの損失による何らかのアーティファクトがあるよりも、データの再送信が必要になります。この場合、TCPは適切な一致です(もちろん、これはUDPで実装できますが、TCPにはライブストリームの場合ほどの欠点はありません)。
UDPトランスポートに適したユースケースとTCPトランスポートに適したユースケースがあります。
ユースケースでは、ビデオのエンコード設定も指定します。サッカーの試合を放送するときは、品質に焦点を合わせ、ビデオ会議では、待ち時間に焦点を合わせます。
マルチキャストを使用して顧客にビデオを配信する場合、UDPが使用されます。
マルチキャストの要件は、ブロードキャストサーバーと顧客の間の高価なネットワークハードウェアです。実際には、これは、会社がネットワークインフラストラクチャを所有している場合、ライブビデオストリーミングにUDPとマルチキャストを使用できることを意味します。その場合でも、ビデオパケットにマークを付けて優先順位を付けてパケット損失が発生しないように、サービス品質も実装されます。
ネットワークハードウェアが顧客へのパケット配信を処理するため、マルチキャストはブロードキャストソフトウェアを簡素化します。顧客はマルチキャストチャネルに加入し、ネットワークはパケットを新しい加入者にルーティングするように再構成します。デフォルトでは、すべての顧客がすべてのチャネルを利用でき、最適にルーティングできます。
このワークフローでは、承認プロセスが困難になります。ネットワークハードウェアは、購読しているユーザーを他のユーザーと区別しません。承認のソリューションは、ビデオコンテンツを暗号化し、サブスクリプションが有効なときにプレーヤーソフトウェアで復号化を有効にすることです。
ユニキャスト(TCP)ワークフローにより、サーバーはクライアントの資格情報を確認し、有効なサブスクリプションのみを許可できます。特定の数の同時接続のみを許可します。
マルチキャストはインターネット経由では有効になりません。
インターネット経由でビデオを配信するには、TCPを使用する必要があります。 UDPを使用すると、開発者はパケットの再送信を再実装することになります。 Bittorrent p2pライブプロトコル。
「TCPを使用する場合、OSはすべてのクライアントの未確認セグメントをバッファリングする必要があります。これは、特にライブイベントの場合は望ましくありません」。
このバッファは何らかの形で存在する必要があります。プレーヤー側のジッタバッファについても同様です。これは「ソケットバッファー」と呼ばれ、サーバーソフトウェアはこのバッファーがいっぱいになるとそれを認識し、ライブストリームの適切なビデオフレームを破棄できます。サーバーソフトウェアは適切なフレームドロップロジックを実装できるため、ユニキャスト/ TCPメソッドを使用することをお勧めします。 UDPの場合にパケットがランダムに欠落すると、ユーザーエクスペリエンスが低下します。このビデオのように: http://tinypic.com/r/2qn89xz/9
「IPマルチキャストは、大規模な視聴者のビデオ帯域幅要件を大幅に削減します」
これはプライベートネットワークに当てはまり、マルチキャストはインターネット経由では有効になりません。
「TCPがあまりにも多くのパケットを失うと、接続が切断されることに注意してください。したがって、UDPはネットワークトランスポートレイヤーのドロップを気にしないため、このアプリケーションに対してより多くの制御を提供します。」
また、UDPは、フレーム全体またはフレームグループをドロップすることを考慮しないため、ユーザーエクスペリエンスをこれ以上制御できません。
「通常、ビデオストリームはある程度フォールトトレラントです」
エンコードされたビデオはnotフォールトトレラントです。信頼性の低いトランスポートを介して送信される場合、前方誤り訂正がビデオコンテナに追加されます。良い例は、いくつかのオーディオ、ビデオ、EPGなどのストリームを伝送する衛星ビデオ放送で使用されるMPEG-TSコンテナーです。衛星リンクは二重通信ではないため、これは必要です。つまり、受信者は失われたパケットの再送信を要求できません。
二重通信を使用できる場合は、パケット損失のあるクライアントにのみデータを再送信し、すべてのクライアントに送信されるストリームに前方誤り訂正のオーバーヘッドを含めることをお勧めします。
いずれにしても、失われたパケットは受け入れられません。帯域幅が妨げられる例外的な場合には、ドロップされたフレームは問題ありません。
一部のデコーダーは、重要な場所でパケットが欠落しているストリームで壊れることがあります。
新しいp2pライブプロトコル Bittorent Live をご覧になることをお勧めします。
ストリーミングに関しては、UDPを使用することをお勧めします。最初にUDPを使用すると、サーバーの負荷が軽減されますが、主にマルチキャストでパケットを送信できるため、接続されている各クライアントに送信するよりも簡単です。
場合によります。ストリーミングしているコンテンツはどれほど重要ですか?重要な場合はTCPを使用します。これにより、帯域幅、ビデオ品質(遅延を処理するために低品質を使用する必要がある場合があります)、および遅延の問題が発生する場合があります。しかし、コンテンツを確実にそこに到達させる必要がある場合は、それを使用してください。
そうでない場合、UDPはオーバーヘッドが少ない傾向があるため、ストリームがクリティカルではなく優先される場合は問題ないはずです。
インターネットでライブイベントを配信する際の最大の問題の1つは「スケール」であり、TCPはうまくスケールしません。たとえば、オンデマンドの映画再生とは対照的に、ライブのフットボールの試合を放映している場合、視聴する人の数は簡単に1000倍になります。 TCPを使用するこのようなシナリオでは、CDN(コンテンツ配信ネットワーク)の死刑判決です。
TCPがうまくスケールしない主な理由がいくつかあります。
TCPの最大のトレードオフの1つは、送信者と受信者の間で達成可能なスループットのばらつきです。インターネットを介してビデオをストリーミングする場合、ビデオパケットはインターネットを介して複数のルーターを通過する必要があり、これらのルーターはそれぞれ異なる速度の接続で接続されます。 TCPアルゴリズムはTCPウィンドウを小さくして開始し、パケット損失が検出されるまで増加します。パケット損失は輻輳の兆候と見なされ、TCPがそれに応答します輻輳を回避するためにウィンドウサイズを大幅に縮小します。したがって、すぐに実効スループットが低下します。ここで、クライアントへの6-7ルーターホップを使用したTCP伝送を伴うネットワークを想像してください(非常に通常のシナリオ)。中間ルーターのいずれかがパケットを失った場合、そのリンクのTCP伝送速度が低下します。事実上のルーター間のトラフィックフローは、砂時計のような形をしています。常に中間ルーターのいずれかの間で上下にゴングします。有効スループットのレンダリングは、ベストエフォートUDPに比べてはるかに低くなります。
既にご存じかもしれませんが、TCPは確認ベースのプロトコルです。たとえば、送信者が50ms離れているとしましょう(つまり、2ポイントのレイテンシー)。これは、パケットが受信者に送信され、受信者が確認応答を送信するのにかかる時間が100ミリ秒になることを意味します。したがって、UDPベースの送信と比較して可能な最大スループットはすでに半分になっています。
TCPは、マルチキャストまたはマルチキャストAMTの新しい新興標準をサポートしていません。つまり、多くのクライアントが同じコンテンツを視聴している場合、パケットを複製してCDNがネットワークトラフィックを削減する機会はありません。それ自体が、CDN(AkamaiやLevel3など)がライブストリームにTCPを使用しないようにする十分な理由です。
ビデオストリーミングでは、帯域幅がシステムの制約になる可能性があります。マルチキャストを使用すると、使用されるアップストリーム帯域幅の量を大幅に削減できます。 UDPを使用すると、接続されているすべての端末にパケットを簡単にマルチキャストできます。また、Pragmatic General Multicast(PGM)と呼ばれる信頼性の高いマルチキャストプロトコルを使用することもできます。これについては何も知りませんし、その使用方法も普及していないと思います。
帯域幅がビットレートよりはるかに高い場合、ユニキャストライブビデオストリーミングにTCPをお勧めします。
ケース1:連続したパケットが数秒間失われます。 =>ライブビデオは、トランスポート層(TCPまたはUDP)が何であれ、クライアント側で停止します。ネットワークが回復すると:-TCPが使用されている場合、クライアントビデオプレーヤーは、最初のパケット損失(タイムシフト)ORでストリームを再開して、すべての遅延パケットをドロップし、タイムシフトなしのビデオストリーム。 -UDPが使用されている場合、クライアント側で選択の余地はありません。ビデオはタイムシフトなしでライブで再起動します。 => TCP同等以上。
ケース2:一部のパケットはランダムであり、多くの場合ネットワーク上で失われます。 -TCPが使用されている場合、これらのパケットはすぐに再送信され、適切なジッタバッファを使用して、ビデオストリームの品質/レイテンシに影響はありません。 -UDPを使用すると、ビデオの品質が低下します。 => TCPはるかに良い
「UDPを使用」という回答はすべて、オープンネットワークを想定しており、「できるだけ多くのものを詰め込む」アプローチです。古いスタイルのクローズドガーデン専用のオーディオ/ビデオネットワークに適しています。
実際の世界では、送信はファイアウォールを通過し(マルチキャストをドロップし、場合によってはudp)、ネットワークは他のより重要な($$$)アプリと共有されるため、wantで虐待者を罰しますウィンドウのスケーリング。
TCP UDPの議論を読んでいると、論理的な欠陥に気付きました。 1分のバッファに変換される1分の遅延を引き起こすTCPパケット損失は、同じ損失が発生している間にUDPが1分間ドロップすることと相関しません。より公平な比較は次のとおりです。
TCPでパケット損失が発生します。数学的に完全なパケットをストリーミングしようとしてTCPがパケットを再送信している間、ビデオは停止します。ビデオは1分間遅延し、欠落パケットが宛先になった後、中断したところから再開します。私たちは皆待ちますが、1つのピクセルを見逃すことはありません。
UDPでパケット損失が発生します。ビデオストリーム中に1秒間、画面の隅が少しぼやけます。誰も気づかず、失われたパケットを探すことなくショーは続きます。
ストリーミングするものはすべて、UDPから最も利益を得ます。 TCPに1分の遅延を引き起こすパケット損失は、UDPに1分の遅延を引き起こしません。ほとんどのシステムは複数の解像度ストリームを使用しているため、パケットが不足するとブロックが発生するため、UDPを使用することはさらに意味があります。
ストリーミング時のUDP FTW。
他のすべての理由に加えて、UDPはマルチキャストを使用できます。何千人ものTCPユーザーをサポートすると、すべて同じデータを送信して帯域幅を浪費します。ただし、TCPを使用する別の重要な理由があります。
TCPは、ファイアウォールやNATをはるかに簡単に通過できます。 NATおよび演算子によっては、UDPホールパンチの問題によりUDPストリームを受信できない場合があります。
これは重要な問題であり、時間の問題というよりもコンテンツの問題です。 TCPプロトコルでは、配信されなかったパケットをチェック、検証、および再配信する必要があります。 UDPはこの要件を使用しません。したがって、動画のようにUDPを使用して数百万のパケットを含むファイルを送信した場合、配信時に一部のパケットが欠落していると、おそらく欠落しません。