ネットワークスタックの高速化を見ていく前に、TCPの入出力についてざっと把握しておいた方がいい。TCP受信時のFreeBSDにおける処理の流れは次のとおり。

  1. NICデバイス: データ受信
  2. カーネル: データ取得、リンクレイヤヘッダをデータから除く (ithread)
  3. カーネル: IPチェックサム検証、IPヘッダをデータから除く (netisr software ithread)
  4. カーネル: TCPチェックサム検証、TCPヘッダをデータから除く (netisr software ithread)
  5. カーネル: ソケットルックアップ (netisr software ithread)
  6. カーネル: セグメント再構築、ソケットへ配送 (netisr software ithread)
  7. カーネル: mbufs+clustersのデータをコピー (user thread)
  8. ユーザランド: ソケット経由でデータ受信 (user thread)

TCP受信時のハードウェア、カーネル、ユーザランド処理の流れ

TCP送信時の処理の流れは次のとおり。

  1. ユーザランド: ソケット経由でデータ送信 (user thread)
  2. カーネル: mbufs+clustersへデータをコピー (user thread)
  3. カーネル: データをTCPセグメントへと分割 (user thread)
  4. カーネル: TCPヘッダカプセル化、チェックサム生成 (user thread)
  5. カーネル: IPヘッダカプセル化、チェックサム生成 (user thread)
  6. カーネル: Ethernetフレームカプセル化 (ithread)
  7. NICデバイス: データ送信

TCP送信時のユーザランド、カーネル、ハードウェア処理の流れ

ithreadはカーネルの割り込みスレッドだ。