TCPスタック実装のどこが大変なのか

TCP/IPスタックを自前で調達するのは確かにあんまり薦められる方針でない。でも、普通のプログラマだったら多分達成できるレベルの課題だと思う。

大変1 : タイマ処理とスケジューリング

個人的に一番大変で面倒だとおもうのはタイマ処理だと思う。これに関して共通のフレームワークは存在しないし、大概の人はこの課題に挑戦した経験がない。
また、タイマ処理やバッファリングはTCPの性能を支配するパラメタの一つなので、ここを如何にクールに実装するかは重要な問題になる。

大変2 : パケットのパース

バイナリで到着するパケットの要素を変数に入れ、または逆に変数に入れた要素をパケットとして再構築して送出する というだけでもつまずくに足る要素だと思う。Cのstructはエンディアンを考慮しないし、アーキテクチャによってはアライメントされていないワードアクセスが出来ないこともある。

大変3 : 輻輳制御 = window処理の理解

TCPは何故動作するのか。その疑問の解の大部分はwindow制御に占められている。TCPが再送を行うプロトコルだというのは広く理解されているが、その仕組みを利用して、TCPは自分の接続が占めることの出来る帯域を"自動的に"検出することが出来る。
通常のシチュエーションでは*1輻輳制御のチューニングはTCP実装における最大の"遊びどころ"といえる。

大変4 : オブジェクトの管理と設計

平凡なプログラマは、TCPのようなステートフルなプロトコルを実装する経験に乏しい。
現代的な言語では問題にならないが、マイコンなどへの実装ではかなり腕の見せ所になる。

解決策

2に関しては、まさにskySchemeの領分。
3は研究としてもそれなりに為されているので、Web上の資料も探せば色々見つけられると考えられる。
1が難しい。。

*1:OSのスタックとして丸ごと作る場合は、他のコネクションとの連携やNICのフェイルオーバといったより新しい課題もある。