昔、イーサネットスイッチ用のASICを開発していた頃の話し。
イーサネットパケットの最初のところ
イーサネットのパケットの構造は、まずプリアンブルと呼ばれる
1010
のパターンがきて、そのあと、
1011
というパターンがくると、その次からはデータ本体になります。
IEEE 802.3 規格としては、
10101010
という8ビットが7回きて、8回目が、
10101011
というパターンになるということです。この最後のパターンは SFD(Start Frame Delimiter)と呼ばれます。
スイッチのような機器で、パケットを受け取る場合、パケット受信部分のステートマシンは、
リセット -> プリアンブル待ち -> プリアンブル来た -> SFD 来た -> パケット本体部分処理
みたいな感じで進んでいきます。
短いプリアンブル
一方、現実的にはどんなことが起こるかというと、
短いプリアンブルでパケットを送ってくる機器がある
ということです。IEEE 802.3 の仕様だと、プリアンブルが7回なわけですが、そんなこと関係なく、短いプリアンブルで SFD になる。
で、前述した、パケット受信部のロジック実装のところで、プリアンブルが来たあと、プリアンブルが来た回数を律儀に数えるようなこと(カウンタ作ってカウントするか、プリアンブル受け取るたびに Preamble1 -> Preamble2 -> などと次のステートに遷移していくなどの処理)をしていると、このようなアウトローな機器との接続にうまく対応できなくなります。
でもそれって厳密には仕様違反じゃないですか?
と思ったのでそういう主張をしてみた覚えがあります。でも、社内の人から帰ってきた言葉は、
そのメーカーの機器は市場に多く出回っているのが現実で、その機器に繋げてウチの機器が動かないということがあっても、負けるのはこちらである。
というようなことでした。なるほど。これがオトナの社会か、と思ったものです。ちなみに、そのメーカーは国内の大手電機メーカーで、機器とは、確か、PCに挿すネットワーク用のPCIカードとかそんなのだったような気がしています。
実際のマーケット事情は複雑
ネットワーク機器は色んなものに繋がって動いて意味があるものです。つながる先は自社製品とは限らない。だからこそ仕様・規格があるけど、現実にはそこからちょっと外れているものもある。
仕様への準拠など、技術的な部分での勝ち負けで、マーケットが変わるわけでもない場合が多い。
だからこそ、技術的な既知の問題も含めた市場の状況をよく知り、場合によってはそういった問題解決も包含していくかたちで開発していかなくてはいけない場合もあるのでしょう。
技術規格はそれ自体、充分複雑なものですが、マーケットの事情はもっと複雑ですね。
開発側の人間も、仕様書や技術規格ドキュメントとにらめっこしてるだけではなく、社内外の色んな人の話を聞いて、世の中の現実を知ることで、もしかしたら将来起こる大きな問題を未然に回避できるかもしれません。何がどこでどう繋がっていくか分からないですからねー。