プロセスを TCP ではなく UDP 経由で送信するように強制するにはどうすればよいですか?

プロセスを TCP ではなく UDP 経由で送信するように強制するにはどうすればよいですか?

私はLinuxマシン上でffserverプロセスを実行して、ビデオストリーミングを実現しています。ffmpegただし、ビデオストリーミングには遅延があります。ffserver 設定ファイルを定義しますPort 8090

指示netstat -tulnapこれは私にこれを与えます:

root@beagleboard:/etc# netstat -tulnap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             Stat                                                                             e       PID/Program name
tcp        0      0 0.0.0.0:68                  0.0.0.0:*                   LIST                                                                             EN      654/pump
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LIST                                                                             EN      662/portmap
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LIST                                                                             EN      698/dropbear
tcp        0      0 0.0.0.0:8090                0.0.0.0:*                   LIST                                                                             EN      744/ffserver
tcp        0     52 192.168.1.104:22            192.168.1.111:10838         ESTA                                                                             BLISHED 724/dropbear
udp        0      0 0.0.0.0:514                 0.0.0.0:*                                                                                                            703/syslog-ng
udp        0      0 0.0.0.0:111                 0.0.0.0:*                                                                                                            662/portmap
udp        0      0 0.0.0.0:60628               0.0.0.0:*                                                                                                            709/avahi-daemon: r
udp        0      0 0.0.0.0:5353                0.0.0.0:*                                                                                                            709/avahi-daemon: r

ご覧のとおり、ffserver プロセスは送信に tcp プロトコルを使用しており、これがビデオ ストリーミングの遅延の原因であると思われます。プロセスに udp プロトコルを使用させるにはどうすればよいですか? ポートを変更する必要がありますか?

答え1

プログラム自体の一部を書き直さずに、プログラムに TCP ではなく UDP を使用するように強制することはできません。これらのプロトコルはあまりにも異なっているため、互換性がありません。

  • TCP はストリーム指向です (受信側は送信側が出力した順序どおりにすべてを連続ストリームとして認識します)。UDP はデータグラム指向です (各データグラムは個別のパケットで送信され、順序を変更することもできます)。

  • TCP にはフロー制御があるため、送信者 (または送信者の OS) は、リンクをオーバーフローさせたり、他の接続に大きな影響を与えたりすることなく、どのくらいの速度でデータを送信すればよいかを正確に把握できます。UDP では、このようなことはまったく行われません。適切に「強制」されていないプログラムは、リンク速度に関係なく、UDP 経由で 1 秒あたり数ギガバイトのデータを送信し始める可能性があります。

  • TCP には再送信機能があるため、パケットが途中でドロップされた場合 (ネットワークが過負荷になったり、その他の問題が発生したりした場合など)、再送信されます。プロトコルが信頼性の高いトランスポートに依存していて、UDP 経由に強制すると、少なくとも 1 つのパケットが失われるとすぐに接続が完全に切断される可能性があります。(パケット意思迷子になります。上記のポイント 1 と 2 を参照してください。

答え2

他の人が述べているように、UDP と TCP は根本的に異なるプロトコルです。

しかし、もしあなたがしなければならないTCPではなくUDPでデータを転送する場合は、次のようなリレーツールを使用できます。ソカットsocat を設定して TCP 接続をリッスンし、TCP ストリームの内容を UDP ストリームとして別のホストに転送することができます。他のホストが TCP トラフィックを期待している場合は、別のリレー インスタンスを使用して TCP に戻すことができます。これにより、ホスト間リンクから再試行と確認応答の動作が削除されます。再試行と確認応答はローカル リレー ツールとローカル アプリケーションの間では引き続き存在しますが、ローカル ループバック リンクで再試行が行われる可能性は低くなります。

ただし、これで遅延の問題が解決する可能性は低いです。アプリケーションが UDP ではなく TCP を使用するように構築されている場合、パケットのドロップが許容されない可能性があり、その場合、このハックによって動作が不安定になる可能性があります。

答え3

非常に遅い接続を使用しているのでない限り、遅延の問題はビデオ コーデックが原因である可能性が最も高くなります。

ビデオを効率的に圧縮するには、予測エンコードを使用する必要があります(Wikipediaのこの記事)。

予測コーディングは基本的に、前の画像または後の画像から画像を計算します。これには次のような意味があります。

  1. 多くのPフレーム(前のフレームから計算)を使用すると、ビデオが表示される前に遅延が発生します。始まるこれは、クライアントが次の完全なビデオ フレーム (I フレーム) を待機する必要があるためです。ただし、ストリームが確立されると、比較的遅延なくビデオを視聴できます。

  2. B フレーム (前の画像と後の画像から計算) を使用する場合、非常に大きな遅延が発生します。上記の初期遅延に加えて、クライアントは、最後の I フレームから再生を開始するために次の I フレームを待つ必要があります。これにより、遅延が発生します (クライアントは、サーバーが記録/送信するよりも明らかに遅くビデオを再生します。多くの場合、数秒かかります)。ビデオをオンザフライでエンコードする場合、サーバーからの遅延も発生します。サーバーは、前の I フレームから始まるすべてのものを送信するのに次の I フレームを待つ必要があります。

ほとんどのコーデックでは、必要に応じてBフレームとPフレームの使用を調整できますが、遅延と圧縮効率のトレードオフがあります。

十分な帯域幅がある場合は、B/Pフレームのないコーデックを使用することもできます。JPEG形式

遅延のもう 1 つの原因はプレーヤー側でのバッファリングです。これにより、ネットワーク伝送が不安定な場合でも歪みが生じなくなります。多くのビデオ プレーヤーでは、バッファ サイズを微調整できます。

関連情報