web-dev-qa-db-ja.com

コンピューターが同じネットワーク内の別のコンピューターにIPパケットを送信する場合、そのホストの宛先MACアドレスをどのように知るのでしょうか。

スイッチは、特定の宛先MACアドレスを持つホストにイーサネットフレームを正確に転送できるため、ハブよりも優れていることを私は知っています。

ただし、2台のコンピューターが通信する場合、2台のコンピューターはIPアドレスを使用してパケットを送信します。

Cプログラム(サーバーとクライアント)を作成し、同じネットワーク上の1つのPCでサーバーを実行し、別のホストでクライアントを実行して通信を開始した場合(両方のIPを知っていると仮定)、どの程度正確に最初のコンピューターのNICは、宛先IPを持つコンピューターのNIC?

フレームには宛先MACが必要です。そうでない場合、すべての宛先MACはブロードキャストMACになります。

コンピューターが宛先MACアドレスを認識しないと、スイッチは(私が理解していることから)役に立たず、ホストが実際にIPアドレスを使用して通信する場合にホストがお互いのMACをどのように知っているのか理解できません。

1
yoyo_fun

Cプログラム(サーバーとクライアント)を作成し、同じネットワーク上の1つのPCでサーバーを実行し、別のホストでクライアントを実行して通信を開始した場合(両方のIPを知っていると仮定)、どの程度正確に最初のコンピューターのNICは、宛先IPを持つコンピューターのNIC?

IPv4を想定しましょう。 IPv6の場合、原則は似ていますが、詳細は異なります(ARPではなく近隣探索)。

まず、コンピュータはIPルーティングテーブルで宛先IPアドレスを検索します。これにより、「インターフェース」と「ネクストホップIPアドレス」がわかります。宛先がローカルサブネットにある場合、ネクストホップIPアドレスは宛先IPアドレスと同じになります(宛先がローカルサブネットにない場合、ネクストホップIPアドレスはゲートウェイのアドレスになります)。

次に、コンピュータはインターフェイスのARPテーブルでネクストホップIPアドレスを検索します。有効な宛先MACアドレスと一致するものが見つかった場合、パケットはすぐに送信できます。それ以外の場合、パケットはMACアドレスが使用可能になるまでキューに入れられます。

MACアドレスを検出するために、コンピューターはARP要求を送信します。 ARP要求はブロードキャストMACアドレスに送信されます。すべてが機能している場合、ネクストホップ(この場合は宛先)コンピューターはARP要求に応答し、コンピューターはそのarpテーブルにエントリを作成し、キューに入れられたパケットが送信されます。

ARP要求への応答がない場合、システムはパケットの送信をあきらめる前に有限回再試行する可能性があります。 OSによっては、あきらめたときにICMP宛先ホストの到達不能パケットを生成する場合と生成しない場合があります(Linuxは生成しますが、BSDは明らかに生成せず、Windowsについてはわかりません)。

ルーティングがどのように機能するかについてもっと知っています。基本的に(コンピューターのARPキャッシュにIPアドレスがなく、ネットワーク上のホストがarp要求パッケージに応答しない場合)、データを何らかのIPに送信したいホストは、パケットをデフォルトのゲートウェイに転送します(これはルーターである必要があります)、そのルーターはルーティングテーブルをチェックして、宛先IPが含まれているネットワークに接続されているポートを確認します。ネットワークがそのテーブルにない場合、ルーターは、ルーターがネットワークを認識するまで、独自のデフォルトルートに転送します。これは正しいです?

これは間違っています。宛先IPに一致する他のエントリがIPルーティングテーブルにない場合、デフォルトゲートウェイが使用されます。 ARPが失敗した場合は使用されません。 ARPが失敗した場合にデフォルトゲートウェイを使用すると、ルーティングループが発生する可能性が非常に高くなります。

3
plugwash