ユビキタスネットワークはじめに前回説明したIPフォワーディングはルーティングテーブルを参照して宛先情報をもらうというとても簡単なものだった。この簡単さゆえに少し不親切なぶぶんがあるという。これを解消しようとして生まれたのがICMP。制御で構成されている。IPの上位概念として存在しているので、IPヘッダの後ろにICMPメッセージという形でくっつく。ICMPメッセージ4バイトで構成されるもの。各ビットの役割分担をまずは紹介。0~7bit:タイプ8~15bit:コード16~31bit:チェックサムこんな感じ。これ以降のデータグラムにはタイプやコードごとに異なるデータが格納される。次に、エラー通知や制御についてひとつずつ説明していく。宛先到達不可タイプ:3コード:1~1532bit以降は使わない一過性でない(どんなに試してみてもダメな)エラーによって発生する。IPデータグラムの紛失をIPヘッダ(クライアントが送信したもの)8バイトという形で返してくれる。宛先までデータグラムが送信されない時に発生する。次のノードが不在(ARP応答がない)などが考えられる。この機能がないと、クライアントは存在しない相手に永遠にデータを送り続けてしまう。宛先ノードまでは行ける。そこで設定したプロトコルが動かない(プロトコル到達不可)、またはサーバーが動かない(ポート到達不可)場合に発生する。Discovery問題背景ルータ同士がWLANでつながっている場合を考える。本来、UDPでは1500byteまでデータを送信することができる。WLANではLLC(8byte)をくっつける必要があるので、実質1492byteまでしかデータを送れない。このネットワークにIPヘッダ20byte、データ1480byteを流そうとする場合、ルータ部分でフラグメントする必要がある。これにより、フラグメントしなければならない1492byte以上のパケットが流れてきた場合、ルータ部分でそのパケットを捨てるようになる。何が問題なのかというと、クライアント側はDFフラグが立っていることを知らないことだ。DFフラグが立っていること・パケットが捨てられたことを伝える処理をしないとクライアントは永遠にパケットを送り続けてしまう。解決方法この問題を解決するために、ルータでパケットが破棄されたと同時にICMPメッセージがクライアントに送られるようになっている。この時のICMPメッセージには48~63bit:ルータを通れるパケットの大きさ(MTU)が入っている。これを受けたクライアントは、次の通信からMTUを超えないサイズでIPデータグラムを送るようになる。Discoveryと呼ぶ。エコー要求・応答/ping各パラメータの値はタイプ:8(要求)/0(応答)コード:03、4byte目には識別子とシーケンス番号となっている。確認することができる。同じデータを持つノードがエコー応答を送信元に送信この2ステップで自分と特定ノードの間にあるルータを確認できる。レコードルートオプションを設定することで、最大9個まで特定ノード間のルータを確認することができる。(特定アドレス名)"と入力したら、特定アドレスまでのルータのIPアドレスが出力される。学内で実行してみた結果を載せておく。3msこれを見ると、学内サーバまでは一つのルータを経由していることがわかると思う。出力されるIPアドレスは各ルータの出口側のインターフェースのもの。同じIPアドレスが並んでいるということは、そこで折り返しているということだ。各パラメータは以下の通り。タイプ:11コード:0(途中でTTLが0になった場合)/1(宛先で時間経過)IPデータグラムのTTLが0になると、パケットを捨ててICMPメッセージをクライアントに送信する。TracerouteTTLを1から1ずつ増やしながら、UDPを送信。ポート番号にはめちゃくちゃな値を入れておく。目的地につかないうちは時間超過のICMPが返ってくる目的地についたらポート到達不可のICMPメッセージが返ってくるつまり、最終的に目的アドレスまでのルータ経由数が確認できるというわけだ。これでは行きしか確認できない。したら行きと帰りで違うルータを経由しているかもしれない。こんな時のために、ソースルーティングオプションが存在する。このオプションは2種類。ルーズ:最低限通るノードを指定ストリクト:途中のノードをすべて指定ルーズのほうを使い、「自分→調べたいアドレス→自分」という設定をすると、自分と特定アドレスとの往復に必要なノード数を調べることができる。弊学内から千葉大学までの道順を"tracert"というコマンドを使って調べてみます。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。要求がタイムアウトしました。トレースを完了しました。30個以上のルータを経由しなければならないのか...。この「要求がタイムアウトしました。」ってのが、途中のルータで時間超過になったことを表しています。不安になったので、学内サーバにもつないでみます。要求がタイムアウトしました。[130.153.16.7]トレースを完了しました。さっき出てきた結果と同じように、ルータを一つ経由して学内サーバにつながっていることが分かります。いうことで、今回はこれで終わり。こんな感じで自分で試せると何やってるのかわかりやすくていいですね。*1:IPv4ではルータでのフラグメントが可能だったが、IPv6ではできないようになっているそうです。NICが管理しているアドレスで4バイトで構成されている。»Searchマエカワ思い立ったら更新。忘れちゃダメなことをその日のうちに。Maekawa_studyはてなブログをはじめよう!maekawa_yoshimiki_1119さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。