はじめに
お盆はTCP/IPプロトコルスタックを自作し、夜は配信され始めたコワすぎ!シリーズを見て過ごしていたらお盆が終わりました、Gunziです。
今年はお盆休み中にKLabExpartCampのTCP/IPプロトコルスタックの実装にチャレンジしたので、その備忘録をまとめます。完成したものはこちら。
github.com
資料はこちらから見られます。
KLab Expert Camp(資料公開) - Google Drive
経緯
決して「詳解TCP/IP vol.2 実装」を完走すると貰えるからやったわけではありません!!!!ものにつられるわけないじゃないですか!!!!
大人も貰えるよ https://t.co/vIoDyZUG7v
— YAMAMOTO Masaya (@pandax381) 2023年8月7日
閑話休題。今から2年ほど前に1度チャレンジしていて、その時はRFC見ながらひとりでやるぞ!!!ということでできるところまでやってみました。 ちなみにARPちょっと実装したところで終わって惨敗でした。いや、勝利といえば勝利だが。
その後、pandaxさんとお話する機会があった際に「人の実装を読んだり追ってみて実装してみるのも勉強になるよ」とおすすめされたので、長期休みを利用して2年越しのリベンジというわけです。
また、最近ネットワーク周りの勉強を再開したので、基礎のおさらいとプロトコルを実装したくなった時に備えて今回チャレンジしてみました。みなさんもよくありますよね?
振り返り
お盆休みが10~20日までで10日間あったため、それらの時間の大半をプロトコルスタックに費やしました。 日本よ、これがお盆だ。社会人パワー、最高です。
というわけで自分のツイートを参照しながら振り返ってみます。
8/10 1日目 進捗: step4完了
まずはDay1のstep4まで進めた。この時は受信後にキューで管理するのか、となった。 まあ実装終わったのは日付変わってからだったが。
プロトコルスタック、step4 まできた
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月10日
step4 が終わったので今日は寝ます
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月10日
8/11 2日目 進捗: step7完了(day1完了)
この日は午前中にstep5を終え、無事day1が完了した。
step7で何かやらかしたらしく、gdbを使ってデバッグしながらアレ…?というのを2,3時間ほどやりました。結局なんだったんだろう…
step7でなんかの実装がミスってるらしく、セグフォ吐いて死んだ…これどこだろう。gdbで見てるけどデバイス回りっぽいんだよな
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月11日
なにもしてないのに動きましたの札を提げています
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月11日
pandaxさんからはツッコミが入りました
それはたまたま動いてるだけやと思うで
— YAMAMOTO Masaya (@pandax381) 2023年8月11日
この時、写経が間違っていたことが判明することをまだ知らない
8/12 3日目 進捗: step10完了
0時過ぎまでやってしまった。ICMPメッセージが受信できるようになった。
step10完了。眠いのでまた明日
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月12日
8/13 4日目 進捗: step10完了
この日は別件でもくもく会に参加していたので、ピープルウェアを読み進めていた
なにわ男子のライブがあったらしい
勉強会にいかないでドームでライブしたほうがモテることに気づいた
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月13日
8/14 5日目 進捗: step11完了(day2完了)
12日のやらかし分のツケをここで払う羽目になった。
とはいえICMPメッセージの送受信ができるようになったのでとても嬉しかった。
実装したプロトコルが動く、というのは面白い。
セグフォしたのを泣きながらデバッグしてる。原因箇所は特定できたっぽい?朝起きたら続きやろ
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月14日
8/15 6日目 進捗: step14完了
朝起きたらpandaxさんからコメントがきていた。ありがたい ちなみに複数個所間違ってて一人で死ぬほど笑った
チラ見したところ icmp_output() に怪しい箇所がありますねぇ
— YAMAMOTO Masaya (@pandax381) 2023年8月14日
8/16 7日目 進捗: step18完了(day3完了)
ARP応答が返ってきてアドレス解決できるようになる流れができた。キャッシュも実装して幸せを感じた。一人でやったときはルーターに直接ARP投げて返ってきたのを確認するところまでしかできなかったなぁ、というのを思い出した。
キャッシュがデリートされて嬉しさがある。day3完了〜 pic.twitter.com/eyIeponFzn
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月16日
8/17 8日目 進捗: step21完了(day4完了)
この日はIPルーティング、UDPの実装を行った。たまにルーティングテーブルを覗いたりすることがあるが、実装にしてみるのははじめてだった。UDPで通信できるの感動ものである。
step19完了。受信されてる pic.twitter.com/UEVMtpqJDH
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月16日
8/18 9日目 進捗: step22完了
この日はハニーキャットのお渡し会があったため、day5を少し進めて終わり。 ユイちゃんと加恋ちゃんがバチクソにかわいかったです。
#ハニーキャット お渡し会🐈⬛
— アイカツデザインマート公式 (@aikatsu_style) 2023年8月18日
ご参加いただいた皆さまありがとうございました❣️
明日はリフレクトムーン🌕
明後日はピュアパレット🎨
よろしくお願いします❣️
参加券まだ配布中です✨#ミニアイカツスタイル pic.twitter.com/8PMPm8gt71
8/19 10日目 進捗: step25完了
俺、TCPのこと何もわかってなかった…という気持ちを得たのでマスタリングTCP/IP、資料に添付されていたURLのRFCを読んでなるほど、という気持ちを得ていた。 正直あまり日常生活で意識できていなかった部分なので、知らないこともあり勉強になった。
step23完了 pic.twitter.com/bGk8PpeVgn
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月19日
step25完了 pic.twitter.com/aSOuOB6t3U
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月19日
8/20 11日目 進捗: step28完了(day5完了)
3wayハンドシェイク、実際目の前にするとテンション上がるので実装するのおすすめです。
step27 完了。これが3wayハンドシェイク.......
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月20日
そして完走した。バズってからの第1号だったらしいので、ドヤ顔になりました。
といわけで step28 まで完了した。これで終わりかな
— Gunzi a.k.a オモシロ (@com_gunzi) 2023年8月20日
おー!先日バズったツイートの後の完走第1号ですね、おつかれさまでした🎉 https://t.co/02LjflOl65
— YAMAMOTO Masaya (@pandax381) 2023年8月20日
完走した感想
一通りやってみると思ったよりエクササイズがとけなくて、結構苦戦しました。GDBでデバッグしながらなんでお前は落ちてるんだ!!!って叫びながらデバッグしたのは良い思い出。 ちなみに途中で写経がめちゃくちゃ間違えていて、step20ぐらいで気づいて泣きながら修正しました。
microps自体がとてもわかりやすく、なんでこの実装になっているんだろう?と思った時に実装を追いながら理解する、といったことがしやすかったです。 何度も資料を反復横跳びしながらこれはこうなっているからこう、というのを理解しながら進めることができ、以前よりネットワークへの理解が深まりました。 また、マスタリングTCP/IPを読むだけでは味わえない、実装を通してプロトコルを理解する、という体験は非常に良いものだな、と改めて感じました。
次に向けて
KLabExpartCampを通して、ネットワークへのモチベーションがニュッと上がりました。 通信の仕組みそのものを実装する、という行為が体系的に得た知識をより盤石なものにし、また一つ、ネットワーク力†ぢから†を付けることができました。 昔は実装できなかったUDP、TCPが動いている様子を見て、こんなにも感動するとは思いもよりませんでした。
最近はCiliumに興味を持ち、少しずつ調べているので、また近いうちにeBPFやXDP、CNIの話なんかをブログにまとめていけるよう、頑張ります。
P.S. ちなみに夏休みはいつまでも続くそうです。興味を持ったそこのみなさん、あなたも実装してみてはいかがでしょうか。
夏休みっていつまで?
— YAMAMOTO Masaya (@pandax381) 2023年8月7日