0

マシン A とマシン B が互いに通信しているが、ホストのバイト オーダーが異なる場合、送信側のネットワーク プログラミングで、tcp/udp データ フィールドをネットワーク バイト オーダーに変換する必要があるのはなぜですか? ありがとう!

4

3 に答える 3

2

既存の仕様に従っている場合を除き、常にネットワーク バイト オーダー(別名「ビッグ エンディアン」) を使用するのが最も安全です。

  • バイトオーダーを指定する必要があります。バイナリデータを送信して、受信者がそれを理解できることを期待することはできません。
  • ビッグ エンディアン データはインターネットの標準であるため、ホストバイト オーダーとの間で変換するツールは多数あります。ホストとリトルエンディアンの間で変換するには、独自のツールを作成する必要があります。

反対する従来の議論は、「全世界が VAX である」(または今日では x86) であり、これはリトル エンディアンであるため、ネットワーク バイト オーダーはデータにパフォーマンスの負担を課します。おそらく、20 年か 30 年前にはそれは有効な議論でしたが、今日ではそうではありません。プロセッサがデータを変換するのにかかる時間は、そのデータをネットワーク上で移動するのにかかる時間のごくわずかです。

于 2013-03-22T17:48:12.673 に答える
0

多くの場合、それは確かに推奨されます。その理由を説明するために、例を見てみましょう。

  1. 32 ビットの unsigned int を取り、それをパケットに入れて別のホストに送信するプログラムがあります。
  2. 他のホストはパケットからデータを取り出し、32 ビットの符号なし int として格納します。
  3. 送信ホストはビッグエンディアン、受信ホストはリトルエンディアンです。

上記の例で送信側ホストが番号 1024 を送信すると、その番号は送信側ホストのマシンに 0x00000400 として保存されます。受信ホストがこれらのバイトを受信するときにバイト順序を変更せず、メモリに 0x00000400 を格納する場合、これは 1024 とはまったく異なる数値として解釈されます。10 進数 1024 のリトルエンディアン表現は 0x00040000 になります。リトルエンディアン マシンでは、0x00000400 は 10 進数の 262,144 です。

ネットワークバイトオーダーに変換すると、プログラムはデータの標準エンコーディングに依存して、上記の例のような混乱を避けることができます。ネットワーク バイト オーダーから受信側が使用する任意のバイト オーダーに変換する受信側の関数は、簡単に利用でき、簡単に使用できます。

于 2013-03-22T20:41:44.520 に答える
-3

TCPには、受信したパケットを並べ替えるためのメカニズムが組み込まれています。UDPはそうではありません。「異なるホストバイトオーダー」とはどういう意味かわかりませんが、パケットがバイトレベルのエラーで受信された場合、そのようなパケットを再送信するのはレイヤー2の役割です。

于 2013-03-22T09:49:38.640 に答える