mones2/05.ICMP応答準備編 IPパケット送信


Top / mones2 / 05.ICMP応答準備編 IPパケット送信

これは何か

ICMP応答をするためにIPパケット送信の仕組みを作ります。

ここまでの成果

なし

動作について

QEMUで動作します。

  1. contrib_0.3Net/monesにsampleAppをおき、arptest で make && make install します。
  2. MonaNew/tool/mkimg で make して、ISOをつくります。
  3. QEMUでMonaを起動して、arptest を実行して、Windows側からpingを打つと動作します
  4. WindowsとQEMUのネットワーク連携については、Yamamiさんのまとめをご参照ください。

詳しい解説・資料

(IP)Internet Protocolについて調べています。
例のごとく、ネットワークの知識は皆無な実装のために調べたことをメモがてら書いていきます。
ネットワークの知識がある人から怒られそうですが(汗。

次にやりたいこと

MonaからICMPエコー応答を返したい。
ICMP(Internet Control Message Protocol)はIPと不可分のプロトコルで、IPのやり取りの途中で起こったエラーメッセージを運ぶ役割があります。

と小難しい話は横においておいて、ICMPでは受け取るメッセージに「ICMPエコー要求メッセージ」というものがあります。
これは何に使われるかというと、リモートのネットワークやホストに到達できるかどうかを調べるために使われます。

ホスト→(ICMPエコー要求)→どこか~

という流れで、ホストからICMPエコー要求して

ホスト←(ICMPエコー応答)←どこか~

とICMPエコー応答が返ってきます。
応答が返って来れば、到達可能ということになります。

あれこれどこかで出会ったことありますね。そう ping です。(白々しいな)
ping の中身はこういう実装になっているわけです。

ということなので次の目標は Mona が WindowsからのICMPエコー要求にICMPエコー応答を返すこととしようと思います。
つまり Windowsからの ping にMonaが応答するということになります。

実装詳細~

つい先日までの実装で、ARP応答、IPヘッダ受信、ICMPヘッダ受信までは実現しています。

IPヘッダはこんな感じの構造で

typedef struct{~
    byte  verhead;~
    byte  tos;~
    word len;~
    word id;~
    word frag;~
    byte  ttl;~
    byte  prot;~
    word chksum;~
    dword srcip;~
    dword dstip;~
    char  data[0];~
}IPHeader;~

ICMPヘッダは以下のような構造です。

typedef struct{~
    unsigned char  type;~
    unsigned char  code;~
    unsigned short chksum;~
    char    data[32];~
}ICMPHeader;~

IPHeaderのdata部に、ICMPヘッダが含まれている構造なっており、IPにICMPが含まれているということが分かるでしょう。
受信は簡単でパケットを受信後、ヘッダを解析するだけです。

次にやるべきことは何か?~

プロトコルの性質上、ICMPの応答をするということは IPのパケットを送ることを含んでいるので、まずはここから準備が必要そうです。
この手順がさっぱり分からないので調べてみると、大筋で以下の流れになりそうです。

  1. ルーティング解決(さっぱり分からん)
  2. ARPによるMACアドレス取得
  3. ICMPヘッダの作成
  4. IPヘッダの作成
  5. IPパケットの送出

まずはルーティング解決から調べてみます。

コメント

MENU

now: 5

リンク


最新の20件
2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-12-09 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3113, today: 2, yesterday: 0

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3680d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.021 sec.