パケット受信 (Packet Reception)
アドレス解決パケットを受信したとき、受信側のイーサネットモジュールはパケットをアドレス解決モジュールに渡し、そのモジュールは以下のようなアルゴリズムを実行します。否定条件は処理の終了とパケットの破棄を示します。
?ar$hrdに指定されたハードウェアタイプを持っているか?
はい: (ほぼ確実に)
[オプションでハードウェア長ar$hlnをチェック]
?ar$proに指定されたプロトコルを使用しているか?
はい:
[オプションでプロトコル長ar$plnをチェック]
Merge_flag := false
<プロトコルタイプ, 送信者プロトコルアドレス> ペアが
既に変換テーブルに存在する場合、
エントリの送信者ハードウェアアドレスフィールドをパケット内の新しい情報で更新し、
Merge_flagをtrueに設定する。
?自分がターゲットプロトコルアドレスか?
はい:
Merge_flagがfalseの場合、三つ組 <プロトコルタイプ,
送信者プロトコルアドレス, 送信者ハードウェアアドレス> を
変換テーブルに追加する。
?オペコードはares_op$REQUESTか? (ここでオペコードを確認!!)
はい:
ハードウェアフィールドとプロトコルフィールドを交換し、
ローカルのハードウェアアドレスとプロトコルアドレスを送信者フィールドに入れる。
ar$opフィールドをares_op$REPLYに設定する
リクエストが受信されたのと同じハードウェア上で、
パケットを (新しい) ターゲットハードウェアアドレスに送信する。
<プロトコルタイプ, 送信者プロトコルアドレス, 送信者ハードウェアアドレス> の三つ組は、オペコードが確認される前にテーブルにマージされることに注意してください。これは、通信が双方向であるという仮定に基づいています; AがBと通信する理由がある場合、BもおそらくAと通信する理由があるでしょう。また、<プロトコルタイプ, 送信者プロトコルアドレス> ペアのエントリが既に存在する場合、新しいハードウェアアドレスが古いものに優先することにも注意してください。関連する問題 (Related Issues) では、これに対する動機を説明しています。
一般化: ar$hrdとar$hlnフィールドにより、このプロトコルとパケットフォーマットは10Mbitイーサネット以外でも使用できるようになります。10Mbitイーサネットの場合、<ar$hrd, ar$hln> は値 <1, 6> を取ります。他のハードウェアネットワークの場合、ar$proフィールドはもはやイーサネットタイプフィールドに対応しない可能性がありますが、アドレス解決が求められているプロトコルに関連付けられているべきです (should)。