#TCP / IP#TCP IPの詳細第1巻:プロトコル - 第6章ICMP:インターネット制御メッセージプロトコル

6.1はじめに

ICMPは、多くの場合、IP層の一部と考えられています。これは、エラーメッセージや注意が必要なその他の情報を伝達します。ICMPパケットは、通常、IP層や上位層プロトコル(TCPまたはUDP)を送信されます。いくつかのICMPエラーメッセージがユーザープロセスに返されるパケット。

ICMPパケットは、図6--1のようにIPデータグラム内に送信されます。

RFC 792 [Posterl1 9 8 1 B]のICMP形式仕様を参照してください。

図2 - 図6のICMPパケットフォーマット。すべてのパケットの最初の4つのバイトは同じであるが、他のバイトの残りの部分は、互いに異なっています。ここでは、一つ一つの様々なメッセージフォーマット紹介します。

タイプフィールドは、ICMPパケットの特定のタイプを記述するために、15個の異なる値を有することができます。また、一部のICMPパケットフィールドの値は、さらに様々な条件を記述するために置換されます。

チェックサムフィールドは、全体のICMPパケットをカバーしています。アルゴリズムは、同一のIPヘッダチェックサムアルゴリズムでセクション3.2で説明用います。ICMPチェックサムが必要です。

この章では、我々は一般的にICMPメッセージを議論し、細部の一部としてします:アドレスマスク要求と応答、タイムスタンプ要求と応答と到達不能ポートを。我々は、IPルーティング処理に使用される手順をINGの要求Pと応答メッセージと第9章ICMPパケットに応答して詳細第27章であろう。


6.2 ICMPパケットタイプ

ICMPパケット図の様々なタイプの6--3示す、異なるタイプのメッセージタイプフィールド及びコードフィールドにより決まります。

最後の2つの列の数字は、ICMPメッセージは、クエリメッセージまたはエラーメッセージであることを示しています。我々はそれらを区別する必要があるので、ICMPエラーメッセージのなので、時にはそれは、特別な処理を必要とします。例えば、応答ICMPエラーメッセージが、そう、制限ルールが存在しない場合は、エラーの別の場合に生成されたエラーが発生し、エラー、エラーを生成することができる(他のICMPエラーメッセージを生成することはありませんサイクル)が延々と続きます。

ICMPエラーパケットを送信する場合、パケットは常に、IPヘッダとIPデータグラムのICMPエラーを生成する最初の8つのバイトを含みます。したがって、モジュールは、に含まれる特定のプロトコルやユーザプロセスと(IPデータグラムの内部図でICMPプロトコルヘッダフィールド6-1カプセル化されたIPデータグラムに応じて決定される)がICMPエラーれるメッセージを(受信しますTCPまたはUDPポート番号でTCP又はUDPパケットヘッダーの最初の8バイトでIPデータグラム)は、リンクが決定されます。セクション6.5に記載さ点を例示します。

次のような状況は、ICMPエラーメッセージにはなりません。

  • 1)ICMPエラーメッセージ(ただし、ICMPクエリーメッセージ)がICMPエラーメッセージを生成してもよいです。
  • 2)宛先アドレスがブロードキャストアドレス(図3--9を参照)、またはマルチキャストアドレス(クラスDアドレスは、図1--5)IPデータグラムを参照。
  • 3)データリンク層ブロードキャストメッセージとして。
  • 4)最初のシートがIPフラグメント(セクション11.5で説明フラグメント)ではありません。
  • 5)データ・パケットの送信元アドレスは、単一のホストではありません。すなわち、送信元アドレスはゼロアドレス、ループバックアドレス、ブロードキャストアドレスやマルチキャストアドレスすることができません。

これらのルールは、過去にはブロードキャストストームによって引き起こされるブロードキャストパケットに対応してICMPエラーメッセージを防ぐことができます。
 


6.3 ICMPアドレスマスク要求と応答

ICMPアドレスマスク要求は、ブート・プロセス(セクション3.5)の間、自身のサブネットマスクディスクレスシステムを取得します。システムは、そのICMP要求パケットを(RARPプロセスディスクレスシステムがブートプロセスで使用されるIPアドレスが類似している取得)放送します。サブネットマスクを得るための別の方法ディスクレスシステムは、BOOTPプロトコルであり、我々は最初の章6でご紹介します。ICMPアドレスマスク要求と応答パケットのフォーマットは図6--4に示されています。


 

ICMPメッセージ識別子と任意送信者によって選択されたシーケンス番号フィールドセットは、値は応答で返されます。このように、送信者が一致する応答を要求することができます。

私たちは、簡単なプログラム(命名icmpaddrmask)を書くことができ、それがICMPアドレスマスク要求メッセージを送信し、その後、すべての応答をプリントアウトします。一般要求メッセージとしてブロードキャストアドレスに送信されますので、私たちは同じことをするでしょう。宛先アドレス(... 1402521363)が....サブネットブロードキャストアドレス1402521332(図3--12を参照してください)

sun % icmpaddrmask 140.252.13.63
received mask = ffffffe0, from 140.252.13.来3自3 本 机
received mask = ffffffe0, from 140.252.13.来3自5 b s d i
received mask = ffff0000, from 140.252.13.来3自4 s v r 4

私たちは、最初の4サブネットマスクが間違っているSVRから返される出力に気づきました。明らかに、SVRが4つのインタフェースは、適切なサブネットマスクを設定しているが、SVR 4は、それが存在しなかったかのように一般的なクラスBアドレスマスク、サブネットを返しています。

svr4 % ifconfig emd0
emd0: flags=23<UP,BROADCAST,NOTRAILERS>
inet 140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63

SVR4プロセスICMPアドレスマスク要求手順のエラーが存在します。

私たちは、ホストBSDI上でtcpdumpを使用して、図中、図出力6--5を状況を表示します。私たちは、ハードウェアアドレスを表示するには、-eオプションを使用します。

なお、行が何も見えませんが、送信側ホストは、(出力ライン「ローカルから」以上で)日ICMP応答を受け取ることができますが。これは、放送の一般的な特徴である:いくつかの内部ループバック機構を介しても送信ホストがブロードキャストメッセージのコピーを受信します。イーサネットドライバは、宛先アドレスがブロードキャストアドレスであることを認識すると、パケットが送信された、4 - 用語「放送」は、ローカルネットワーク上のすべてのホストを参照するために定義され、それはホストの送信を含む、含まれていなければならない(図2を参照するのでネットワーク、コピーがループバックインターフェイスにある間)。

次に、応答、SVR 4が、リクエスタにのみ応答をブロードキャストするBSDI。一般的に、アドレスは、0.0の要求元IPアドレスの終了しない限り、ユニキャスト返信アドレスでなければならない。0.0。本実施形態では当てはまらないため、ブロードキャストアドレスへの応答は、内部エラーBSD / 3 8 6です。

RFC規則は、システムは、許可エージェントのアドレスマスクである場合を除き、それ以外の場合は、アドレスマスク応答を送信することができない(許可された代理店になるためには、特別に応答を送信するように構成されなければならない。参照付録E)。我々はそれが要求を受信したときに、ほとんどのホストが応答を送信し、この例から見ることができるようにしかし、さらにいくつかのメインの
マシンも、エラー応答を送信します。

最後のポイントは、以下の実施例により例示することができます。私たちは、ローカルIPアドレスにアドレスマスク要求を送信し、ループバックアドレスは、次のとおりです。

sun % icmpaddrmask sun
received mask= ff000000, from 140.252.13.33
sun % icmpaddrmask localhost
received mask= ff000000, from 127.0.0.1

戻り両方の場合におけるアドレスマスク、すなわち、クラスAアドレス127 0.0、に対応するループバックアドレスである。1 また、図2から我々 - 4に見ることができる、データパケットが実際にループバックインタフェースに送信されたローカルIPアドレス(1402521233 ...)に送られます。ICMPアドレスマスク応答が要求サブネットマスクインタフェース(各インターフェイスが異なるサブネットマスクを有するマルチインタフェースホストからである)、ループバック・インターフェースから、両方の場合に、アドレスマスク要求を受信しなければなりません。


6.4 ICMPタイムスタンプ要求と応答

ICMPタイムスタンプ要求は、システムが他のシステムに現在の時刻を確認することができます。戻り値は、真夜中過ぎミリ秒の推奨数、(協定世界時、UTC協定)協調統一した時間(グリニッジ標準時としてUTCへの早期リファレンスマニュアル)です。このICMPパケット利点は、第二のクラスの解像度を提供するために、他のホストを得るために(例えばrdateコマンド提供されるいくつかのU nixのシステムのような)時刻から、他の方法を使用している間、それは、ミリ秒の分解能を提供することです。復帰時間は深夜から始まる計算されているので、その呼び出し側は、その欠点の一つである、他の手段によって、現在の日付を知っている必要があります。

図6に示すICMPタイムスタンプ要求と応答パケットのフォーマット - 6図に示します。


 

依頼者は、発信タイムスタンプで埋めるために、メッセージを送信します。システムへの応答は、タイムスタンプパケットを埋めるための要求を受信する受信応答を送信する送信タイムスタンプをしかし、実際には、ほとんどの後者の二つのフィールドを同じ値に設定されているのを達成するために、(三つのフィールドのためには、送信者が送信要求応答の時間と送信時間を算出可能に設けられています)。


6.4.1例

私たちは、ICMPタイムスタンプ要求がホストに送信され、簡単なプログラム(命名icmptime)を書き、そして返された応答を印刷することができます。これは次のように私たちの小さなインターネット上で実行されます:

タイムスタンプ(RECV)及び送信タイムスタンプ(XMIT)を受信し、タイムスタンプ(ORIG)を開始:ICMPパケットプログラムは、三のタイムスタンプを印刷します。この例では、以下の例が見てきたように、全ての受信ホストと送信タイムスタンプが同じ値に設定されています。

私たちは、ラウンドトリップ時間(RTT)を計算することができます。応答を受信すると、その値は、時間値の時間値であるマイナスリクエストを送信します。値の差は、タイムスタンプ値マイナス発信タイムスタンプ値を受信することです。図6において、これらの値の関係 - 図7。

私たちはRT Tの値を信じて、そして半分はローカルクロックとクエリホストクロックと、それは一貫性を保つためには、要求パケットの送信、および応答メッセージの伝送のための他の半分にRT Tを信じている場合、ローカルクロックはする必要があります調整、調整値は、RT Tの差がマイナス半分であります 前の例では、BSDIクロックは、クロック太陽7ミリと8ミリ秒よりも遅いです。

タイムスタンプ値は、真夜中からのミリ秒数を算出するので、すなわちUTC、それらは常にあるべきである未満86 400 000(2 4×6 0×6 0×1 0 0 0)。これらの実施例は、4である:実行00の前、および7時間よりも遅い時間帯、UTC、それら8280万(2,300時間)よりも値が正当化大きいです。

ホストプログラムを実行BSDI場合は、数回繰り返し、我々は受信することを発見し、最後の桁の送信タイムスタンプは常に0です。ソフトウェアのバージョン(0.9。バージョン4)のみ1つの0ミリ秒の時間分解能を(手順付録Bを参照)を提供することができるからです。

4 SVRホストが二回のプログラムを実行する場合は、我々は常に0で、タイムスタンプSVR4の最後の3桁が見つかりました:

何らかの理由で、SVR 4ミリ秒の分解能は、ICMPタイムスタンプで提供されていません。このように、時間差調整秒は効果がありません。

ホスト結果はほぼ75秒の他のマスタクロックの差が、クロック及び太陽37秒の間の差を示す、請求我々は、他のホスト上でプログラムサブネット140 252 1を実行する場合:

別の興味深い例は、ルータ、ゲートウェイ(A C ISCOルータ)。これは、システムが上位32ビットのタイムスタンプが示されるとそれは、非標準のタイムスタンプ値(深夜計算、UTCからのミリ秒数ではなく)を返した場合に、それを示しています。我々のプログラムはこれを検出し、角括弧で囲まれた(高いオフにした後)、送信された受信タイムスタンプ値をプリントアウト。さらに、開始時間が違いの間で計算して、それ以来している単位をタイムスタンプを受信することはできません。

私たちは、そのホスト上のプログラムを複数回実行している場合、値がミリ秒の解像度を持ち、開始点から数えたミリ秒数ですが、開始点が深夜ではなく、UTC(例えば、可能なことは明らかですルータが)ガイドのカウントを開始してからのミリ秒数です。

NT Pstratum 1台のサーバー(のは、NTP、ネットワークタイムプロトコルの詳細としましょう) - 最後の例として、のは、太陽が正確なシステムクロックであることが知られて比較してみましょう。

我々は違い、マイナス半分RT Tを計算すると、結果が日に時計が速く3 8. 5〜51.5ミリ秒であることを示しています。


6.4.2別の方法

もう一つの方法は、時間と日付を取得するために使用することができます。

  • 1)第1節12に日付と時刻サービスプログラムおよびサービスについて説明します。前者は、人間が読める形式は、現在の日付と時刻、ASCII文字の行を返します。このサービスは、telnetコマンドを使用して検証することができる。一方、タイムサービスは、UTC、真夜中の日に1900年1月の秒数から示す、3 2ビットのバイナリ値を返します。このプログラムは(私たちはTCPのタイムサービスを使用して、以前のrdateコマンドを言及したことを)提供秒の日付と時刻に基づいています。
  • ネットワークタイムプロトコル(NTP)を使用して、2)厳格なタイマを参照して、RFC 1305プロトコル[M病気S1 9 9 2]について説明します。このプロトコルは、LANやWA N上のシステムのグループ内のミリ秒クロックエラーを確実にするために高度な技術を使用しています コンピュータの正確な時間興味のある読者は、このRFCをお読みください。
  • 3)オープンソフトウェア財団(OSF)分散コンピューティング環境(DCE)は、分散時刻サービス(DTS)を定義し、それはまた、コンピュータ間でクロック同期を提供します。文書[R osenbe RG、ケニーとフィッシャー1992]サービスの説明の追加の詳細を提供します。
  • 4)バークレーデーモンを提供U nixのシステムでは、LAN上のシステムクロックを同期させるために、(8)時限。NTPとDTSとは異なり、時間指定は、WANの範囲内で仕事をしません。


6.5 ICMPポート到達不能エラー

アドレスマスクとタイムスタンプのクエリと応答 - 私たちは、ICMPクエリーメッセージを議論する最後の二つのセクション。ICMPエラーメッセージの今分析、ポート到達不能メッセージは、それがどうかを確認するために、ICMP宛先到達不能OSPFパケットである付加情報としてICMPエラーメッセージ。使用UDP、それを表示する(第11章を参照してください)。

UDPは、ルールの一つであり、あなたはUDPデータグラムと宛先ポートを受信した場合のプロセスに対応していない使用され、その後、UDP、ICMP到達不能メッセージを返します。TFTPは、ポート到達不能メッセージ(第15章で説明TFTP)を強制するために使用することができます。

TFTPサーバの場合、UDP共通ポート番号は69です。しかし、ほとんどのTFTPクライアントプログラムは、connectコマンドは、別のポート番号を指定することができます。ここでは、ポート8888を指定するためにそれを使用します。

接続するためのホスト名とポート番号を指定するには、最初のconnectコマンドは、ファイルを取得するには、getコマンドが続きます。getコマンドを入力した後、UDPデータグラムは、ホストコンピュータ4 SVRの8888ポートに送信されました。tcpdumpの出力パケット交換の結果は、図6--8に示されています。

UDPデータはSVR4に提出する前に、まずそのハードウェアアドレス(ライン1)を決定するためにARP要求を送信します。ARP応答(ライン2)を返し、その後、それは、これらのメッセージから最初のIPデータグラムで交換することができることを思い出させるためにtcpdumpの出力にUDPデータグラム(ライン3)(予約ARP要求と応答を送信しますホストが別のホストに送信する前に必要とされる。これらのメッセージは、議論のトピックに関連していない場合は、本書の後の章で、我々は保存されます
それらを省略)。

到達不能ICMPポートはただちに(ライン4)が返されます。ただし、TFTPクライアントは、ICMPパケットを無視するように表示され、5秒後にした後、別のUDPデータグラム(5行目)を送信します。クライアントをあきらめる前に3回再送信します。

ICMPメッセージがなく、宛先ポート番号より、ホストとの間で交換され、各20バイトのUDPデータグラムが他の特定のポートに特定のポート(2924)から送信されることに注意してください(8 888)。

続いUDP番号20は、UDPデータグラムのデータ長のそれぞれを指します。この例では、TFTPオペレーションコードの2つのバイトを含む20のバイトは、9バイトのヌル名前TEMP。フー、および9バイトの文字列NETASCIIヌル終了(TFTP終了しました図15--1を参照すると、パケットの詳細なフォーマット)。

場合 - 同じ例を実行するためのeオプション、私たちは、それぞれがICMPポート到達不能フルレングスパケットを返されていることがわかります。この長さは70バイトであり、図6に割り当てられている - 図9に示します。

(全くオプションを含有しない)エラーメッセージのデータ・パケットのIPヘッダを生成することが含まれなければならない、また、少なくともIPヘッダの後ろに先行含まなければならない - ルールICMPは、ICMPエラーメッセージ(。。最後の3、図6参照)であります8バイト。この例では、UDPヘッダの最初の8バイトの後ろの最初の部分と(図11--2を参照)IPを含んでいます。

重要な事実は、コンテンツはUDPソースポート番号と宛先ポート番号のヘッダに含まれていることです。それだけICMPポート到達不能エラーメッセージをもたらし、この宛先ポート番号(8888)です。ICMPシステムは、特定のユーザは、エラーメッセージの送信元ポート番号(2924)によると(本例のTFTPクライアントにおける)プロセスに関連付けることができる受信します。

データパケットのIPヘッダーの原因エラーが返されるICMPは(本実施形態ヘッダUDP)に後者8つのバイトを解釈する方法を知っているように、IPヘッダのプロトコルフィールドために含まれています。我々は、TCPヘッダ(図17--2)を表示する場合、TCPヘッダの最初の8バイトに含まれる送信元および宛先ポート番号に見出すことができます。

図6--10図ICMP到達不能パケットの一般的なフォーマット。

図6に - 3、我々は、それぞれICMP到達不能パケットの16個の異なるタイプの、0から15までのコードが存在することに注意してください。ICMPポート到達不能エラーコードは3です。さらに、図6--10は、第二の32ビット・ワード0でなければならないでICMPパケットに示されているが、しかしコードが4である場合(「断片化が必要なくれた断片ビットをしない」)、パスMTUディスカバリ機構(セクション2.9)が、ルータインターフェイスがMTUの外側の32ビット・ワードの下位16ビットを記入することを可能にします。我々は11.6で、このエラーの例を与えます。

ICMPルールは、システムがIPデータグラムでエラーを発生させるために、データの8バイト以上を返すことができますが、ほとんどのシステムは、バークレー・リターンのみ8バイトに由来しますが。条件の下で戻り値(E.第4節)の最初の64のバイトは、Solaris 2.2でデフォルトのオプションをipicmpreturndatabytes。

tcpdumpの時系列

図6--11図に示すように、テキストを通じて、我々はまた、tcpdumpの出力形式の時系列を与えます。

ダウン時間がインクリメントされると、出力は( - 8、図6を参照)と同じ図tcpdumpの出力タイムスタンプの左側にあります。フィギュアマークの上部には、ホスト名とポート番号の両方の通信です。ページのyのダウン座標軸と真の値が時間に比例していないことに留意すべきです。かなりの期間がある場合、再送信は、本実施例では、5秒ごとの間、私たちはタイムラインの両側にマークされています。UDPまたはTCPデータが送信されているとき、私たちは表現するために太い線を使用します。

ICMPパケットが返された場合は、理由をTFTPクライアントキープ再送要求それ?これは、ネットワークプログラミング、プロセスはソケットに接続するためのコマンドを送信していない限り、プロセスのユーザに通知するためにソケット(ソケット)から受信したICMP UDPデータパケットでないBSDシステムの要因によるものです。それはICMPエラーパケットを通知したことがないので、標準的なBSD TFTPクライアントは、connectコマンドを送信しません。

ここで注意すべきもう一つのポイントは、TFTPクライアントによって使用されて良い再送タイムアウトアルゴリズムではありません。わずか5秒で十分であると仮定し、したがって必要な25秒の合計5秒ごとに再送信されます。その後、我々は良いのTCP再送タイムアウトアルゴリズムが表示されます。

TFTPクライアントによって使用される再送タイムアウトアルゴリズムはRFCによって禁じられています。しかし、それは著者のとSolaris 2.2上のすべての3つのシステムではまだ使われています。推奨される方法であり、パケット0,5,1 5及び35秒の送信時AIX 3.2.2は、それぞれ、タイムアウト値に指数バックオフを適用します。私たちは、第21章で詳しく残業問題を議論します。

最後に、ICMPメッセージは、我々は同様の応答をするPの第7章で見てきた往復時間後に3.5ミリ秒程度返されたUDPデータグラムを送信している、ということを指摘しなければなりません。


6.6 ICMPパケット処理4.4BSD

たとえ所与のシステム実装で、致命的なエラーにエラー情報から、ICMPの広い範囲をカバーするので、各処理ICMPパケットが異なっています。図中のコンテンツと12 6 - - 3は、処理方法をそれぞれの可能なICMPパケット6図4 4 BSDシステムを示し、同じです。


 

最後は「コア」とマークされた場合、ICMPはカーネルによって処理されます。最後は、「ユーザー・プロセス」を示している場合、そのメッセージは、受信したICMPパケットを読み取るために、カーネルに登録されているすべてのユーザプロセスに転送されます。このようなユーザ・プロセスが存在しない場合、メッセージは、それらはもちろん、カーネルによって処理されるべきである(これらのユーザプロセスはまた、唯一のユーザー・プロセス・コア処理では、すべてのICMPパケットを他の種類のコピーを受信する黙って破棄されますそれ以降)これらのメッセージを受信します。一部のメッセージが完全に無視します。最後の列に示されている場合、最終的に、引用符内の文字列であり、それは、対応するU nixの誤差です。このような送信側のTCPのようないくつかのエラーは、閉じた処理、それらは後のセクションで説明します。


6.7まとめ

私は、各システムは、制御メッセージプロトコルを含める必要がありnternetのためにこの章では議論されました。図6--3リスト後の章で説明されるほとんどが、すべてのICMPメッセージタイプ、。

私たちは詳細にICMPアドレスマスク要求と応答とタイムスタンプ要求と応答を議論しました。返信メッセージ - これらは、一般的な要求です。ICMPメッセージ識別子との両方のシーケンス番号の両方。他のプロセスの応答を区別するために固有の番号にエンドアプリケーション識別子フィールドメモリを送信します。シーケンス番号フィールドマッチの間、クライアントが要求と応答をすることができるように。

また、ICMPポート到達不能エラー、一般的なICMPエラーを議論しました。ICMPエラーメッセージが分析に戻される:IPデータグラムヘッダとそれに続く8バイトのエラーが発生します。ICMPエラーの受信者の情報は、エラーの原因についての詳細を学ぶことができ、必要です。TCPとUDPソースポート番号との両方が彼らの最初の8バイトのヘッダ内の宛先ポート番号に格納されているためです。

最後に、我々は最初の時間のためにそれは時系列tcpdumpの出力を示しています。この表現は、頻繁にこの本の後の章で使用されます。

公開された170元の記事 ウォンの賞賛207 ビュー459万+

おすすめ

転載: blog.csdn.net/xiaoting451292510/article/details/103281565