2017-12-26 37 views
0

私は人がバイナリデータをどのように表しているのか、それがネットワークを通ってどのように送られるのかちょっと混乱します。私はWikipediaの例を通して説明します。 < - https://imgur.com/a/POELH - >私はバイナリデータをベース64としてエンコードしており、TWFUというテキストを送信しています。だから私はTをW、その後F、そして最後にUを送っています。しかし、T、charを送る。私はいつも言われたように、それを送るのに1バイト必要です。ネットワークを介して送信される1文字は1バイトです。エンコードされたデータはどのようにネットワーク経由で送信されますか?

私は24バイトをエンコードすると4文字以上を送信しますが、4文字を送信するには文字と同じバイト数が必要だと思っています。

上記の例では、ネットワーク上で"Man" (unencoded) (Requiring 3 bytes normally)"TWFu" (encoded) (requiring 4 bytes normally)を送信する場合、ネットワークを介して送信される同じビットシーケンスが同じですか。データを送信するためにソケットを使用した最後の時間で、文字列入力を要求し、テキスト+エンコーディング入力を要求しません。

答えて

1

ベース64は、純粋に7ビットチャネルの任意の8ビットデータをエンコードする方法です。インターネットが8ビットバイトの原則に基づいているのと同じくらい、テキストモードの場合は、特に指定がない限り、7ビットASCIIであると推定されます。

そのデータをBase64でエンコードして送信する場合は、文字通りTWFUを送信します。テキストベースのプロトコルの多くは、利便性からBase64を使用しています。これは確立された標準であり、ほとんどのアプリケーションで十分に効率的です。

インターネットの基礎は、IP、8ビットバイトに基づくプロトコルです。バイナリデータを送信する際には、8ビットをすべて利用することができますが、テキストモードプロトコルで作業している場合は、プロトコルには7ビットASCIIを使用しなければ使用している文字セットまたはエンコーディングを指定します。

「バイナリ」転送に切り替えるオプションがある場合は、Base64の必要性を補うことができます。 7ビットASCIIプロトコルで作業しているなら、おそらくBase64が必要になるでしょう。

これは、任意の2進文字をエンコードする唯一の方法ではありません。電子メールではquoted printable、URLはURI encodingです。これらはエスケープが例外的である場合にはより効率的ですが、各文字に必要な場合は非常に効率的です。

+0

それで、私はネットワーク "TWFu"を送信すると言っていますが、これには4バイトが必要です。一度それはネットワーク上では、人はそれをデコード?私は、より多くの文字を必要とするものをエンコードすることのポイントを見逃すだけです。この例では、ネットワーク経由で「Man」を送信でき、3バイト必要です。しかし、それは4バイトを必要とする "TWFu"にエンコードします。私はこの点を見ません。ネットワークを介して送信されると、その人はそれをデコードしていて、多くのバイトは無視されますか? 'https:// en.wikipedia.org/wiki/Base64'最初の例をここから読んでください。 –

+0

通常、7ビットASCIIはエンコードしませんが、レガシーシステムと互換性のあるバイナリコンテンツには使用します。一例として、電子メールは添付ファイルとしてBase64を使用して、電子メール自体が単純なプレーンテキストであり、容易に処理されるようにします。デコードは受信者の責任であり、通常は問題のプロトコルまたは標準によって規定されます。バイトは「無視」されませんが、この印象をどこで得ているのか分かりません。 – tadman

+0

ここで重要なことは、テキストモードプロトコルには多くのものがあり、一般的にはASCII規格に従って7ビットエンコーディングが必要であるということです。最近のテキストベースのエンコーディング(例:JSON)ではUTF-8を使用していますが、これは8ビットですが、UTF-8ではマルチバイト文字の意味が最も高いため、任意のバイナリデータを含むことはできません。 Base64は6ビットのエンコーディングであり、ASCII規格のプレーンテキスト文字の大半*を利用するのは非常にうまく機能します。 0〜31は、改行などの特別な意味を持つ「制御文字」として予約されています。 – tadman

0

7ビットテキストのみを扱っている場合は、ベース64エンコーディングは必要ありません。しかし

、あなたは改行でリテラルとして送信することができませんでした、純粋に7ビットのチャネルを介して

Man 
Boy 

を送信する必要があると思います。代わりに、改行をエンコードしているが、互換性のない文字を使用しないベース64

TWFuDQpCb3kNCg== 

でエンコード送ると思います。もちろん、受信者は、あなたがエンコードされたテキストを送信していることを知る必要があります - 使用されたプロトコルに暗示されているか、何らかの方法で明示的にマークされています。

+0

あなたと他のポスターがこの7ビットを7ビットチャンネルから取得しているのは混乱しますか?あなたが何を意味するのかわからない –

+0

多くのアプリケーションプロトコルは7ビットしか使用できず、完全な8ビットデータを送受信することができません。 SMTPまたはIMAP。タイプライターでバイナリJPEG画像を送ると想像してください。 – Zac67

2

概要:「どのように」合意。 「生」は一般的です。


データは送信者と受信者のどちらの方法でも送信されます。標準契約である多くのプロトコルがあります。プロトコルは多くのレベルで動作します。 2つのレベルをカバーする非常に共通のペアはTCP/IPです。多くの上位プロトコルがそれらの上に重ねられています。HTTPとSMTPは非常に一般的な高水準のプロトコルであり、しばしばSSLを挟んでいます。

時には、それらを実装するレイヤーまたはソフトウェアをスタックと呼びます。 参照(または概念的OSI Modelもあります。これについての重要なポイントは、異なるレイヤーについて話す言語を提供することです。定義するレイヤーは、特定のスタックにマップされる場合とマップされない場合があります。

あなたの質問はあまりにも曖昧すぎて直接的には答えられません。 HTTPでは、「生の」バイナリデータが常に転送されます。 HTTPヘッダは、ボディの長さをオクテットで与えることができ、ボディはヘッダに従います。送信者と受信者の間の合意の一部として、ヘッダーはMIMEヘッダーを使用してバイナリデータに関するメタデータを提供することがあります。例えば:あなたのグラバター enter image description hereを含むヘッダで送信されます。

受信機は、送信者が、それは871バイトのPNGのグラフィックがあると主張していることを知っているために十分だ
content-length:871 
content-type:image/png 

。受信者はヘッダーを読み取って本文の871バイトを読み取り、次に続くものが別のHTTPヘッダーであると仮定します。

一部のプロトコルでは、事前宣言されたサイズのボディ以外の同期メソッドが使用されます。それらは完全にテキストベースであり、特定の文字のみを許可する構文を使用します。バイナリデータをテキストとして表現するために、Base64のようなものを使用するネスティング合意によってそれらを拡張することができます。

一部のレイヤでは、Base64などの上位レイヤによる拡張が大きな問題ではないほど十分な密度のデータ圧縮が行われる場合があります。たとえば、HTTP Compressionを参照してください。

HTTPの動作を確認するには、F12キーを押して[ネットワーク]タブに移動します。お使いのコンピュータで他のプロトコルを有効にしたい場合は、WireSharkMicrosoft Message AnalyzerFiddlerなどとお試しください。

関連する問題