世界を動かす技術を、日本語で。

全Linuxネットワークスタック図(2024)

概要

Linuxネットワークスタック全体の構成要素と最適化ポイントを解説。 仮想化やLinuxコンテナ、ネットワークソケットからデバイスドライバまで網羅。 各層ごとに最適化や統計取得のヒントを紹介。 Ericsson Nikola Teslaによる図解資料の内容を要約。 参考文献:『Operativni sustavi i računalne mreže - Linux u primjeni』。

Linuxネットワークスタック全体図の解説

  • Linuxネットワークスタック の全体構成図
  • 仮想化 および Linuxコンテナ のサポート
    • エミュレーションパラバーチャライゼーション の技術
  • ネットワークソケット の役割
  • ネットワークスタック上位層
    • TCP および UDP プロトコルの処理
  • ネットワークスタック下位層
    • GRO (Generic Receive Offload)、 RPS (Receive Packet Steering)、 RFS (Receive Flow Steering)、 GSO (Generic Segmentation Offload)の利用
  • ネットワークスケジューラ によるパケット処理の最適化
  • NetFilter および トラフィック制御 機能
    • Bridge インターフェース、 Bond インターフェースの実装
    • Tapインターフェース などの仮想ネットワークデバイス
  • デバイスドライバ層
    • キュー 管理、 NAPI (New API)、 IRQハンドラ
  • NICによるネットワーク機能のハードウェアオフロード
    • Checksum offloadVLANVxLANGRETSO (TCP Segmentation Offload)、 LRO (Large Receive Offload)、 RSS (Receive Side Scaling)
  • ネットワークカード 自体の役割
  • 各層での 最適化ポイント統計情報取得 のヒント

各層の最適化・統計取得のヒント

  • 仮想化/コンテナ
    • オーバーヘッド削減のため パラバーチャライゼーション 推奨
    • ネットワークネームスペース 利用による隔離性向上
  • ネットワークソケット
    • SO_REUSEPORT オプションでスケーラビリティ向上
    • 非同期I/O の活用による遅延削減
  • 上位プロトコル層(TCP/UDP)
    • TCPウィンドウサイズバッファ設定 の最適化
    • UDPバッファ の監視と調整
  • 下位プロトコル層(GRO/RPS/RFS/GSO)
    • GRO/GSO でパケット分割・結合の効率化
    • RPS/RFS でマルチコア最適化
  • ネットワークスケジューラ
    • qdisc(キューイングディシプリン) の選択とチューニング
  • NetFilter/トラフィック制御
    • iptables/nftables ルールの最小化でパフォーマンス向上
    • tc コマンドによる帯域制御
  • デバイスドライバ層
    • NAPI による割り込み負荷の軽減
    • IRQバランス の最適化
  • NICオフロード機能
    • ethtool で各種オフロード設定の有効化
    • ハードウェアVLANタギング の活用
  • 統計情報取得
    • /proc/net/devethtool -S でインターフェースごとの統計確認
    • nstatss コマンドによる詳細なネットワーク統計

参考文献・資料

Hackerたちの意見

何年もLinuxを使ってきたおかげで、スタックのほとんどに詳しいことに気づいて驚いてる。正式な勉強はしてないのにね。

こういうドキュメントがもっと必要だよね。IPテーブルを使うのに何年も苦労したし、本も買ったし、ブログからレシピをコピーしたけど、全然理解できなかった。やったことは全部脆弱だった。やっとカーネル内でパケットの流れを示す図を見つけて、各ルールチェーンが適用される順番や、どこでsysctlの値が強制されるかが分かったんだ。そしたら、やりたいことを正確に実現するルールを書けるようになったし、同じ動作をするけどパフォーマンスに違いが出るルールの間で賢く選べるようになった。図を勉強したら、どれも一発でうまくいくようになったよ。いい図があると全然違うね!

これのこと? https://en.wikipedia.org/wiki/File%3aNetfilter-packet-flow.s...

図を共有してくれない?iptablesについてもっと知りたいんだ。

それ、めっちゃいいね!もし誰かがこういう図を自動生成する可視化ツールをプログラムできたら、もっとすごいと思う(でも、たぶん無理なミッションだね)。

興味がある人のために、この図の作者はLinuxのディスクI/Oの図も作ってるよ(https://zenodo.org/records/15234151)。これらの図は彼の本「Operativni sustavi i računalne mreže - Linux u primjeni」からのものだよ(https://zenodo.org/records/17371946)。素晴らしくて寛大な作者の仕事に感謝!

この本の英語版ってあるか知ってる?

ディスクI/Oの図は素晴らしいね、シェアしてくれてありがとう。

これがVM上のパラバーチャル化されたネットワークを考慮しているかは分からないけど、VMwareの「仮想」ハードウェアアクセスのことね。自分は数年経ってるから、もしかしたらVMセクションでカバーされてるかも。素敵な図、シェアしてくれてありがとう!

図をSVG形式で見られる可能性はある?今はPDFに埋め込まれてるだけで、すごく読みづらいんだ。

埋め込みPDFビューアの下にある「ダウンロード」をクリックすれば、PDFが手に入るよ。

Linuxカーネルマップもいいよね。 https://commons.wikimedia.org/wiki/File:Linux_kernel_map.png

コンテナの場合、VMの図に示されているのと同じように、自分専用のTCP/IPスタックが必要になるよ。これは、コンテナがslirp4netnsを使ってネットワーキングを提供する時に行われるんだ。別の方法としては、カーネルのTCP/IPスタックを使うこともできて、これはpastaをネットワーキングに使う時に行われるよ。このページの図に詳しいことが載ってるよ: https://passt.top/passt/about/.

Linuxのユーザースペースネットワーク管理オプションのマップについて、何かおすすめある?