Shammer's Philosophy

My private adversaria

全二重と半二重とオートネゴシエーション

仕事が変わると、これまで意識してこなかった部分もしっかり認識しなければならなくなることがある。NICの全二重と半二重とオートネゴシエーションもそれだ。備忘録として内容をメモ。

全二重と半二重

ネットワークケーブルは、いくつかの線が束になって一つのケーブルになっている。通常よく目にするUTPケーブルでは、8本のケーブルが束になっており、そのうちの一部がデータの通信で使用できる(全部じゃないらしい)。そして、そのデータ通信で使用するケーブルを全て使って送信、あるいは受信するモードを半二重というらしい。こっちが全二重と思っていたが、「半」の意図するところは同時にできるのが送受信の半分、つまり、受信か送信かのどちらかしか行わないという意味のようだ。一方、全二重は送信と受信の役割をケーブルごとに分離するので、データ通信の一部で送信をしつつ、データ通信用ケーブルの残りで受信をする、ということができるというもの。常に送受信を同時に行えるので「全」ということのようだ。
半二重の場合は、ケーブルの一方が送信しているときに反対側も送信してしまうとケーブルの中でデータが衝突する可能性がある。衝突しないような仕組みや、衝突した際に再送したりしないといけないので、この分のオーバーワークが発生する。全二重の場合はケーブルの中でデータが衝突することはないのでこのオーバーワークはない。当然だが、片方が全二重で片方が半二重の場合は動作がおかしくなりそうだ。どうおかしくなるかはよくわからない。というか未知なんだろう。そもそも仕組みの段階で矛盾があるので。

オートネゴシエーション

通信相手が全二重か半二重か、通信速度はどの程度か、こうした情報を自動で検知できるのがオートネゴシエーション。これを実現するために、ケーブルは常時信号のやりとりをしている。この信号はFLP(Fast Link Pulse)バーストと呼ばれ、お互いがこの信号に自分の動作モードに関する情報を含めることで通信規格を決定する、というもの。
ここまでは自分の認識も合っていた。しかし、片方だけがオートネゴシエーション有効で、一方がオートネゴシエーション無効の際の動作については認識が誤っていた。オートネゴシエーションが一方だけ有効な場合も、相手の通信規格を自動で検知して問題なく通信できると思っていたが、オートネゴシエーションが無効な場合は上記のFLPを送出しない。代わりに、FLPのベース(?)のようなNLP(Normal Link Pulse)というものを送出する。このNLPは10BaseTのリンクアップ情報しか含まれていないので、オートネゴシエーションが有効な側は強制的に速度を10BaseTに合わせてしまう(10MB)。そして、速度はわかったが全二重か半二重かはわからない。この場合はオートネゴシエーションの仕様では半二重を選択するようだ。オートネゴシエーションが有効な大半のNICは全二重になっているだろうから、この通信はうまくいかなくなると考えられる。オートネゴシエーションは相手の状態に全部合わせてくれるものと思っていたがそうではないらしい。双方有効にして初めて期待する結果を得られる規格のようだ。つまり、組み合わせとしては以下のいずれかになる

  • 双方ともにオートネゴシエーションを有効にする
  • 双方ともに固定で通信規格を設定する(同じにしないといけない)