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

Seccamp 2016 チューター成果報告

Embed Size (px)

Citation preview

Page 1: Seccamp 2016 チューター成果報告

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

OSのNW処理実装と高速パケット処理@slankdev

IoTトラックチューター

2016.8 seccamp2016 1

Page 2: Seccamp 2016 チューター成果報告

自己紹介

oすらんくでぶ(slankdev)◦ Twitterとか:slankdev◦学部 3年◦サイボウズ・ラボユース第5,6期生◦ 2015キャンプ修了生

oパケットの世界から一歩一歩レイヤを下げて生活

oタイヤを再発明するのがとっても得意

2016.8 seccamp2016 2

Page 3: Seccamp 2016 チューター成果報告

2016.8 seccamp2016 3

ARPパケットってc言語で送れる?

大学入学時

Page 4: Seccamp 2016 チューター成果報告

2016.8 seccamp2016 4

ARPパケットってc言語で送れる?

パケット解析ライブラリを

C++で

大学入学時

Page 5: Seccamp 2016 チューター成果報告

2016.8 seccamp2016 5

ARPパケットってc言語で送れる?

パケット解析ライブラリを

C++で

大学入学時

自分でプロトコルスタック実装して

オレオレネットワークするんじゃ

Page 6: Seccamp 2016 チューター成果報告

2016.8 seccamp2016 6

ARPパケットってc言語で送れる?

パケット解析ライブラリを

C++で

大学入学時

自分でプロトコルスタック実装して

オレオレネットワークするんじゃ

現在

Page 7: Seccamp 2016 チューター成果報告

Agenda1. なぜプロトコルスタック開発なのか2. 開発物の概要3. 開発の流れ、出来事、知見、現状4. 今後の展望

細かく説明する時間がないので、気になった方は直接お話を!!!

2016.8 seccamp2016 7

Page 8: Seccamp 2016 チューター成果報告

なぜプロトコルスタック

o昨年度はパケット解析ツール

oパケット屋さんになるはずが…oLinuxカーネルのプロトコルスタックは遅いo研究に使いたい(夢)

oオレオレ物が大好き

o高速化など今の僕にはいい勉強になる

oサイボウズラボユース

2016.8 seccamp2016 8

Page 9: Seccamp 2016 チューター成果報告

パケット処理高速化の手法

oLRO (LargeReceiveOffload)◦デフラグメントをHW処理

oLSO(LargeSegmentOffload)◦フラグメントをHW処理

oチェックサムをOffloading

2016.8 seccamp2016 9

Page 10: Seccamp 2016 チューター成果報告

パケット処理高速化の手法

oLRO (LargeReceiveOffload)◦デフラグメントをHW処理

oLSO(LargeSegmentOffload)◦フラグメントをHW処理

oチェックサムをOffloading

2016.8 seccamp2016 10

Page 11: Seccamp 2016 チューター成果報告

Segmentation Offloadとの出会いoNICに癖があってルータ自作で死んだことがあって

oreadでLROされてるけど、owriteでLSOされないから

2016.8 seccamp2016 11

Page 12: Seccamp 2016 チューター成果報告

プロトコルスタック開発概要

o名前 stcp (slankdev’s tcp/ip) ->名前未定ohttp://github.com/slankdev/stcp

oユーザランドで動作

o極力ゼロコピー

oマルチインターフェースをサポート

oIOエンジンはDPDKを使用oC++11で開発

2016.8 seccamp2016 12

Page 13: Seccamp 2016 チューター成果報告

開発手法

oBSD,Linuxから勉強oC++でまとめるoDPDKを使いこなす

o読書->ソース確認->実装->テスト->読書->…o開発にかける時間の9割が読書とソースリード

2016.8 seccamp2016 13

Page 14: Seccamp 2016 チューター成果報告

情報収集の方法

oBSDの黄色い本

oBSD>>>Linux

o動的解析はLinuxでSystemTapoBSD版のSystemTapみたいなのあれば教えてください

2016.8 seccamp2016 14

Page 15: Seccamp 2016 チューター成果報告

DPDK(DataPlaneDevelopmentKit)o (ほぼIntelNICのみサポート)ユーザランド高速パケットIOドライバoカーネル処理より相当早い

2016.8 seccamp2016 15

Page 16: Seccamp 2016 チューター成果報告

STCPの設計 (理想)

2016.8 seccamp2016 16

Page 17: Seccamp 2016 チューター成果報告

STCPの設計 (現実)

2016.8 seccamp2016 17

Page 18: Seccamp 2016 チューター成果報告

パケットの管理

ombufを使用して実装 (Linuxだとskb)->DPDKにもmbuf相当のものがあるよ!

o線形リストになっている

oパケットの先頭や末尾にデータを追加、消去しやすいデータ構造

o参照数とかのカウントや受信ポート情報とかの情報も持つ

2016.8 seccamp2016 18

Page 19: Seccamp 2016 チューター成果報告

mbufとは

2016.8 seccamp2016 19

Page 20: Seccamp 2016 チューター成果報告

ただのNWプログラミングだとouint8_t[1600]みたいなのに先頭から詰めるのがよくある

oでも先頭にヘッダを追加したりしたい時は?

oいちいちコピーし直さないといけない!!

2016.8 seccamp2016 20

パケット

Page 21: Seccamp 2016 チューター成果報告

典型的なmbufの例

2016.8 seccamp2016 21

Page 22: Seccamp 2016 チューター成果報告

各プロトコル間やデバイスの管理

2016.8 seccamp2016 22

Page 23: Seccamp 2016 チューター成果報告

「C++でまとめる」..とはo伝統 ->リンクリストo今回 ->Vector

oリサイズでメモリ解放してくれなかったりもっといい手法があるかもだけどとりあえずこれで

oなるべくシンプルにすることが目標

2016.8 seccamp2016 23

Page 24: Seccamp 2016 チューター成果報告

ゼロコピーを実現

o各プロトコルモジュール間のデータ移動は線形リスト

oパケット管理はDPDKがある程度束縛するのでSTLと相性悪い

2016.8 seccamp2016 24

DPDKC++11

Page 25: Seccamp 2016 チューター成果報告

現状

oARP処理部分まで

o現状では完全ゼロコピー

oDPDKのチューニングとかでパフォーマンスは変わりそう

o現在はDPDKのラップとか設計ばかり

2016.8 seccamp2016 25

Page 26: Seccamp 2016 チューター成果報告

今後の展望

o組み替えたりチューニングしやすいように

oAPIの提供oデータプレーンを変えられる ->別HW…?

2016.8 seccamp2016 26

Page 27: Seccamp 2016 チューター成果報告

感想

oさらに知りたいことがたくさん見つかる

o昔は(使いやすい?)車輪を。今度は早くする工夫を

oパケット処理の高速化はたくさん方法がある◦処理を早くする◦ オフローディング◦ メモリアクセスを賢く◦ etc..

oどんどんレイヤが下がる一方

2016.8 seccamp2016 27

Page 28: Seccamp 2016 チューター成果報告

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

ありがとうございました

サイボウズ・ラボユース