2008年3月10日月曜日

帰宅! / i'm home! b

帰国しました。詳細は後日アップ!するかも?

2008年3月3日月曜日

カリフォルニアへ / to California b

ちょっとアメリカのカリフォルニアへ国外逃亡。

2008年3月1日土曜日

3又Ethernetケーブル b

以前、人力検索はてなで、なかなか面白そうな質問があったのでいろいろ回答してみたわけですが、いろいろまとめ。


質問内容は、「LANケーブルの2分岐コネクタに、ストレート・ストレート・クロスの3本の線をつないだらどうなるのか?」というもの。電話線とかでは、1本の線を2分岐させるコネクタをよくみかけるけど、Ethernet(RJ45)用のも若干ある。BMJ-8っていう製品とか。

どう接続されてるかっていうと、ようはこんな感じ



~予想~

half-duplexにすればPC1-PC2、PC1-PC3はそれぞれ通信できる。PC2-PC3は当然通信できない。
straight - cross 部分は通信できるんじゃない?ってこと。
今回の最大の問題点は、PC1,PC2が同時にPC3に送信をを行った時の挙動などだ。

10Base-2といった同軸ケーブル通信の時代は、伝送路が送受信共通だったので、本当に1つの通信しか行えなかった。だからこそCSMA/CDが生まれ、コリジョン検出しつつ、同時に通信してデータが壊れないようにしながら、多重アクセスを行っていた。Ethernetによる通信は、物理層まで降りてみると、単なる電圧の変位をデジタル信号に変換しているにすぎない。だから複数の端末が同時にデータを送ってしまうと、通信タイミングが重なった時点で、伝送路には異常電圧が発生していることになる。各NICはこの異常電圧を検知して、コリジョン発生として扱い、データの再送制御をおこなう。

しかし、現在のUTPは送信受信のラインが別になっていて、伝送路を見ると全二重通信である。送信と受信だけ見ればデータが混信することはありえず通常では異常電圧が発生することはない。ただし、スイッチ側で全二重通信に対応してないものなどもあり、半二重通信自体は可能である。たとえばスイッチのバッファがあふれる場合などで、このときPAUSE Frameといった特殊なフレームが送信され、これを受信したNICはスイッチ側の受け入れ態勢が整ってないと判断し、通信を停止する。スイッチで受信したデータはバッファにキューイングされ、宛先ポートから順次送出される。よって、ツイストペアケーブルを使う限り、通常はコリジョンによる異常電圧が発生することはないはずである。たとえダムハブであっても単に全ポートに通信垂れ流してるだけであって、衝突はない・・・・はずである。しかしハブの内部回路での衝突はひょっとしたら可能性があるのかもしれない。いまどきのそんなつくりにしてるとは思えないが、受信側の送信側を単純につなげば、バッファの出入り口ですべてのポートはつながっている。ここでぶつかったら衝突になっちゃうの?
結局よくわからないのは、UTPを使った場合も、規格として衝突による異常電圧を考慮しているのかだ。

EthernetはIEEE802.3によって規格制定されている。実際これは半分嘘で、通信フレームまわりの規格はEthernet IIという、DIX規格(Dic Intel Xerox)が採用されていて、IEEE802.3の規格ではない。とまあこなんことはどうでもよいのだが、物理層レベルでどのような規格が制定されているか実際よく知らない。IEEE802.3自体はPDFで公開されてるので読めばいいのだが、何百ページもあって読むのがだるかった。。。。
予想としては、異常電圧ってのはコリジョン以外にも起こりうるわけで、コリジョンした結果だろうが、外部ノイズだろうが、フレームが壊れたことに変わりないので、検知したら再送を行うだろうってこと。それが通常のCSMA/CAの手順で行われるのかはわからない。CSMA/CDでは衝突したらバックオフタイム待って・・・・といろいろ通信タイミングをずらすが、その辺の機構が入ってるのかとかがわからない。

あーだこーだ考えるのもめんどくなったので
というわけで実際に試してみた。

分岐する奴がなかったので、実際に直つなぎ。
実際に通信に使われる1,2,3,6番の線だけそれぞれ3本のケーブルを接続。RJ45の口は1つだけクロス結線。
ちなみに1000Baseでは8芯全部使ってるで、こんな結線は許されません:-p

真中の緑の線だけクロスにした。


線を作ったので、フルークで導通チェックをする。
測定中


straight - straight 部分


straight - cross 部分

それでは、これを3台のPCに接続したら、さてどうなるか!?

接続環境はこんな感じ
PC1 - WindowsXP (NIC:Intel) - 192.168.1.1 (straightを接続)
PC2 - Mac OS X 10.5 Leopard (NIC:Apple) - 192.168.1.2 (straightを接続)
PC3 - WindowsXP (NIC:Intel) - 192.168.1.3 (crossを接続)



~実験~
まずは何も考えずに接続。すると、2台目を接続するまではよかったけど、3台目をつないだ瞬間になんか接続が不安定になった。uplink/downlinkをぱたぱたと繰り返すわけです。これはEthernetのオートネゴシエーションがうまくいかずに、パタパタしてると予想。

取り合えず、3台のうち1台(PC3)を手動で100base half-duplexにしてみるが、どうもうまくいかない。
やはり100baseと10baseのオートネゴシエーションでしくじってる模様。

しょうがないので10baseのhalf-duplexに手動固定。すると残りの2台も自動で10base half-duplexに引っ張られた。
PC1の様子

PC2の様子


無事10baseでリンクアップしたので、みんなで一斉にpingを送り合ってみた。
ちなみにこれPC1からPC3にpingを打ってる様子のみ抜粋。実際には
PC1->PC3, PC2->PC3, PC3->PC1, PC3->PC2
の全パターンを一斉に送ってる。まったく問題ありませぬ。


続いてファイル共有
PC1(windows)からPC3(windows)の共有をのぞく。


PC2(Mac)からPC3(windows)の共有をのぞく。ためしにピクチャ3.pngでも削除。さらにファイルコピー。
こちらも問題なく行えた。唯一問題点としては、転送速度が遅いことぐらい。PC1-PC3つまりWindows同士ではそんなに遅さを感じなかったけど、PC2-PC3つまりWindows-Macではかなり遅かった。なんでだろう?


~結果~
各NICの設定を10BASE-T half-duplexに固定すると、PC1-PC2及びPC1-PC3の間で無事通信できた。

pingでは1msと2msが混ざってるけど、これって衝突して再送が発生してるのが混ざってるからなのかな?もしかしたらそうなのかもしれない。ただし、仮に本当に衝突でフレームが壊れたんだとして、CSMA/CDで再送が発生してるのではなくて、たんに受信フレームが壊れてたから再送ってだけで、どの層で再送が発生してるのかがわからない。
てか今頃気付いたけど、Windowsのpingって32byteのデータなげるから、全ヘッダ合わせて74byte(14+20+8+32)のフレームを投げるはず。しかししかし、Ethernetの最小フレーム長は64byte。これは64byte以下のフレームだと、コリジョン検知する間もなく転送完了しちゃうからって理由。今回の送信フレーム長は74byte・・・・計算端折るけど、これって衝突する可能性ってかなーーーり低いんじゃない?しかもpingの送信間隔ってかなり長いし。あー、ファイル共有した時に、同時にファイルを送信してみればよかった。
暇があったら試して追記します。



とまあこんな感じになりましたが、ただし最初に言ったようにIEEEの仕様を読んでいないので、実際どこまで仕様として決まっているのかがわからない。もちろんこんな接続はイレギュラーだろうけど、信号や電圧レベルでどう判断してるのかがよくわからない。実際そういう仕様が明確に決まっていなければ動作は不定だから、NICの実装依存でいろいろ変わっちゃうかもしれない。



おまけ
これは100base half-duplexでつなごうとしたときの様子。10baseが遅いんで100でつながらないかなーってやったけど、ぱたぱたしまくってpingでこのありさま。