# Service-Centric Networking
## 定義
Service-Centric Networking とは、ネットワーク通信の第一級の対象を固定ホストやインターフェースではなく、同一機能を提供するプロセス群として扱う設計思想である。Serval はサービス識別子(`ServiceID`)、通信フロー識別子(`FlowID`)、到達位置(IP アドレス)を分離し、トランスポート層とネットワーク層の間に Service Access Layer(SAL)を置く。これにより、サービスの初回解決を遅延束縛し、アドレス変更・レプリカ増減・フロー移行をアプリケーションから隠蔽する。(Source: [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]])
## 設計原則
- **役割の分離**: サービス名は「誰と通信するか」、`FlowID` は「どの通信コンテキストか」、IP アドレスは「どこへ届けるか」を表す。
- **遅延束縛**: サービス名からインスタンス・位置への束縛を接続開始時まで遅らせ、DNS キャッシュや事前設定による古い位置情報を避ける。
- **初回解決とデータ転送の分離**: 初回 SYN はサービスルータで解決し、確立後のデータはエンドポイント間で直接転送する。
- **サービスレベルの制御/データプレーン分離**: ユーザー空間のサービスコントローラがポリシーと解決を担い、SAL がサービス表に基づくパケット処理を担う。
- **フローの独立性**: フローをネットワークアドレスから切り離し、複数経路の追加とインターフェース間移行を SAL に集約する。
## 横断的知見
- **サービスを第一級の名前にする位置は、プロキシ方式より低い**: Serval の SAL はトランスポート層とネットワーク層の間でサービス名と `FlowID` を処理し、ネットワーク層は変更しない。一方、[[サービスメッシュ]] はサイドカープロキシをアプリケーションと組み合わせ、サービス間通信の発見・転送・可観測性をプロセス外へ分離する。両者は制御プレーンとデータプレーンを分けるが、Serval はホストネットワークスタックの識別子と移動性を再設計し、サービスメッシュはアプリケーション間の運用機能をプロキシへ移す。(Source: [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]], [[@2021__OReillyJapan__SREの探求 - Chapter 26 サービスメッシュはマイクロサービスの世話人か]])
- **ロードバランサーをデータ経路から外す設計は、機能を集約する方式と異なる**: [[スクリプタブルロードバランサー]] はシャード解決やサービスレベルロジックをプロキシへ集約するのに対し、Serval は初回 SYN のサービス解決だけをサービスルータへ渡し、後続データを直接転送する。前者は判断の一貫性とアプリケーションからの抽象化を得やすいが、後者は全パケット通過による帯域制約を避ける。(Source: [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]], [[@2021__OReillyJapan__SREの探求 - Chapter 25 スクリプタブルロードバランサー]])
- **名前の遅延束縛とフロー移行は別の機構だが、同じ識別子分離に依存する**: `ServiceID` の遅延束縛だけでは確立済み接続のアドレス変更に対応できない。Serval は `FlowID` をホスト内の不変な多重分離キーとして別に持つことで、サービスインスタンスの選択と確立済み通信の再同期を同じ SAL に接続する。(Source: [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]])
- **サービスルーティングはネットワーク層の上に置けるが、制御範囲はサービス表の配布方式で決まる**: Serval は階層型プレフィックス配布、DHT、ブロードキャスト、DNS 連携を同一のサービス表アクションへ写像する。したがって、サービス中心型という名前だけでは集中制御か分散制御かは決まらず、`FORWARD`・`DELAY`・`DEMUX` ルールを誰がいつ伝播するかが運用特性を決める。(Source: [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]])
## 未解決の問い
- 現代の暗号化トランスポート、QUIC、MPTCP、eBPF/XDP と `ServiceID`・`FlowID` を統合する場合、どの層がフロー移行と暗号状態の所有権を持つべきか。
- サービス識別子の登録権限、広域広告経路、自己証明識別子を組み合わせたとき、サービス乗っ取りと経路広告の不正をどの境界で検知・防止するか。
- 初回接続だけをサービスルータへ通す設計は、短命接続・大量の小パケット・サービス表更新頻度が高い環境で、現代の LPM・キャッシュ・SmartNIC 実装によりどこまでスケールするか。
- SAL のフロー移行は、経路変更に伴う RTT・帯域変化を輻輳制御へどう通知すれば、移行直後の過剰送信やテールレイテンシを避けられるか。
- Service-Centric Networking とサービスメッシュを同一ホストへ重ねた場合、サービス識別子、サービス発見、暗号終端、負荷分散、トレースコンテキストの責任境界はどう整理すべきか。
- 2012 年の Serval が提示したサービス中心型の抽象が、今日のコンテナ・クラウド・エッジ配置でどの程度実装され、どの要件がプロキシ層へ置き換わったのか。
## 関連
- ソース: [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]]
- システム: [[Serval]]
- 関連概念: [[サービスメッシュ]] / [[スクリプタブルロードバランサー]] / [[負荷分散]] / [[TCP接続局所性]] / [[エニキャストルーティング]]
- 関連 MOC: [[Network - MOC]]
## 出典
- [[@2012__NSDI__Serval An End-Host Stack for Service-Centric Networking]] — ServiceID・FlowID・SAL、サービスルーティング、サービスルータ、フロー移行、プロトタイプと実験結果。
- [[@2021__OReillyJapan__SREの探求 - Chapter 25 スクリプタブルロードバランサー]] — ロードバランサーへサービスロジックを集約する設計。
- [[@2021__OReillyJapan__SREの探求 - Chapter 26 サービスメッシュはマイクロサービスの世話人か]] — サービスメッシュのサイドカー、制御プレーン/データプレーン分離。