次はICMP応答だ

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

次にやりたいこと

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

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

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


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

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


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


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


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

どこまでできているか

つい先日までの実装で、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パケットの送出


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

マスタリングTCP/IP 入門編

マスタリングTCP/IP 入門編