Seccamp 2016 チューター成果報告

28
プロトコルスタック自作で学ぶ OS NW 処理実装高速パケット処理 @slankdev IoT トラックチューター 2016.8 seccamp2016 1

Transcript of Seccamp 2016 チューター成果報告

プロトコルスタック自作で学ぶ

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

ありがとうございました

サイボウズ・ラボユース