外部ネットワークのIPアドレスはARPテーブルに登録されるか [ColdFire V2]
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"のエントリも削除されてしまっていました。
今日の考察
- 外部ネットワークに接続してもARPテーブルには記録されない。
参考文献
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
>ルータの向こう側にある外部ネットワークのIPアドレスとルータのMACアドレスが関連付けられてもおかしくないはずです。
この発想はなかった…そんな実装あるんでしょうか?直に送れないのにARP引く実装なんて?
by xo (2008-10-10 07:33)
そうかそんな事しないか。そうだなぁ、確かに。
Navajo確認してみたら、確かに別のネットワークグループへの送信時は、自動的にデフォルトゲートウエイのMACアドレスを取得するようになっていました。勘違い。
でも、受信は何故かルーターの向うのIPアドレスも記録している。使わないのに、、、。直しとこう。
by hamayan (2008-10-10 09:46)