SSブログ

外部ネットワークのIPアドレスはARPテーブルに登録されるか [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

ARPテーブルには、外部ネットワークのIPアドレスも並ぶのか、調べました。

HTTPクライアントを作る

ARPテーブルは、IPアドレスとMACアドレスを関連付ける表です。 そのため、ルータの向こう側にある外部ネットワークのIPアドレスとルータのMACアドレスが関連付けられてもおかしくないはずです。 もし、外部ネットワークのIPアドレスがARPテーブルに登録されるとしたら、ARPテーブルはあっという間にパンクするでしょう。 外部ネットワークがARPテーブルに登録されるかどうか、確認する必要があります。

これを確認するためには、付録基板から外部ネットワークに接続するクライアントが必要になります。 ここは、ひとつ、HTTPクライアントでもつくってみますか。 以下のプログラムを"http"というファイルとして保存しました。

get(char *name){
  char soc;
  long stat;
  long server;
  char *command;
  long n;
  char *getBase="GET / HTTP/1.0\r\nHost:";
  char *buf;
  
  buf=MemoryAlloc(256);
  command=MemoryAlloc(StrLen(getBase)+StrLen(name)+16);
  StrCpy(command, getBase);
  StrCat(command, name);
  StrCat(command, "\r\n\r\n");
  do {
    server=GetHostByName(name);
    if (server==0){PrStr("%% Server?\r\n");break;}
    GetNetLine(0,0,0,0);
    soc=CreateSocket(1);
    if (soc<0){PrStr("%% Soc?\r\n");break;}
    do {
      PrStr("%% Connect HTTP server ");PrStr(name);
      PrStr("\r\n");
      stat=Connect(soc,server,80);
      if (stat<0){PrStr("%% HTTP?\r\n");break;}
      PrStr("%% GET request\r\n");
      stat=Write(soc,command,StrLen(command));
      if (stat<0) break;
      stat=WaitWriteComplete(soc);
      if (stat<0) break;
      for(n=0;n<15;n++){
        stat=GetNetLine(soc,buf,255,100);
        if (stat<0) break;
        PrStr(buf);PrStr("\r\n");
      }
    } while (0);
    PrStr("%% Close\r\n");
    CloseSocket(soc);
    GetNetLine(0,0,0,1);
  } while (0);
  MemoryFree(command);
  MemoryFree(buf);
}

このプログラムの原案は、masatoさんの記事にあったHTTPサーバです。 引数で与えられたホストのHTTPサーバに接続し、ルート・ページの最初から15行を表示します。

ネットワーク内で確かめた

最初は、ネットワーク内のHTTPサーバに接続します。 ターゲットは、別の付録基板です。

arp::show
192.168.1.102  00-1f-e8-49-**-76
192.168.1.1  00-15-c5-5b-**-38

OK
http::get("192.168.1.105")
%% Connect HTTP server 192.168.1.105
%% GET request
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 409

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>トップページ</TITLE></HEAD>
<BODY><CENTER>
<H1><FONT size="6" face="Arial Black">インターフェース ColdFireボード</FONT></H1>
<BR><H2><A href="netconfig.htm">ネットワーク設定</A></H2>
<BR><H2><A href="accel.htm">加速度センサー</A></H2>
<BR><H2><A href="port.htm">ポート操作</A></H2>
</CENTER></BODY>
%% Close

OK
arp::show
192.168.1.102  00-1f-e8-49-**-76
192.168.1.1  00-15-c5-5b-**-38
192.168.1.105  00-1f-e8-49-**-bf

OK

"192.168.1.1"は、コンソール兼ルータとして使っているPCです。 HTTPサーバに接続すると"192.168.1.105"のエントリが追加されたのがわかります。

外部ネットワークで確かめた

それでは、いよいよ外部ネットワークに接続します。 ターゲットは、"www.yahoo.com"にお願いしました。

http::get("www.yahoo.com")
%% Connect HTTP server www.yahoo.com
%% GET request
HTTP/1.1 200 OK
Date: Thu, 09 Oct 2008 13:22:50 GMT
P3P: policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"
Cache-Control: private
Vary: User-Agent
X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
Last-Modified: Thu, 09 Oct 2008 13:20:34 GMT
Accept-Ranges: bytes
Content-Length: 9554
Connection: close
Content-Type: text/html; charset=utf-8

<html>
<head>
<title>Yahoo!</title>
%% Close

OK
arp::show
192.168.1.102  00-1f-e8-49-**-76
192.168.1.1  00-15-c5-5b-**-38

OK

ご覧のように、ARPテーブルには、"www.yahoo.com"のエントリは追加されていません。 油断していたら、"192.168.1.105"のエントリも削除されてしまっていました。

今日の考察

  1. 外部ネットワークに接続してもARPテーブルには記録されない。

参考文献

Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(2)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 2

xo

>ルータの向こう側にある外部ネットワークのIPアドレスとルータのMACアドレスが関連付けられてもおかしくないはずです。

この発想はなかった…そんな実装あるんでしょうか?直に送れないのにARP引く実装なんて?


by xo (2008-10-10 07:33) 

hamayan

そうかそんな事しないか。そうだなぁ、確かに。

Navajo確認してみたら、確かに別のネットワークグループへの送信時は、自動的にデフォルトゲートウエイのMACアドレスを取得するようになっていました。勘違い。

でも、受信は何故かルーターの向うのIPアドレスも記録している。使わないのに、、、。直しとこう。

by hamayan (2008-10-10 09:46) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。