ドキドキするとき無敵でしょ

映画とプログラミングの話

お盆なのでTCP/IPプロトコルスタックを自作した

はじめに

お盆はTCP/IPプロトコルスタックを自作し、夜は配信され始めたコワすぎ!シリーズを見て過ごしていたらお盆が終わりました、Gunziです。
今年はお盆休み中にKLabExpartCampのTCP/IPプロトコルスタックの実装にチャレンジしたので、その備忘録をまとめます。完成したものはこちら。
github.com

資料はこちらから見られます。

KLab Expert Camp(資料公開) - Google Drive

経緯

決して「詳解TCP/IP vol.2 実装」を完走すると貰えるからやったわけではありません!!!!ものにつられるわけないじゃないですか!!!!

閑話休題。今から2年ほど前に1度チャレンジしていて、その時はRFC見ながらひとりでやるぞ!!!ということでできるところまでやってみました。 ちなみにARPちょっと実装したところで終わって惨敗でした。いや、勝利といえば勝利だが。

その後、pandaxさんとお話する機会があった際に「人の実装を読んだり追ってみて実装してみるのも勉強になるよ」とおすすめされたので、長期休みを利用して2年越しのリベンジというわけです。

また、最近ネットワーク周りの勉強を再開したので、基礎のおさらいとプロトコルを実装したくなった時に備えて今回チャレンジしてみました。みなさんもよくありますよね?

振り返り

お盆休みが10~20日までで10日間あったため、それらの時間の大半をプロトコルスタックに費やしました。 日本よ、これがお盆だ。社会人パワー、最高です。

というわけで自分のツイートを参照しながら振り返ってみます。

8/10 1日目 進捗: step4完了

まずはDay1のstep4まで進めた。この時は受信後にキューで管理するのか、となった。 まあ実装終わったのは日付変わってからだったが。

8/11 2日目 進捗: step7完了(day1完了)

この日は午前中にstep5を終え、無事day1が完了した。

step7で何かやらかしたらしく、gdbを使ってデバッグしながらアレ…?というのを2,3時間ほどやりました。結局なんだったんだろう…

pandaxさんからはツッコミが入りました

この時、写経が間違っていたことが判明することをまだ知らない

8/12 3日目 進捗: step10完了

0時過ぎまでやってしまった。ICMPメッセージが受信できるようになった。

8/13 4日目 進捗: step10完了

この日は別件でもくもく会に参加していたので、ピープルウェアを読み進めていた

なにわ男子のライブがあったらしい

8/14 5日目 進捗: step11完了(day2完了)

12日のやらかし分のツケをここで払う羽目になった。

とはいえICMPメッセージの送受信ができるようになったのでとても嬉しかった。

実装したプロトコルが動く、というのは面白い。

8/15 6日目 進捗: step14完了

朝起きたらpandaxさんからコメントがきていた。ありがたい ちなみに複数個所間違ってて一人で死ぬほど笑った

8/16 7日目 進捗: step18完了(day3完了)

ARP応答が返ってきてアドレス解決できるようになる流れができた。キャッシュも実装して幸せを感じた。一人でやったときはルーターに直接ARP投げて返ってきたのを確認するところまでしかできなかったなぁ、というのを思い出した。

8/17 8日目 進捗: step21完了(day4完了)

この日はIPルーティング、UDPの実装を行った。たまにルーティングテーブルを覗いたりすることがあるが、実装にしてみるのははじめてだった。UDPで通信できるの感動ものである。

8/18 9日目 進捗: step22完了

この日はハニーキャットのお渡し会があったため、day5を少し進めて終わり。 ユイちゃんと加恋ちゃんがバチクソにかわいかったです。

8/19 10日目 進捗: step25完了

俺、TCPのこと何もわかってなかった…という気持ちを得たのでマスタリングTCP/IP、資料に添付されていたURLのRFCを読んでなるほど、という気持ちを得ていた。 正直あまり日常生活で意識できていなかった部分なので、知らないこともあり勉強になった。

8/20 11日目 進捗: step28完了(day5完了)

3wayハンドシェイク、実際目の前にするとテンション上がるので実装するのおすすめです。

そして完走した。バズってからの第1号だったらしいので、ドヤ顔になりました。

完走した感想

一通りやってみると思ったよりエクササイズがとけなくて、結構苦戦しました。GDBデバッグしながらなんでお前は落ちてるんだ!!!って叫びながらデバッグしたのは良い思い出。 ちなみに途中で写経がめちゃくちゃ間違えていて、step20ぐらいで気づいて泣きながら修正しました。

microps自体がとてもわかりやすく、なんでこの実装になっているんだろう?と思った時に実装を追いながら理解する、といったことがしやすかったです。 何度も資料を反復横跳びしながらこれはこうなっているからこう、というのを理解しながら進めることができ、以前よりネットワークへの理解が深まりました。 また、マスタリングTCP/IPを読むだけでは味わえない、実装を通してプロトコルを理解する、という体験は非常に良いものだな、と改めて感じました。

次に向けて

KLabExpartCampを通して、ネットワークへのモチベーションがニュッと上がりました。 通信の仕組みそのものを実装する、という行為が体系的に得た知識をより盤石なものにし、また一つ、ネットワーク力†ぢから†を付けることができました。 昔は実装できなかったUDPTCPが動いている様子を見て、こんなにも感動するとは思いもよりませんでした。

最近はCiliumに興味を持ち、少しずつ調べているので、また近いうちにeBPFやXDP、CNIの話なんかをブログにまとめていけるよう、頑張ります。

P.S. ちなみに夏休みはいつまでも続くそうです。興味を持ったそこのみなさん、あなたも実装してみてはいかがでしょうか。