Linuxネットワーク処理の概要
自分の検証計画のために Linux Network Stackの用語の繋がりの今の理解(当て推量)をまとめた
FreeBSD(netmap, VALE)も面白そうだけどここじゃない。いつか。
TODO
ここを元に(わからんこと・予想がついてること)の検証リストを作る
そして stacktrace/code reading
https://linux-kernel-labs.github.io/refs/heads/master/_images/ditaa-528948c80a3fd78b89fb6f7bd69503a58b93a4ae.png
上の図もたぶん正確じゃない
でも、この図の routing に rules, vrf, netfilter がいると思っておけば使うだけなら大外れはしなそう: 要検証
他の資料
上には書かれてないけど各オブジェクト(インタフェース・arpテーブルなど)は namespace で分離されてる
ルーティング(Routing)
L3機能を持つデバイス
テーブルに対応する
ネットワークデバイスのマスターに指定できる
通常はデフォルトVRF(main)がマスターになっている
default なるのもいる
bridgeデバイス(L2)をマスターに指定できる
ソケットもVRFに所属する
通常はデフォルトVRFに所属する
パケット送信は所属VRFから
実際にはその前にRulesを使ったポリシーベースルーティングが行われる
モケット受信は所属VRFに所属するインタフェース経由
カーネルパラメータで全てのVRFに所属するインタフェース経由で受信させられる
net.ipv4.tcp_l3mdev_accept=1
net.ipv4.udp_l3mdev_accept=1
net.ipv4.raw_l3mdev_accept=1
宛先以外でルーティングする
ソケットから出ていく時は最初(namespaceの次)に判断されてそう: 要確認
Netfilterとの関わりはどうなるか理解できてない: 要確認
フィルタリング
パケット処理の各フェーズに処理を挟むフレームワーク
https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Netfilter-components.svg/2560px-Netfilter-components.svg.png
フックポイントは下の図
https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Netfilter-packet-flow.svg/2560px-Netfilter-packet-flow.svg.png
Firewall, NAT, QoS, 監視 などの実装に使われる
解説記事
Neighbor table(arp table)
IP -> mac の変換やってるやつ
たしかにフックが登録されていた
L3で受信できる必要があるはず
vrf/namespace のどちらかに所属
bridgeに所属するインタフェースでは対応不可
bridgeについたアドレスだと arp 動く?: 要検証
ネットワークデバイス
RX/TX のリングバッファを持つ
received/sent で割り込み(IRQ)を行う
仮想インタフェース
L2, L3インタフェース
Tx/Rxパケット・フレームをユーザープロセスで処理できる
いろいろ
vlan, macvlan, bridge, bonded interface, team device, vxlan, ipvlan, macvtap, ipvtap, veth, nlmon, dummy, netdevsim
bridge
arp対応、IPアドレス割り当てなどやらなくなる
FDBを持っていそう(net/bridgeで実装、net/ipv4/nexthop.cで使われてそう): 要検証
ネットワークデバイスに設定されるトラフィックコントローラ
カーネル内ネットワーク(AF_NETLINK)経由でいろいろ制御する
使い方は通信先ごとにある
ソケット
基本的にプロセスはソケット経由で通信を扱う
ここまでに例外ばかり出てきたけど
インターネットでは AF_INET, AF_INET6 などを使う
AF_INET ではネットワークレイヤを直接扱える
イーサフレームとかは見えない
AF_PACKETだとイーサフレームがみえる
Linux Network Stackの拡張や外側
いろんな目的で拡張したり置き換えられたり連携したりがある
柔軟なネットワーク制御
高速なパケット処理
ハードウェア・オフロード
Linux Network Stackオーバーヘッド削減
仮想化オーバーヘッド削減
実用的な並列化
ユーザープログラムの利用 in/as ネットワークスタック
目的や効果
柔軟なネットワーク制御
高速なパケット処理
ハードウェア・オフロード
Linux Network Stackオーバーヘッド削減
eBPF プログラムをNIC, device driver, network stack の先頭で実行することで高速処理
対象外のパケットを Linux Network stack に委譲できる (XDP_PASS)
コードは小さくなる
カーネル内VMで実行
安全のため評価器を通過する
制限がいくつかある
e.g. ループ数固定、配列要素アクセス前検査コード必須、関数は inline or tail call、命令数制限など
AF_XDP を使うとアプリケーションに渡せる like SOCK_RAW ドライバは polling してるユーザープロセスに直接通信を見せる
Linux Network stack を経由しないので全てを実装しないとならない
ぜんぜん理解してない
いろいろなところで使われている
解説記事があった
ハードウェアとの連携
並列処理
RSS
みんな読んでる
読んでないのは俺だけ
デバイスで受け取ったパケットを分散させる
処理するCPU/コア/ソフトウェアが偏るとスケールしない
正しく分散させないとセッションを壊したり不都合が生じる
ほかに
仮想化のオーバーヘッド削減
PCI expressの拡張仕様
複数の仮想マシンでIOデバイスを共有できる
ハードウェア・オフロード
最近のNICは賢いだけでなくCPU積んでたりもするんだって
XDPも対応NICなら外に出せる
TSO: TCP Segmentaiton Offload(TXサイド)
LRO(RSC): Large Receive Offload (Receive Side Coalescing)(RXサイド)
Linux Network Stackの外側・連携
通信はデータプレーン、コントロールプレーンがある
データプレーンなモジュール・ミドルウェア
DPDK利用高速パケット処理
パケット処理にベクトル処理(SIMD命令)を使う高速ネットワーク実装らしい
FreeBSDをポートしたTCP/IPスタック
いろんなところで使われている仮想スイッチ
コントロールプレーンなミドルウェア
有名実装
データプレーンはLinux
VPPも追加されたらしい
VyOSが使っている