FreeBSDの勉強会ではTCP/IPの部分をやっています。FreeBSDにおける実装はかなり複雑で今の自分では理解するのが難しそうです。

そこでコンパクトではあるがあるべき機能は正しく含んでいる実装はないか探したところuIPを見つけました。

とりあえず説明資料を読み概略は理解しました。ソースコードをちらちらながめているのですがコンパクトな実装とは言えUNIXv6位のサイズがあり理解できるか分かりません。

なんとかuIPを理解して段階的により大きな実装を理解していきたいと思っています。
TCP/IPの話に入りました。

TCPのヘッダにシーケンス番号と確認応答番号が入っているのは、1つのパケットを送信することでどこまで受信済みかを相手に通知することができるというHDLCやIrDAと同じアイデアだなと思いました。

IPパケットのヘッダにプロトコル種別が含まれているのは、一般に通信プロトコル階層では1つ上の階層のパケットの中身に関知せず単なるデータとして取り扱うという原則に反しているのではないかと思っていたのですが、IPの上にプロトコルが1種類しかなければ不要ですが、TCPとUDPの2つがあるので非同期にIPパケットを受信した時にそのデータ部をどの上位層の入力処理関数に渡すかを決めるには必要だということに気付きました。

TCPパケットのデータ部を上層のftpとかhttpとかどのプロトコル処理関数に渡すかはポート番号を使っているので一見パケットの中身には関知していないように見えますが、80番ポートに渡すということはhttpな訳ですから同じようなものだと考えられます。

通信プロトコル階層では1つ上の階層のパケットの中身に関知せず単なるデータとして取り扱うという原則論がそのまま通用するのは1つ上の階層にプロトコルが1種類しか無い場合なのですね。

下の層について考えて見ると、IP層の下には様々なリンク層がありえます。イーサネットやpppが代表だと思いますが、リンク層を複数もつホストがIPパケットを送信する時には下位層の出力処理関数を選ぶための情報はパケット内には含まれておらずOS等が管理している情報を使わなければならないということですね。

結局上にしろ下にしろ選択肢が複数ある場合は何らかの情報がないと渡し先が決められないということですね。長年のもやもやが少し晴れた気がします。
「BSDカーネルの設計と実装」読書会に参加していますが、13章はTCP/IPの話になっています。

この本は読みにくいので、FreeBSDにおける実装ではなくてTCP/IPそのものに関する話は別の本で勉強した方が良いと考え、長年本棚で埃をかぶっていた本を引っ張り出しました。

TCPのしくみと実装―RFCの詳細から実装系の解析まで (TCPIP基礎シリーズ)/CQ出版

¥2,808
Amazon.co.jp

既に絶版になっておりネットでも中古しか手に入らないようですが、具体的で分かりやすく書いてあると思いました。

乗りかかった船なので、この本もしっかり勉強したいと思っています。TCP/IPのRFCにも挑戦してみようかな。