Featured image of post KlabExpertCamp #6 参加記

KlabExpertCamp #6 参加記

KlabExpertCamp #6の感想とか

KlabExpertCamp #6

KlabExpertCampとは?

Kawaiiネームプレートを頂いた!!

Klab株式会社さんで実施されている学生向けインターン(というよりはワークショップ?)イベントです.今回参加した第6回はオンラインで開催され,5日間の日程でTCP/IPプロトコルスタックを自作,という内容でした.

ハードなスケジュールではありましたが,山本さんを始めとする講師の方々の手厚いサポートもあり,なんとか実装を終えることができました.(山本さんの強力な人力デバッギングと目grepには感動しました.) 講義で使用された資料,サンプルコード等は,山本さんの固定ツイートから見ることができます.

プロトコルスタック自作に興味のある方は,是非次回の開催情報を確認してみてください!ExpertCamp運営・採用担当のKの27乗さんのtwitterでも最新情報が発信されています.

最終的に何ができた?

TCPの3Way-Handshakeでセッションを確立し,その上でペイロードを送受信できるプログラムが完成しました! RFC793をベースにしたソケットAPIっぽいものができるので,サクっとインチキhttpサーバを建ててみた.

日程の詳細とか

Day 1

プロトコルスタック全体のアーキテクチャ解説,割り込み処理,dummyデバイスの実装をしました. 以降の講義においては,まず座学での解説があったのち,山本さん自作のプロトコルスタック(microps)をベースにしたスケルトンに対してロジックを実装する,という流れで進みました. 参加者にTwitterで見たことある人も何人かいて勝手に親近感を覚えていた.

code

Day 2

論理IPインターフェースの実装,IPパケット入出力の実装,ICMP入出力の実装. IP,ICMPができたので,loopback経由でpingが打てるように!!

色分けがないとログを読めない人種なので,気合と筋肉で色付け.

code diff

Day 3

イーサネットデバイス,ARP (Address Resolution Protocol)の実装を行いました. ARPの実装により,自インターフェース以外との通信が可能になった!

余談ですが,ARPのRFC(RFC826)はかなり読みやすかったので,入門にオススメです.

感動の瞬間である.

code diff

Day 4

IPルーティング,UDPの入出力を実装.割り込み処理周りはかなり厄介で,気付かぬうちにバグが潜んでいることもしばしば…

IPルーティングによって,自サブネット外のホストとの通信が可能になりました! UDPの実装によってUDP echo serverが動作するようになりました.いよいよプロトコルスタック感が出てきた感じ.

code diff

Day 5

いよいよ最終日! TCPを実装.UDPと比較するとかなり複雑でしたが,なんとか実装を終えることができました.

TCPでの通信が可能になったので,インチキHTTPサーバを動作させてみた.

かなりパンチの強い内容で笑ってしまった.

code diff

Day 6?

Day 5で実装したTCPは完全なものではなく,特にセッション切断まわりの実装が不十分(時間的に全て実装するのはムリ)だったので,RFCとmicropsのmasterブランチを参考に改修を行いました.

ついでにdhclientもどきを実装.

code diff

まとめ

大変学びのある1週間となりました.通常,プロトコルスタックはOSによって隠蔽されているため,ユーザから触れることができるのはソケットAPI等の抽象化されたものです.ソケットの先,もう少し深い領域に触れることのできるまたとない機会でした. 今後,時間を見つけて自作OSへの移植もしてみたいです.

このような素晴しいイベントを企画,開催してくださったKLab株式会社の皆さまに感謝申し上げます.ありがとうございました.

修了証も頂けて大変嬉しい

Tsukudani.

Licensed under CC BY 4.0
Built with Hugo
テーマ StackJimmy によって設計されています。