狠狠撸

狠狠撸Share a Scribd company logo
プロトコルスタック自作で学ぶ
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++で
大学入学時
自分でプロトコルス
タック実装して
オレオレネットワーク
するんじゃ
現在
Agenda
1. なぜプロトコルスタック開発なのか
2. 開発物の概要
3. 開発の流れ、出来事、知見、現状
4. 今後の展望
細かく説明する時間がないので、
気になった方は直接お話を!!!
2016.8 seccamp2016 7
なぜプロトコルスタック
o昨年度はパケット解析ツール
oパケット屋さんになるはずが…
oLinuxカーネルのプロトコルスタックは遅い
o研究に使いたい(夢)
oオレオレ物が大好き
o高速化など今の僕にはいい勉強になる
oサイボウズラボユース
2016.8 seccamp2016 8
パケット処理高速化の手法
oLRO (Large	Receive	Offload)
? デフラグメントをHW処理
oLSO	(Large	Segment	Offload)
? フラグメントをHW処理
oチェックサムをOffloading
2016.8 seccamp2016 9
パケット処理高速化の手法
oLRO (Large	Receive	Offload)
? デフラグメントをHW処理
oLSO	(Large	Segment	Offload)
? フラグメントを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でSystemTap
oBSD版のSystemTapみたいなの
あれば教えてください
2016.8 seccamp2016 14
DPDK	(Data	Plane	Development	Kit)
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
私
DPDK
C++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 4500
2800 0001 0000 4006 b9a2 c0a8 b302 c0a8
6501 3039 3039 0000 0000 0000 0000 5001
2000 961c 0000
ありがとうございました
サイボウズ?ラボユース

More Related Content

Seccamp 2016 チューター成果報告