KlabExpertCamp #6
KlabExpertCampとは?
Klab株式会社さんで実施されている学生向けインターン(というよりはワークショップ?)イベントです.今回参加した第6回はオンラインで開催され,5日間の日程でTCP/IPプロトコルスタックを自作,という内容でした.
ハードなスケジュールではありましたが,山本さんを始めとする講師の方々の手厚いサポートもあり,なんとか実装を終えることができました.(山本さんの強力な人力デバッギングと目grepには感動しました.) 講義で使用された資料,サンプルコード等は,山本さんの固定ツイートから見ることができます.
プロトコルスタック自作に興味のある方は,是非次回の開催情報を確認してみてください!ExpertCamp運営・採用担当のKの27乗さんのtwitterでも最新情報が発信されています.
最終的に何ができた?
TCPでEchoまで動いた!!#KLabExpertCamp pic.twitter.com/7DF7azgpQm
— Tsukudani (@salty_poison) August 30, 2023
microhttpsrv動作ヨシ!#KLabExpertCamp pic.twitter.com/B9I9ObIurA
— Tsukudani (@salty_poison) August 30, 2023
TCPの3Way-Handshakeでセッションを確立し,その上でペイロードを送受信できるプログラムが完成しました! RFC793をベースにしたソケットAPIっぽいものができるので,サクっとインチキhttpサーバを建ててみた.
日程の詳細とか
Day 1
プロトコルスタック全体のアーキテクチャ解説,割り込み処理,dummyデバイスの実装をしました. 以降の講義においては,まず座学での解説があったのち,山本さん自作のプロトコルスタック(microps)をベースにしたスケルトンに対してロジックを実装する,という流れで進みました. 参加者にTwitterで見たことある人も何人かいて勝手に親近感を覚えていた.
#KLabExpertCamp
— Tsukudani (@salty_poison) August 24, 2023
やります!!
Day 2
論理IPインターフェースの実装,IPパケット入出力の実装,ICMP入出力の実装. IP,ICMPができたので,loopback経由でpingが打てるように!!
色分けがないとログを読めない人種なので,気合と筋肉で色付け.色付けたら結構よいかんじ pic.twitter.com/Knb4jsEeeh
— Tsukudani (@salty_poison) August 25, 2023
Day 3
イーサネットデバイス,ARP (Address Resolution Protocol)の実装を行いました. ARPの実装により,自インターフェース以外との通信が可能になった!
余談ですが,ARPのRFC(RFC826)はかなり読みやすかったので,入門にオススメです.
感動の瞬間である.自作プロトコルスタックからpingが帰ってきた!!!!!!!!!!!!!
— Tsukudani (@salty_poison) August 28, 2023
めちゃくちゃ嬉しい!#KLabExpertCamp pic.twitter.com/m87UgIPZth
Day 4
IPルーティング,UDPの入出力を実装.割り込み処理周りはかなり厄介で,気付かぬうちにバグが潜んでいることもしばしば…
IPルーティングによって,自サブネット外のホストとの通信が可能になりました! UDPの実装によってUDP echo serverが動作するようになりました.いよいよプロトコルスタック感が出てきた感じ.
IPルーティング実装ヨシ!!!!
— Tsukudani (@salty_poison) August 29, 2023
8.8.8.8と対話できるようになった!#KLabExpertCamp pic.twitter.com/o155ddzmK7
ソケットAPIもどきまで来たので,だいぶ完成が見えてきた感じする #KLabExpertCamp
— Tsukudani (@salty_poison) August 29, 2023
Day 5
いよいよ最終日! TCPを実装.UDPと比較するとかなり複雑でしたが,なんとか実装を終えることができました.
TCPでEchoまで動いた!!#KLabExpertCamp pic.twitter.com/7DF7azgpQm
— Tsukudani (@salty_poison) August 30, 2023
TCPでの通信が可能になったので,インチキHTTPサーバを動作させてみた.microhttpsrv動作ヨシ!#KLabExpertCamp pic.twitter.com/B9I9ObIurA
— Tsukudani (@salty_poison) August 30, 2023
修了です!#KLabExpertCamp pic.twitter.com/BSruwYna1C
— Tsukudani (@salty_poison) August 30, 2023
かなりパンチの強い内容で笑ってしまった.参加者のみなさん、5日間お疲れ様でした。多くの人間は TCP の 3Way-Handshake を自力で行うことも、受け取った ACK 番号が UNA 以上 NXT 以下であることを確認することもなく人生を終えてきますが、みなさんはこれを成し遂げました。みなさんの人生に RFC の加護があらんことを。#KLabExpertCamp
— YAMAMOTO Masaya (@pandax381) August 30, 2023
Day 6?
Day 5で実装したTCPは完全なものではなく,特にセッション切断まわりの実装が不十分(時間的に全て実装するのはムリ)だったので,RFCとmicropsのmasterブランチを参考に改修を行いました.
ついでにdhclientもどきを実装.
とりあえず雑にDHCPを実装
— Tsukudani (@salty_poison) September 5, 2023
エラーハンドリングとか書き足さねば pic.twitter.com/jafvINgg2N
setsockoptでのタイムアウト設定,DHCPの再送制御まで出来たので,dhclientもどきは取りあえず完成とする pic.twitter.com/nVWh0QXXxd
— Tsukudani (@salty_poison) September 8, 2023
まとめ
大変学びのある1週間となりました.通常,プロトコルスタックはOSによって隠蔽されているため,ユーザから触れることができるのはソケットAPI等の抽象化されたものです.ソケットの先,もう少し深い領域に触れることのできるまたとない機会でした. 今後,時間を見つけて自作OSへの移植もしてみたいです.
このような素晴しいイベントを企画,開催してくださったKLab株式会社の皆さまに感謝申し上げます.ありがとうございました.
Tsukudani.