web-dev-qa-db-ja.com

NICカード(物理層)からルーティング(OSPF / RIP / BGP)デーモンにルーティングプロトコルパケットがどのように到達(操作のフロー)しますか?

問題は、複数のルーティングプロトコルデーモンが実行されているLinux/UNIXデバイスでルーティングプロトコルパケットフローを再構築することです。

NICカード(物理層)からルーティング(OSPF/RIP/BGP)デーモンにルーティングプロトコルパケットがどのように到達するか(操作のフロー)?

3
mav_2k

話しているカーネルを指定していません。
BSDの観点からは、すべて TCP/IP Illustrated、Volume 2:The Implementation By Gary R. Wright、W。Richard Stevens で説明されています。

短いバージョンは次のとおりです。

  1. フレームはNICのrx記述子リングに到着します。 DMA)を介して、RAMのRXリングに転送されます。
  2. ドライバーは、RXリング内のデバイス固有の記述子をある種の一般的なネットワークカーネル構造に変換します(例:mbuf/mbuf_clusterまたはsk_buff)。また、ここでパケットは bpf デバイスにコピーされます。
  3. ether_inputでは、フレームのプロトコルとアドレスファミリに応じて、対応するprotosw(プロトコルスイッチ)配列エントリによって処理されます。
  4. 次に、ip_inputまたはtcp_input/udp_inputのデータグラムが、対応するルーティングデーモンのso_rcvbuf(ソケット受信バッファー)のソケットレイヤーに到着した後。
  5. この時点から、ルーティングデーモンは通常、何らかのI/O通知機能( select(2) / poll(2)を介してソケット上の保留中のデータについて通知を受けます。 ) / epoll(7) / kqueue(2) )および使用 そのソケットでrecv(3) を実行して、パケットのペイロードを抽出します。ここでは、(e)glibc/libc/libSystemが代わりに使用されます。
  6. ルーティングデーモンはそれを魔法のように行い、ルーティングソケット(BSD派生物の PF_ROUTE または PF_NETLINK の)を介してカーネルのルーティングテーブルを変更します LinuxではNETLINK_ROUTE
11
SaveTheRbtz

ルーティングデーモンとスイートは、カーネル内のルーティングテーブルを操作します。したがって、パケットはルーティングデーモンを通過せず、ルーティングテーブルに従ってルーティングされます。

ルーティングテーブルに同じ特異性の選択肢が2つある場合(最も具体的なルートが常に優先される)、どちらのルートが優先されるかについては、metricが最も良い(最も低い)方がどちらかです(routeを参照)。シスコでは、土地は「 アドミニストレーティブディスタンス 」と呼ばれます。 RIPやBGPなどのさまざまなプロトコルには、デフォルトのメトリックがあります。 Linux固有の参照があるかどうかはわかりませんが、アドミニストレーティブディスタンスリンクを見ると、ルーティングデーモンが同じ優先度を使用していると思います。

ルーティングプロトコルパケット自体に関しては、ルーティングプロトコルに依存しますが、通常は標準のトランスポートプロトコルを使用します。たとえば、BGPはポート179でTCP/IPセッションを使用します。したがって、デーモンはそれに応じてソケットをバインドするだけです。

8
Kyle Brandt