2020-04-15
キーワード:イーサネットプロトコル、ネットワークパケット分析
この記事では、実際のネットワーク通信プロセスを組み合わせて、イーサネットプロトコル、TCPメッセージ形式、IPメッセージ形式、UDPメッセージ形式を簡単に理解します。
この前に、私たちは知っておく必要があります。すべてのデータは、ネットワークデータ、ネットワークパケット、ビデオ、オーディオ、画像などに関係なく、ネットワークケーブル内の「秩序立ったシリアルデータ」のセットです。この長いデータ文字列には、さまざまなプロトコルとさまざまなデータが含まれています。
1. TCP / IPメッセージ形式
まず、実際の通信アプリケーションにおけるTCP / IPメッセージ形式を見てみましょう。
ここでは、tcpdumpツールを使用して取得し、wiresharkを使用して、ソケットを介して「Hello world」テキストを送信する2つのデバイスのインタラクティブプロセスを分析します。
1.1、分析環境
最初に作者の元のネットワークパッケージをここに貼り付けます。興味がある場合は、ダウンロードして表示できます。
リンク:https
://pan.baidu.com/s/1QHXq88yiqTWISRMd-8-Q2g抽出コード:nd5u
WiresharkのIPでフィルター:ip.addr == 192.168.77.104
最初に、2つのデバイスの基本情報を紹介します。
サーバー機器:
IP:192.168.77.104
MAC:A8:BD:3A:37:54:AB
クライアントデバイス:
IP:192.168.77.103
MAC:A8:BD:3A:37:54:FF
次の図に示すように、TCPは通信の前に、まず「3つのハンドシェイク」を介して接続を確立する必要があります。
同時に、相手からのメッセージを受信した後、一方の当事者は「返信」して、送信者に「私は受信しました」と通知する必要があります。
このように、Socketを介して実行する「Hello world」テキスト通信プロセスには、少なくとも5つの通信プロセス、つまり5つのネットワークパケットが必要です。もちろん、切断時に「4つの波」を数える場合は、さらに4つのネットワークパケット(合計9つのネットワークパケット)を追加する必要があります。ただし、ここでは切断の場合を考慮していないため、考慮する必要があるネットワークパケットは5つだけです。
このプロセスの5つのネットワークパケットは、次の図に示すように、wiresharkでフィルタリングできます。
1.2、イーサネットヘッダー
最初のネットワークパッケージの内容は次のとおりです。
ここでは、真ん中の「シリアルデータ」の部分だけを見ていきます。両側のコンテンツは、見やすくするためにWiresharkによって追加されました。
まず、最初の14バイトはイーサネットヘッダーに属します。その構成は次のとおりです。
宛先MACアドレス(6バイト)+送信元MACアドレス(6バイト)+ IPプロトコルバージョン番号(2バイト)
最初の6バイトは確かにサーバーデバイスのMACアドレスA8:BD:3A:37:54:ABであり、真ん中の6バイトはクライアントA8のMACアドレスであることが簡単にわかります:BD:3A:37: 54:FF。最後の2バイト0x0800は、ネットワークパケットがIPV4通信プロトコルを使用していることを示しています。
イーサネットヘッダーの構造はとてもシンプルです。
1.3、IPメッセージ形式
次のステップはIPプロトコルです。
IPメッセージ形式を見る前に、以下に示すように、標準形式の構成図を参照する必要があります。
IPメッセージ形式
上図に示すように、デフォルトでは、IPパケットの長さは20バイトです。上記でキャプチャしたネットワークパケットを取り上げます。そのIPパケットの部分を以下に示します。
実際の通信ネットワークパケットは、上記のIPメッセージ形式と組み合わせて図を形成します。IPメッセージの最初のバイトには、プロトコルバージョンとIPメッセージの長さの2つの部分が含まれ、それぞれ4を占めますビット。
バージョン+ヘッダーの長さ:
ネットワークパケットの最初のバイトは0x45です。上位4桁の値は10進数の4であり、現在のIPプロトコルのバージョン番号が4、つまりIPV4であることを示しています。IPV6の場合、上位4桁の数値は6です。
下位4桁は10進数の5です。この値は少し特殊であり、IPパケットの長さが5バイトしかないという意味ではなく、値に4バイトを掛けたもの、つまり5 * 4バイト= 20バイトです。このネットワークパケットのIPパケットデータの長さは20バイトです。オプションのフィールドとパディングフィールドは含まれません。
差別化されたサービス:
私たちのネットワークパケットでは、その値は0x00です。この値は通常無視されます。
全長:
それは2バイトを取り、値は0x003c、10進数で60です。ネットワークパケット全体のIPパケット+データパケットの合計長、つまりイーサネットヘッダーの最初の14バイトを削除した後のこのネットワークパケットの合計長を表します。この値は、ネットワークパケット全体の全長を表すと考えることができます。
ロゴ:
2バイトを使用します。0x500a。このネットワークパッケージのID番号と見なすことができます。通常、この数は順番に増加し、送信されるネットワークパケットごとに値が1ずつ増加します。ただし、同じネットワークパケットのデータが長すぎる(MTUサイズを超える)場合、このネットワークパケットは短いパケットに「分割」され、1つずつ送信されます(つまり、断片化されます)。各フラグメントのIDは同じであり、受信側が分散したネットワークパケットを完全なネットワークパケットに再構成できるようにします。
ロゴ+スライスオフセット:
2バイトを占有し、フラグは上位3ビットを占有し、チップオフセットは下位13ビットを占有します。
ロゴ:
高から低への3桁は次のとおりです。
1.予約ビット
2.シャーディングは禁止されています
0は、ネットワークパケットにフラグメントがあることを意味します。1は断片化がないことを意味します。(ネットワークパケットのデータサイズがMTUを超えるかどうかによって異なります)
3.シャードを増やす
0はスライスが最後のスライスであることを意味します。値1は、このネットワークパケットがそれらの1つにすぎず、後でさらにフラグメントがあることを示します。
この記事でサンプリングされたネットワークパケットでは、フラグセグメントの値は0x4-> 010です。このネットワークパケットが断片化されていないことを示します。
スライスオフセット:
13ビット値、値の範囲は0〜8191です。元のデータパケットの最初のビットに対するこのフラグメントのオフセットビット数を示します。真のオフセット位置とするには、この値に8を掛ける必要があります。端的に言えば、ネットワークパケットデータが長すぎて分割して送信できない場合に、受信側への一括再構成の基準となるフレームです。
生存時間:
それはTTLで、1バイトを占めます。この例では、値は0x40、つまり10進数で60です。これは、このIPパケットで許可されるルートホップの最大数を示します。IPパケットがルーターを通過するたびに、この値は1ずつ減少します。値が0に減少し、宛先に到達しない場合、ネットワークパケットは破棄されます。実際、このTTLは非常に重要です。これがないと、インターネットがスパムによって完全にブロックされる可能性があります。
同意:
1バイト。IPパケットで伝送されるデータで使用されるプロトコルタイプを示します。一般的なオプション値は次のとおりです。
1、0x06-TCP
2、0x11-UDP
3、0x01-ICMP
4、0x02-IGMP
最初のチェックサム:
2バイトのIPパケットチェックコード。
送信元アドレス+宛先アドレス:
それぞれ4バイトかかります。c0a84d67-> 192.168.77.103; c0a84d68-> 192.168.77.104
この時点で、20バイトであると分析しましたが、IPパケットにはオプションのフィールドとパディングフィールドがないため、IPパケットプロトコル全体が終了しています。次はデータフィールド部分です。
1.4、TCPメッセージ形式
ここで、データ部分はTCPプロトコルを使用して通信します。したがって、次の分析はTCPメッセージ形式です。
TCPメッセージプロトコルの標準形式を以下に示します。
この分析例で使用されているネットワークパケットのTCP部分の内容を次の図に示します。
送信元ポート+宛先ポート:
最初の4バイトは、IPアドレスの送信元ポートと宛先ポートです。0xe785は、クライアントデバイスのIP通信ポートです。0x4315は、サーバーデバイスのIP通信ポートです。
シリアル番号+確認番号:
それぞれ4バイトかかります。この例では、シリアル番号は0xaca2b4fdです。シリアル番号と確認番号は、TCPセッションのタイムフローとして説明できます。通常の状況では、これらの2つの数値は順次増加しています。シリアル番号は、このネットワークパケットに対応するシリアル番号です。これは、ある時点で言った文として単純に理解されます。確認番号は、ネットワークパケットに返信するときに受信側で使用されるシリアル番号を期待していることを示しています。つまり、ネットワークパケットに応答するときに受信者が使用するシリアル番号は、ネットワークパケットの確認番号である必要があります。
一般的に、確認番号は、受信側からの最後のシリアル番号に基づいて増分される値です。この例では、確認番号は0です。これは、このネットワークパケットがTCPセッションの開始時の最初のパケットであるためです。参照する前のパケットのシリアル番号がないため、0のみを入力できます。
理解を深めるために、この例の5つのネットワークパケットで使用されているシリアル番号と確認番号の概略図を次に示します。生徒は、いくつかの連続したネットワークパケットにおけるこれら2つの番号の違いを注意深く理解します。
頭の長さ:
「データオフセット」とも呼ばれます。4ポジション。これは、TCPパケットヘッダーデータが占めるバイトの長さを示します。この例では、この値は0xaで、10進数の10です。この数に基づいて4バイトを乗算する必要があるため、TCPヘッダーの長さは10 * 4バイト= 40バイトです。端的に言えば、データを除いたTCPパケットの長さです。
12フラグビット:
前の段落の「ヘッド長」の直後の12ビットは、一連のフラグビットです。このうち、上位6ビットは予約ビットであり、下位6ビットは何かを設定するために使用されます。これらのビット設定の意味については何も修正したくありません。ワイヤーシャークのヘルプと説明を参照用にネチズンの記事に直接貼り付けます。
ウィンドウサイズ:
2バイトかかります。TCPフロー制御に関連しています。受信バッファーの作成サイズを示すために使用できます。
TCPチェックサム:
2バイトかかります。
緊急ポインタ:
2バイトかかります。このメッセージの緊急データのバイト長を示すために使用されます。緊急データはデータセグメントの先頭になります。
追加オプション:
少し。
追加オプションを除くTCPパケットのデータは、20バイトに固定されています。これは、IPパケットヘッダーの長さと同じです。
以下は、完全なTCP / IPネットワークパケットの分解とデータを運ぶ注釈です。
000c296b8577000c296b8577 [両当事者のMACアドレス] 0800 [IPV4ロゴ] 45 [バージョンとIPパケットヘッダーの長さ、ここでは5 * 4 = 20バイト] 00 [差別化されたサービス] 003a [合計の長さ] fe10 [識別] 4000 [マークスライスからのオフセット] 40 [TTL] 06 [プロトコル、06はTCPを意味する] dd58 [チェックコード] c0a86f01c0a86f02 [両方のIPアドレス] [ここからはTCPメッセージプロトコル形式] aa384316 [送信元ポートと宛先ポート] 56f4b30f [シリアル番号] e4c60050 [確認番号] 8018 [ヘッド長とフラグ] 00e5 [ウィンドウ] 0807 [チェックサム] 0000 [緊急ポインタ] 0101080a00145223ffff9bf1 [オプション、12バイト。】 68656c6c6f0a [データ]
2. UDPメッセージ形式
以前のTCP / IPネットワークパケット分析により、ネットワークパケット全体の構成が3つ以下の部分で順番に配置されていることが既にわかっています。
1.イーサネット情報
2. IPメッセージ情報
3. TCPまたはUDPまたはICMPまたはIGMPメッセージ情報
UDPメッセージ形式は、TCPよりもはるかに単純です。
UDPメッセージプロトコルの標準形式を以下に示します。
送信元ポート+宛先ポート:
少し。
長さ:
2バイトかかります。UDPパケットヘッダー+データの全長。
チェック値:
少し。
データ:
少し。
UDP通信は握手してさよならするTCPのようなものではないので、データを直接ネットワークにブロードキャストするだけなので、そのフォーマットの分析は、以前のTCPの分析ほど煩雑である必要はありません。また、UDP通信ネットワークパケットの前にあるイーサネット情報とIPメッセージ情報は、すでに前に導入されています。したがって、完全なUDPネットワークパケットを直接ポストしてデータを送信し、参照と学習のために対応するコメントを付けます。
完全なUDPパケット通信網:
000c296b8577000c296b8577080045000022cf40400040110c36c0a86f01c0a86f028ebf4316000e8acb68656c6c6f0aの
解釈:
000c296b8577000c296b8577 [MAC]アドレスの両方 0800 [IPバージョン番号は、ここでIPV4である] [以下は、IPパケットの始まりである] 45 [+バージョン番号ヘッダ長。IPV4 + 20バイト] 00 [Differentiated Services] 0022 [14バイトのイーサネットヘッダー以外の全長、34バイト] cf40 [ID、つまりセッション番号] 4000 [ロゴ+ スライスオフセット。断片化なし。】 40 [TTL] 11 [IPパケットでデータを運ぶためのプロトコル、ここではUDP] 0c36 [IPパケットヘッダーのチェックサム] c0a86f01c0a86f02 [両方のIPアドレス] [以下はUDPパケットです] 8ebf4316 [両方のポート番号。送信元ポート + 宛先ポート] 000e [長さ、UDPパケットの全長、UDPヘッダー+ データ合計14バイト] 8acb [チェックコード] 68656c6c6f0a [データ]
参考資料:
https://blog.csdn.net/bobozai86/article/details/87518617
https://blog.csdn.net/a7980718/article/details/82316880
https://blog.csdn.net/a4230787/article/details/80301048