中級では、NICを「L2の住所付け(MACアドレス)とフレーム化」まで見ました。上級では視点を一段下げ、一枚のフレームが物理信号として届いてから、CPUのメモリに載り、上位ソフトへ渡るまでの内部の受け渡しを端から端まで掘ります。読み終える頃には、「なぜ高速回線ほど割り込みが敵になるのか」「なぜNICに計算を肩代わりさせるのか」「なぜ調査ツールがチェックサム不正と嘘をつくのか」が、すべて同じ1本の受け渡しの話として読めるはずです。
概要 — まず全体をつかむ
アニメーション『NIC(デジタル↔信号の変換)』を開く
詳細 — 1段階ずつ追う
① MACアドレスとイーサネットフレーム
中級の「宛先MAC・送信元MAC+データ」を、上級ではフレームの構造と末尾の誤り検出まで下ろします。
- 送信するデータの前にヘッダ(宛先MAC※1・送信元MAC・種別)を、後ろにFCS※2 を付けてフレームの形にする
- 宛先MACには、その回線に1台へ届けるユニキャストのほか、全員宛のブロードキャスト、特定グループ宛のマルチキャストがある
- 受信側NICは、まず宛先MACが自分宛(またはブロードキャスト等)かを見て、無関係なフレームはMAC層で捨てる
- 自分宛ならFCSを再計算して照合し、壊れていれば黙って破棄する。訂正はせず、再送は上位(TCP)に委ねる
登場人物メモ(※の説明):
- ※1 宛先MAC — 48ビットの機器固有番号。先頭側にベンダー識別子(OUI)を含み、同じ回線内で「どれに渡すか」を一意に指す
- ※2 FCS — Frame Check Sequence。フレーム全体から計算したCRC値。受信側で再計算して一致を見る、誤り検出専用の番人(訂正はしない)
⚠️ イレギュラー(正常系との違いが学びどころ):
- 無差別モード(プロミスキャス) — 通常は自分宛以外を捨てるが、この設定にすると全フレームを取り込む。パケットキャプチャはこれを使う
- 壊れたフレーム — FCS不一致は破棄されるだけで、送信元は「届かなかった」ことをここでは知らない。気づくのは上位の再送タイマ
やさしく言うと(中級)
NICは、デジタルと物理信号の境目であると同時に、L2(データリンク層)の住所付けを担います。0と1のデータを電気や電波の信号に変えるだけでなく、「近くの機器の中でどれに届けるか」を決めるのがMACアドレスです。
- 信号変換 — データ↔電気/電波の信号
- 住所付け — 送信元と宛先をMACアドレスで示す
- フレーム化 — データを送受信できる単位にまとめる
アニメーション『NIC(デジタル↔信号の変換)』を開く
登場人物メモ:
- ※1 MACアドレス — NICごとに割り当てられた48ビットの固有番号。同じネットワーク内で機器を見分ける
- ※2 フレーム — 宛先MAC・送信元MACとデータをまとめたL2の送受信単位
② 割り込み・DMA・リングバッファ
届いたフレームをどうやってCPUのメモリに載せ、CPUへ知らせるか。ここが受信性能の心臓部です。
- NICは受信フレームを、DMA※1 でCPUを介さず直接メインメモリへ書き込む。書き込む先はあらかじめOSが用意したリングバッファ※2 の空きスロット
- 置き終えたらNICは割り込み※3 でCPUに「届いた」と知らせる
- CPUは割り込みハンドラで、リングバッファに溜まったフレームを取り出し、上位(IPスタック)へ渡す
- 取り出して空いたスロットは、次の受信のためにNICへ返却(補充)する。リングは使い回される輪
登場人物メモ(※の説明):
- ※1 DMA — Direct Memory Access。周辺機器がCPUを介さずメモリを読み書きする仕組み。CPUはコピー作業から解放される
- ※2 リングバッファ — 受信用スロットを環状に並べた領域(ディスクリプタの列)。先頭と末尾を追いかけっこさせて、コピーなしで受け渡す
- ※3 割り込み — 機器がCPUの今の処理に割り込んで通知するハードの仕組み。応答は速いが、出入りに段取りコストがかかる
⚠️ イレギュラー(速さが仇になる):
- 割り込みライブロック — 高速回線で毎パケット割り込むと、割り込み処理の段取りだけでCPUが埋まり、実処理が進まない
- ポーリングへの切替(NAPI) — 最初の1回を割り込みのきっかけにし、以降は割り込みを止めてまとめて刈り取る折衷。低負荷では割り込みの速さ、高負荷ではポーリングの効率を取る
- リング溢れ — 取り出しが追いつかないとスロットが尽き、以降のフレームはNICで取りこぼす(ドロップカウンタが増える)
やさしく言うと(中級)
- 有線NIC — LANケーブルの口を持ち、Ethernet(イーサネット)の規格で電気信号をやり取り
- 無線NIC(Wi-Fi) — アンテナを持ち、電波でやり取り
- フレームを組む — データに宛先MACと送信元MACを付け、送信できる形にする
- リンクを合わせる — オートネゴシエーションで速度(1Gbpsなど)と全二重かを相手とすり合わせる
送信時はデータをフレームに包み、受信時は宛先MACが自分宛かを見て、自分宛だけを取り込みます。
③ オフロードと受信側スケーリング
CPUの負担を下げるため、定型作業をNIC側の回路に肩代わりさせます。これがオフロードです。
- チェックサムオフロード — IP/TCPのチェックサム計算・検証をNICが行う。CPUは全バイトを舐めずに済む
- TSO/LRO — 送信時、大きな塊をNICがMTU※1 サイズのフレーム群へ分割するのがTSO。受信時、細切れフレームをNICが1つの大きな塊へ束ねて渡すのがLRO。どちらも1パケットあたりのCPU手間を減らす
- 受信側スケーリング(RSS) — 複数のリングバッファを用意し、フローごとに別々のCPUコアへ割り当てて並列に処理する。1コアが受信で飽和するのを防ぐ
登場人物メモ(※の説明):
- ※1 MTU — Maximum Transmission Unit。1フレームに載せられる最大サイズ。イーサネットは標準1500バイト。これを超えるデータは複数フレームに刻む必要がある
⚠️ イレギュラー(肩代わりの副作用):
- キャプチャが嘘をつく — チェックサムはNICが送出直前に埋めるため、手前で覗くツールには「未計算=不正」に見える。実回線上は正しい
- LROとルーティングの相性 — 受信で束ねてしまうと、そのまま転送する機器では都合が悪いことがある(束ねた塊をまた刻み直す羽目になる)
- オフロードのバグ — 特定のNIC・ドライバでオフロードが誤動作すると、原因が上位ソフトに見えて切り分けが難しい。疑うときは一時的に無効化して比較する
やさしく言うと(中級)
住所が2種類あるように見えて、役割が違います。
- MACアドレス — 機器そのものに付いた固有の番号(近所での見分け・L2)
- IPアドレス — ネット上の住所(遠くまで届けるための宛先・L3)
- 全二重 — 送信と受信を同時に行える方式。今の有線Ethernetでは標準
- オフロード — チェックサム計算などをNIC側で肩代わりし、CPUの負担を減らす機能
- ドライバ — NICをOSから使えるようにする橋渡しのソフト
近くではMAC、遠くへはIP、と使い分けられます。IPで最終目的地を、MACで次に渡す隣の機器を示す、という重ね方です。
④ PHYとMACの役割分担
NICは1枚に見えて、内部は信号を扱う層とフレームを扱う層に分かれています。
- PHY(物理層) — ビット列を電気・光・電波の信号へ変調して載せ、受信では信号からビットを復調する。ケーブルや電波との境目そのもの
- MAC(データリンク層) — フレームの組立・宛先MAC判定・送受信のアクセス制御(いつ送ってよいか)を担う。①②で見た仕事はここ
- 両者のつなぎ目 — PHYとMACはMII系のインターフェースで結ばれ、速度規格(100M/1G/10G…)は主にPHYと相手との取り決め(中級で見たオートネゴシエーション)で決まる
登場人物メモ(※の説明):
- ※1 変調/復調 — デジタルのビットを、送れる形の物理信号に変える/戻す操作。何をどう変調するかが速度規格の中身
⚠️ イレギュラー(層をまたぐ切り分け):
- リンクは上がるのに通信できない — PHY同士はつながった(リンクアップ)が、MAC以上(速度・全二重の食い違いなど)で不整合、という切り分けが要る場面
- 速度が出ない — ケーブル品質やPHYの劣化で、規格上の最高速へ上がりきらずに落ちることがある(オートネゴシエーションが安全側へ倒れる)
⚠️ 上級の落とし穴
受信の内部が見えると、次のような詰まりどころが同じ絵の上で読めます。
- 割り込み過多を見落とす — 高速回線ほど毎パケット割り込みが害になる。NAPI/割り込み合体(interrupt coalescing)で通知をまとめるのが定石
- コピーコストの軽視 — DMAでメモリには載っても、そこから上位へ何度もコピーするとCPUを食う。ゼロコピー系の工夫はこの重複コピーを削る
- オフロード副作用の誤診 — チェックサム不正表示やLROの束ねを「異常」と早合点しない。切り分けは一時無効化して比較する
- リングサイズの当てずっぽう — 溢れて取りこぼすなら増やす、というだけでなく、大きすぎれば遅延(バッファ膨張)を招く。捨てている数(ドロップ)を見て釣り合わせる
- 「NICは速いから大丈夫」という過信 — 物理速度が出ても、割り込み・コピー・1コア集中がボトルネックになれば実効速度は伸びない。速さは回線だけでなく受け渡しの設計で決まる
まとめ——NICの中では、フレーム(宛先判定とFCS)/DMAとリングバッファ(どうメモリへ載せCPUへ渡すか)/割り込みとポーリング(いつ知らせるか)/オフロード(何を肩代わりさせるか)/PHYとMAC(信号とフレームの分業)という何段もの受け渡しが連なっています。速さも、CPU負荷も、そして調査時の勘違いも、すべてこの受け渡しの上で起きている——ここまで見えれば、スイッチ・ルータ・高速サーバの通信設計は、同じ受け渡しをどこで束ね、どこへ分散するかの応用として読めるようになります。
やさしく言うと(中級)
- ドライバの不調 — NICを動かすソフト(ドライバ)が古い・壊れている
- オートネゴシエーションの失敗 — 速度や全二重が合わず、遅い・不安定になる
- 無効化されている — 設定でNICがオフ
- 相性・故障 — 有線が挿さっているのに認識しない、など
関連する知識
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. チェックサムオフロードを有効にしたのに、キャプチャツールで自機の送信パケットを見ると「チェックサム不正」と表示された。最も妥当な解釈はどれ?
問2. 受信のたびにNICがCPUへ割り込みをかける素朴な方式が、高負荷時にかえって性能を落とす(割り込みライブロック)根本原因はどれ?
問3. イーサネットフレームの末尾に付くFCS(フレームチェックシーケンス)を、受信側NICはどう扱うか?
問4. TSO(TCPセグメンテーションオフロード)が肩代わりしているのは、次のどれか?
問5. 「PHYとMACの役割分担」の説明として最も正確なのはどれ?
問6. 受信時に、細切れで届いた複数のフレームをNICが1つの大きな塊へ束ねてからCPUへ渡す機能はどれ?
問7. 複数のリングバッファを用意し、フローごとに別々のCPUコアへ割り当てて受信処理を並列化する仕組みはどれ?
問8. NICが受信フレームを、CPUを介さず直接メインメモリへ書き込む仕組みを英字3文字で答えてください。