BPFパケットキャプチャはどこからデータを読み取るのですか?

BPFパケットキャプチャはどこからデータを読み取るのですか?

私はネットワークパケットへの低レベルのインターフェイスに興味があります。私が理解しているように、tcpdumpやlibpcapなどのツールはBPFパケットフィルタリングデバイス/ dev / bpf *を使用してリンク層ネットワークパケット(Mac OS XとFreeBSDで)を読み込みます。

ところで、/dev/bpf*のデータはどこから来るのでしょうか?下から上から始めると、まずハードウェアネットワークカード(Wi-Fiの電波)からデータを読み込みます。その後、ネットワークカードドライバはこれらのパケットを読み取り、それをカーネルに提供します。たとえば、私のコンピュータでは、ネットワークカードはAirport Brcm_4331で、そのドライバはIOREgに「com.apple.driver.AirPort.Brcm4331」と表示されています。しかし、ソケット層で見たり、ifconfigを使ってみると、ネットワークインタフェースは「en0」と呼ばれます。これは、bpfパケットキャプチャAPIを使用するときに提供するインターフェイス名でもあります。

それでは、Airport Brcm_4331カードの実際のドライバと通常の「en0」インタフェースの違いは何ですか?

私の考えでは、ネットワークカードドライバ自体が生のパケットを読み取ることができる一般的なインターフェイスを提供しているようです。これにより、ハードウェア(物理層、Wi-Fi)からパケットを読み取り、デバイスに依存しない方法でデータリンク層(イーサネット)のパケットを読み取るためのいくつかの標準機能が提供されます。これがいわゆる「en0」インタフェースです。その後、bpfは「en0」インタフェースからデータを読み込み、そのデータを/ dev / bpfファイルに書き込み、Unixファイルに似たインタフェースを提供します。

そうですか?それでは、bpf APIを使用せずにドライバと直接対話するコードを書くことはできますか?このアイテムのドキュメントを見つけるのは難しいので、このレベルでは本当に混乱しています。実際のドライバと対話する方法を説明せずに、高度なUnix API(rawソケット、libpcap、bpf)のみを議論することがよくあります。

ベストアンサー1

おすすめ記事