Upload
slankdev
View
2.060
Download
0
Embed Size (px)
Citation preview
プロトコルスタック自作で学ぶ
OSのNW処理実装と高速パケット処理@slankdev
IoTトラックチューター
2016.8 seccamp2016 1
自己紹介
oすらんくでぶ(slankdev)◦ Twitterとか:slankdev◦学部 3年◦サイボウズ・ラボユース第5,6期生◦ 2015キャンプ修了生
oパケットの世界から一歩一歩レイヤを下げて生活
oタイヤを再発明するのがとっても得意
2016.8 seccamp2016 2
2016.8 seccamp2016 3
ARPパケットってc言語で送れる?
大学入学時
2016.8 seccamp2016 4
ARPパケットってc言語で送れる?
パケット解析ライブラリを
C++で
大学入学時
2016.8 seccamp2016 5
ARPパケットってc言語で送れる?
パケット解析ライブラリを
C++で
大学入学時
自分でプロトコルスタック実装して
オレオレネットワークするんじゃ
2016.8 seccamp2016 6
ARPパケットってc言語で送れる?
パケット解析ライブラリを
C++で
大学入学時
自分でプロトコルスタック実装して
オレオレネットワークするんじゃ
現在
Agenda1. なぜプロトコルスタック開発なのか2. 開発物の概要3. 開発の流れ、出来事、知見、現状4. 今後の展望
細かく説明する時間がないので、気になった方は直接お話を!!!
2016.8 seccamp2016 7
なぜプロトコルスタック
o昨年度はパケット解析ツール
oパケット屋さんになるはずが…oLinuxカーネルのプロトコルスタックは遅いo研究に使いたい(夢)
oオレオレ物が大好き
o高速化など今の僕にはいい勉強になる
oサイボウズラボユース
2016.8 seccamp2016 8
パケット処理高速化の手法
oLRO (LargeReceiveOffload)◦デフラグメントをHW処理
oLSO(LargeSegmentOffload)◦フラグメントをHW処理
oチェックサムをOffloading
2016.8 seccamp2016 9
パケット処理高速化の手法
oLRO (LargeReceiveOffload)◦デフラグメントをHW処理
oLSO(LargeSegmentOffload)◦フラグメントをHW処理
oチェックサムをOffloading
2016.8 seccamp2016 10
Segmentation Offloadとの出会いoNICに癖があってルータ自作で死んだことがあって
oreadでLROされてるけど、owriteでLSOされないから
2016.8 seccamp2016 11
プロトコルスタック開発概要
o名前 stcp (slankdev’s tcp/ip) ->名前未定ohttp://github.com/slankdev/stcp
oユーザランドで動作
o極力ゼロコピー
oマルチインターフェースをサポート
oIOエンジンはDPDKを使用oC++11で開発
2016.8 seccamp2016 12
開発手法
oBSD,Linuxから勉強oC++でまとめるoDPDKを使いこなす
o読書->ソース確認->実装->テスト->読書->…o開発にかける時間の9割が読書とソースリード
2016.8 seccamp2016 13
情報収集の方法
oBSDの黄色い本
oBSD>>>Linux
o動的解析はLinuxでSystemTapoBSD版のSystemTapみたいなのあれば教えてください
2016.8 seccamp2016 14
DPDK(DataPlaneDevelopmentKit)o (ほぼIntelNICのみサポート)ユーザランド高速パケットIOドライバoカーネル処理より相当早い
2016.8 seccamp2016 15
STCPの設計 (理想)
2016.8 seccamp2016 16
STCPの設計 (現実)
2016.8 seccamp2016 17
パケットの管理
ombufを使用して実装 (Linuxだとskb)->DPDKにもmbuf相当のものがあるよ!
o線形リストになっている
oパケットの先頭や末尾にデータを追加、消去しやすいデータ構造
o参照数とかのカウントや受信ポート情報とかの情報も持つ
2016.8 seccamp2016 18
mbufとは
2016.8 seccamp2016 19
ただのNWプログラミングだとouint8_t[1600]みたいなのに先頭から詰めるのがよくある
oでも先頭にヘッダを追加したりしたい時は?
oいちいちコピーし直さないといけない!!
2016.8 seccamp2016 20
パケット
典型的なmbufの例
2016.8 seccamp2016 21
各プロトコル間やデバイスの管理
2016.8 seccamp2016 22
「C++でまとめる」..とはo伝統 ->リンクリストo今回 ->Vector
oリサイズでメモリ解放してくれなかったりもっといい手法があるかもだけどとりあえずこれで
oなるべくシンプルにすることが目標
2016.8 seccamp2016 23
ゼロコピーを実現
o各プロトコルモジュール間のデータ移動は線形リスト
oパケット管理はDPDKがある程度束縛するのでSTLと相性悪い
2016.8 seccamp2016 24
私
DPDKC++11
現状
oARP処理部分まで
o現状では完全ゼロコピー
oDPDKのチューニングとかでパフォーマンスは変わりそう
o現在はDPDKのラップとか設計ばかり
2016.8 seccamp2016 25
今後の展望
o組み替えたりチューニングしやすいように
oAPIの提供oデータプレーンを変えられる ->別HW…?
2016.8 seccamp2016 26
感想
oさらに知りたいことがたくさん見つかる
o昔は(使いやすい?)車輪を。今度は早くする工夫を
oパケット処理の高速化はたくさん方法がある◦処理を早くする◦ オフローディング◦ メモリアクセスを賢く◦ etc..
oどんどんレイヤが下がる一方
2016.8 seccamp2016 27
2016.8 seccamp2016 28
aabb ccdd eeff 0011 2233 4455 0800 45002800 0001 0000 4006 b9a2 c0a8 b302 c0a86501 3039 3039 0000 0000 0000 0000 50012000 961c 0000
ありがとうございました
サイボウズ・ラボユース