ネットワークバイトオーダーについて。

[戻る]
める 2005/06/02(木) 17:29:47
今までソケットのプログラムを作ってましたが取り敢えず動いているので、
気にもしなかったのですが、勉強不足でかなり理解してない事に気がつきました(>_<)
恥ずかしいのですが、教えてください。

@とあるサイトで「TCP/IPではビッグエンディアンで送ることが定められている」と
ありましたが、これはコレを守らない事でエラーになったり送られなかったりする訳
ではないんですよね?生活の中で言えば「赤信号で渡っちゃいけない」って感じでし
ょうか?(罰則云々は抜きにして「渡れちゃいますよね?」)

AIntel系であればリトルエンディアンだけど、@の認識が正しい場合、
Windows⇔Windowsであれば、別にバイトオーダーを気にする必要はない?
UNIX系は元々ビッグエンディアンだから、UNIX同士だとバイトオーダーを
気にせず通信できる?異種プラットホームの場合のみ気にすればでいいの?

宜しくお願いします。

tetrapod 2005/06/02(木) 18:06:25
>異種プラットホームの場合のみ気にすればでいいの?
そういうことです。
通信相手が BE 系か LE 系かを事前に知ることはできないし、知る必要も無いワケで、
「常に BE フォーマットでデータを送信する」
と決めちゃった以上は Windows だろうが UNIX だろうが、約束どおり作れば
何も悩む必要は無いということです。

fwrite(&i, sizeof i, 1, f);
なんてのはソースコード互換だけどデータ互換ではないワケで、話はまったく同じ。

各無し 2005/06/02(木) 18:09:36
1) 同じレイヤーではエンディアンが同じでないと通信できないと思うぞ。

2) Intel系のUNIX系についてはエンディアンはどっちだと思っている?

Ban 2005/06/02(木) 18:12:46
# 丸数字は機種依存文字なので、掲示板では使わないようにしてください。

(1)

>「TCP/IPではビッグエンディアンで送ることが定められている」

「ネットワークバイトオーダ」のことでしょうか。
  ネットワークバイトオーダとは、ビックエンディアンのことをさします。

TCP で相手に到達できるか否かということで言えば、
ソケットなどに渡すパケット内のデータは送信時に参照されないので、
データがリトルエンディアンであろうと到達できます。
# TCP ヘッダ内のバイトオーダが一致しなければ、当然正しく相手に到達できません。

TCP のレイヤで到達できることと、アプリケーションのレイヤで
相手側がそれを正しく解釈してくれることは別物なので、
最終的に有効な通信ができるか否かは更に上位のプロトコルや、
相手のアプリケーションに依ります。
リトルエンディアンのデータを要求する/許容する相手ならとりあえず動くでしょう。

(2)

プラットフォームがなんであろうが、常に気にはした方がいいと思いますが。

広く一般的なプロトコルなどに準拠せず、送受信を独自に作成するのであれば、
送信と受信のバイトオーダが一致していればそれなりに動作すると思います。

める 2005/06/02(木) 18:52:14
皆さん有難うございます。

>Windows だろうが UNIX だろうが、約束どおり作れば何も悩む
>必要は無いということです
tetrapodさんのこのレスが一番しっくりきました。

>名無しさん

2)Intel系のUNIX系とは・・・IntelマシンでLinuxを動かすって意味合いでいいですか?
バイトオーダーってCPUに依存してると思うので、OSは何であろうとIntel系は
リトルと思ってるのですが・・・違うんでしょうか?

>Banさん
>プラットフォームがなんであろうが、常に気にはした方がいいと思いますが。
これは私もそうだと思います。ちょっと気になったものですから。

ありがとうございましたm(__)m
一応解決なのですが、名無しさんの2)がとても気になります・・・
チェックはちょっと待って下さい。
ついでと言ってはなんですか、このあたりの話が分かり易く解説してある
サイトってご存知ですか?さっきから探してはいるのですが、イマイチ
見つからないんですよね・・・。教えて君でスミマセンが宜しくお願いします。

Ban 2005/06/02(木) 19:25:21
> バイトオーダーってCPUに依存してると思うので、OSは何であろうとIntel系は
> リトルと思ってるのですが・・・違うんでしょうか?

CPU には依存するでしょうが、例えば MIPS などは CPU のステータスレジスタで
バイトオーダが切り替えができたりするアーキテクチャです。
特権レジスタなのでこの設定は普通 OS (またはそのローダ)が行います。

mips 用の linux では le と be の2種類の設定がありますし、一般論で言えば、
常に「CPU が決まったら OS に依存せずバイトオーダが決まる」とは限らないのでは。

tetrapod 2005/06/02(木) 20:11:46
雑談
USB の仕様書が定めているプロトコル内部におけるデータ転送は
LE フォーマットなんですよね... 統一されてないなぁ。
USB の解説書なんかでも記述がぽろっと漏れてたりするし。
やはり規格書を直に読むのはとても大事でし。

各無し 2005/06/03(金) 10:42:36
内容が勘違いしまくりっぽいから突っ込んだだけなので気にしないで。

「UNIX系は元々ビッグエンディアンだから」
と
「バイトオーダーってCPUに依存してると思うので」
は矛盾してるなぁ・・・

Ban 2005/06/03(金) 11:35:56
(雑談)
統一感という意味では、個人的にSWFが....。
なんで同一バージョンのバイナリデータに、リトルとビックが混在する
仕様になったのか、理解に苦しみました。
# 下位互換に苦心した結果なのかもしれませんが、歴史的背景までは知りません。

める 2005/06/03(金) 11:46:44
[[解決]]
>「UNIX系は元々ビッグエンディアンだから」と
>「バイトオーダーってCPUに依存してると思うので」
>は矛盾してるなぁ・・・
確かに(^^;どうしてもUNIX系=SPARCってイメージが強い
もので・・・。矛盾もいいところでしたね。

有難うございました。解決とさせていただきます。m(__)m

古いスレッドには追加発言できません。