OSI参照モデルとRFC1122

はじめに

先日、非CS学部出身のソフトウェアエンジニアの友達にネットワークのプロトコルについて軽く説明してた時に、OSI参照モデルに則って説明をしていました。 機械工学科から頑張って情報系にジョブチェンジする際にマスタリングTCP/IPを読み込んだのを思い出しながら、喋ってて、内容は以下のようなものです。

  • インターネットプロトコルを構成する要素を以下の7層に区切って考えるモデルである
  • 送信側では、パケットは7層で作られて下の層に降りていきながらラップされていき、受信側では下の層からラップを剥がしながら通信の内容を読み取る。

最後、雑ではありますが、大体正しいこと言ってる気がします。ざっくりしたイメージを共有したところで、具体的な層ごとの説明をしようとしたところで違和感を感じます。

あれ...?プレゼンテーション層とセッション層を代表するプロトコルってなんだ...?

HTTPやSMTPなどは一番上位のレイヤーに位置するという認識はありましたが、ぶっちゃけ5層6層と分離して考えられるのか...?あれ...? トランスポート層TCPUDPプロトコルの違いや輻輳制御などを学んだ記憶があるので説明できる。ネットワーク層IPv4/IPv6、ルーティングアルゴリズムについて勉強した。データリンク層物理層は...CSMA/CD、CSMA/CAとかあの辺のパケットの衝突検知や回避、macアドレスEthernet周りが定義されてるはずだが...うん?ここってEthernetとかは1層と2層跨ってるよな?なんて思いながら言葉に詰まりました。

OSI参照モデルは実装されていない

いろんな文献を参照してるとOSI参照モデルは頻繁に登場します。僕が初めてネットワークをしっかり学んだマスタリングTCP/IPでもOSI参照モデルを利用してネットワークを階層化し、説明をしていました。もちろん4層モデルの存在は知っていましたが、捉え方が違うだけだろうとか思っとりました。全然違いました。OSI参照モデルRFCで採用されていません。RFCで採用されているのは4層モデルであり、OSI参照モデルはあくまで学習用くらいで捉えておいた方がいいようです。wikipediaにも冒頭にそんな説明がありますね*1

ややこしいのは、中途半端に基礎知識みたいな形で広まってるのと、L2スイッチやL3スイッチみたいにOSI参照モデルに則った命名してる機器が普通に存在してたりするので面倒ですね。

RFC1122を読む

ネットワークのレイヤの定義ってどこにあんだ??って思ったら、RFC1122がそれでした。めっちゃ長い。全部読めたもんじゃねぇ。 細かい話は置いておいて、RFC1122*2 はネットワークのレイヤを以下の4階層に分けることを定義してます。

これらの層が果たす役割だったり、要件を定義していくのが、図とか使わず自然言語でずーーーーーーっと続いてます*3。凄まじい。RFCはあまりしっかりと読んだことなかったですが*4、Introductionを読んでいると仕様にもいくつか厳しさのレベルがあって、絶対やんなきゃいけないもの、やった方がいいもの、やっても良いものという風に、言葉使いを定義しています。丁寧ですね。

     *    "MUST"
          This word or the adjective "REQUIRED" means that the item
          is an absolute requirement of the specification.
     *    "SHOULD"
          This word or the adjective "RECOMMENDED" means that there
          may exist valid reasons in particular circumstances to
          ignore this item, but the full implications should be
          understood and the case carefully weighed before choosing
          a different course.
     *    "MAY"
          This word or the adjective "OPTIONAL" means that this item
          is truly optional.  One vendor may choose to include the
          item because a particular marketplace requires it or
          because it enhances the product, for example; another
          vendor may omit the same item.

他にも、要件の追加説明にはDISCUSSIONやIMPLEMENTATIONなんてラベルの項目があって、こういうことが起こるとこんな問題が生じるから、実際に実装するにはこうするといいよ、みたいな実装者への提案もあったりしてます。こんな感じなのか。当たり前ですが実装と1対1で対応するほど詳細な定義はされてなくって、ある程度含み持たせてんだなぁとなりました。この定義をメールでやりとりしながら決めて、で、スーパーハッカーみたいな人たちがその実装作って、実際それが動いてThe Internetを支えてるって、めっちゃcoolですな....

ただ自然言語で説明されてもイメージがつきにくいところがたくさんあって、世に出回ってる教科書や資料なんかを見た方が普通に時間効率はいいですね。大学院の授業で使ったComputer Networkingは相当に丁寧でよかった記憶しかないのでリファレンスにええっすよとだけ推しとこ。

終わり

自分はネットワークが専門でもないですし、ネットワーク関連のR&Dプロジェクトに大学院を出た後アサインされる予定も今のところないです。仕事はアプリケーションよりのエンジニアリングがメインなので。実務の中ではRFCを直接参照するよりも他の媒体で情報収集することが多そうですし、APIを叩くインターフェースが綺麗に簡単に使えるように中身をラップしてくれているので、ぶっちゃけRFCで実装されてようがOSIで実装されてようが気になりませんでした。ただ、他人に何かを説明する場面で嘘つきそうになったのに気づけてよかったっす。知識の整理にもなったし。

あと低レイヤーオタクなのでこういうの読んでると、いつかエンジニアとして成長してネットワークのプロトコル実装するお仕事とかできるくらい強くなりたいなって思いました。誰かスカウトしてください。

*1:wikipediaなんて参考にすんなって人が多いですが9割5分くらい正しいこと書いてる(分野による)んで論文書いたり公式な声明書いたりしない限りはかなり参考になると思ってます。

*2:日本語版の方が読みやすい

*3:長い論文だと100P近いものってありますし、見慣れないわけでもないんですが、フォーマットがcssとか知らなそうなアレでアレがアレで長く感じるのかな

*4:このRFCも隅から隅まで読んだりはしてません