ビットストリーム(またはビットストリーム)は、バイナリシーケンスとも呼ばれ、ビットのシーケンスです。
バイトストリームとは、バイト列のことです。通常、各バイトは8ビットの値であるため、オクテットストリームという用語が同義語として使われることもあります。オクテットは、8ビットのシーケンスとして複数の異なる方法でエンコードされる可能性があるため(ビット番号付けを参照)、バイトストリームとビットストリームの間には一意かつ直接的な対応関係はありません。
ビットストリームとバイトストリームは、電気通信やコンピューティングにおいて広く利用されている。例えば、同期ビットストリームはSONETによって伝送され、非同期バイトストリームは伝送制御プロトコルによって伝送される。
実際には、ビットストリームはバイトストリームを直接エンコードするために使用されるわけではありません。通信チャネルは、ビットに直接変換されない信号方式(例えば、複数の周波数の信号を送信するなど)を使用する場合があり、通常はデータとともにフレーミングや誤り訂正などの他の情報もエンコードします。
ビットストリームという用語は、フィールドプログラマブルゲートアレイ(FPGA)にロードされる構成データを表す際によく用いられます。ほとんどのFPGAはバイト並列ロード方式もサポートしていますが、この用語の使用は、シリアルPROMやフラッシュメモリチップなどからシリアルビットストリームを用いてFPGAを構成するという一般的な方法に由来していると考えられます。特定のFPGAにおけるビットストリームの詳細なフォーマットは、通常、FPGAベンダー独自のものです。
数学では、いくつかの特定の無限ビット列がその数学的性質について研究されてきました。これらには、バウム・スウィート数列、エーレンフォイヒト・ミシエルスキー数列、フィボナッチ数列、コラコフスキー数列、正則紙折り数列、ルーディン・シャピロ数列、およびチュー・モース数列が含まれます。
Unix系やWindowsを含むほとんどのオペレーティングシステムでは、標準I/Oライブラリが、低レベルのページングまたはバッファリングされたファイルアクセスをバイトストリームパラダイムに変換します。特に、Unix系オペレーティングシステムでは、各プロセスに3つの標準ストリームがあり、これらは単方向バイトストリームの例です。Unixのパイプ機構は、異なるプロセス間でのバイトストリーム通信を提供します。
圧縮アルゴリズムは、バイト(メモリの最小アドレス指定単位)が提供する8ビットが無駄になる可能性があるため、ビットストリームでコーディングされることが多い。通常は低レベル言語で実装されるが、 Python [ 1 ]や Java [ 2 ]などの一部の高レベル言語は、ビットストリームI/Oのネイティブインターフェースを提供している。
クライアントにバイトストリームサービスを提供する通信プロトコルのよく知られた例の1つは、双方向のバイトストリームを提供するインターネットプロトコルスイートの伝送制御プロトコル(TCP)です。
任意のバイトストリームのインターネットメディアタイプは application/octet-stream です。その他のメディアタイプは、よく知られたフォーマットのバイトストリーム用に定義されています。
多くの場合、バイトストリームの内容は動的に生成されます。例えば、キーボードやその他の周辺機器からのデータ(/dev/tty)、擬似乱数発生器からのデータ(/dev/urandom)などです。
このような場合、バイトストリームの宛先(コンシューマー)が、バイトの生成速度よりも速くバイトを使用する場合、システムはプロセス同期を使用して、宛先が次のバイトが利用可能になるまで待機するようにします。
バイトが宛先で使用できる速度よりも速く生成され、かつプロデューサーがソフトウェアアルゴリズムである場合、システムはプロセス同期技術と同じ方法でそれを一時停止します。プロデューサーがフロー制御をサポートしている場合、システムはコンシューマーが次のバイトの準備ができたときにのみ準備完了信号を送信します。プロデューサーを一時停止できない場合(キーボードやフロー制御をサポートしないハードウェアなど)、システムは通常、コンシューマーが準備できるまでデータを一時的に保存しようとします。これは通常キューを使用します。多くの場合、受信側はバッファが完全にいっぱいになる前にバッファを空にすることができます。バッファがいっぱいになった後も、消費できる速度よりも速くデータを生成し続けるプロデューサーは、望ましくないバッファオーバーフロー、パケット損失、ネットワーク輻輳、およびサービス拒否を引き起こします。