LWIPプロトコルスタック:IPプロトコル

1. IPプロトコルの概要

また、ネットワーク層に属するインターネットプロトコルとして知られているIPプロトコル(インターネットプロトコル)。宛先ホストに送信元ホストからのデータの送信を担当一意の識別子としてIPプロトコルIPアドレス、。

IPプロトコルはコネクション信頼性の低いデータグラム配信プロトコルで、プロトコル自体は、任意のエラーチェックと回復メカニズムを提供していません。 

1.1 IPアドレス

インターネットでは、各ホストは、識別マークとしてユニークなIPアドレスを持っています。

(1)カテゴリーのアドレッシング

Aクラス、クラスB、クラスC、クラスD、Eクラス、図中の以下の組成:IPアドレスは、5つのカテゴリーに分けることができます。

   以下に示すように、IPアドレスの特長。

   (2)特別なIPアドレス

特別な目的のために使用される特殊なIPアドレスは、ネットワークのいずれかを使用してホストに割り当てられていません。

限定ブロードキャストアドレス  ネットワーク番号、ホスト番号の完全なアドレス(255.255.255.255)1、およびインターネット上のホスト。しかし、ルータによるIPアドレスが255.255.255.255のデータパケットを転送を禁止し、このパケットはLANで放送されます。
ダイレクトブロードキャストアドレス  示すフルアドレスホスト番号1、そのLAN上のすべてのホスト、
マルチキャストアドレス  マルチキャストアドレス、送信側、受信側の複数に属するクラスDアドレス。宛先アドレスとしてクラスDのIPアドレスは、送信元IPアドレスとして使用することができません。
ループバックアドレス  クラスAアドレスは、すべてのアドレスは、プロトコルが動作しているネットワークをテストする127のセグメント・ループバックアドレスです。たとえば、pingを127.1.1.1は、ローカルのTCP / IPプロトコルが正しく動作しているテストすることができます。
このネットワークこのホスト  完全なアドレスは、IPアドレス(0.0.0.0)0であり、これはこのネットワークホストことを示しています。ローカルIPアドレスのあいまいな状況の送信元アドレスとしてアドレスのみ。

 1.2 LAN、WAN、インターネット

また、ネットワークとして知られているLAN(LANと略称するローカルエリアネットワーク)、コンピュータネットワークは、ローカルエリアをカバーします。

WAN(外部、公衆ネットワークとして知られているWAN略称(ワイドエリアネットワーク)、通信の異なる領域に接続されたコンピュータネットワーク。

数多くのLANを経由してWANの配線で形成されたインターネットは、収束します。

LAN、WAN、インターネット間の相互関係を下記のように。

  • 無線ルータは、携帯電話のために、コンピュータがLAN IP(LAN-IP)を割り当てます。ルータのIPアドレスは、オペレータ(ローカルIPアドレスのオペレータ)によって割り当てられ、このアドレスは、WAN(WAN-IP)のIPアドレスに変換されます。WAN IPアドレス(WAN-IP)は、インターネットを入力して、公共のインターネットIPアドレス(グローバル-IP)に変換する必要があります。
  • IP通信ネットワークアドレス変換:LAN-IP < - > WAN-IP < - >グローバルIP。

1.3ネットワークアドレス変換

NAT(ネットワークアドレス変換)、ネットワークアドレス変換、およびその機能は、LAN IPアドレスおよびWANのIPアドレスを切り替えることで、完全なLAN-IP < - > WAN-IP間の変換。

例:

  • NAT機能を有するルータLAN内の通信のために、2つのIPアドレス、内部アドレスを有し、外部アドレスを、広域ネットワークと通信するために、オペレータによって割り当てられます。
  • NAT機能を持つルータはNAT変換テーブルの内部を維持しています。ルータはLAN IPデータグラムを受信すると、ルータは(例:ポート6666)のデータグラムのためにその内部NATのポートを割り当てます、ローカルエリアネットワークホストのIPアドレス(192.168.0.181:5555)およびWAN IPアドレス(223.166.166.66: 6666)フォームマッピング。よって、広域ネットワークと通信するためにLANホストを可能にします。
  • NAT、各LANのホストNATが割り当てる一意のポート番号、および障害ポート番号を回復に接続されたルータ。

2. IPパケット

2.1 IPパケット形式

  •  バージョン:IPプロトコルのバージョン番号。IPv4のバージョン番号は、IPv6バージョン6で、4です。
  • ヘッダ長:IP記録スペース、ユニット「単語」ヘッダが占めていました。IPヘッダの最大長さは15 * 4 = 60Byteであるので、4ビットを占めます。
  • サービス(TOS)の種類:異なるIPパケットを区別するために使用。このようなIPパケットとしてより合理的な経路を容易にするために、ルータ、例えば、いくつかの特別な要件低レイテンシ、高スループット又はデータパケットの信頼性を区別します。
  • データグラムの長さ:IPパケットの全長は、IPヘッダ長+データ領域には、単位は「バイト」。長さはこれ以上イーサネットデータフレーム(mtu_maxは= 1500Byte)の最大長より一般的に、断片化された送信すべき必要性を超えません。長さはMTU_MIN(46Byte)未満の場合、MTU_MINの必要性は、送信する前に満たされました。
  • 同定:同じデータグラムに属し、各IPデータグラムフラグメントのために決定します。各々がIPデータグラム、フィールド値+1を送信するステップと、同じIPデータグラムフラグメントに属するフィールドの値に等しいです。
  • 記号:会計3ビット。BIT(0)将来の使用のために予約; BIT(1)データパケットが断片化プロセスが0の場合は無効にすることができます処理し、断片化されたことを示す(データパケット長がmtu_maxはを超えた場合、この時点で、データグラムは廃棄される); BIT (2)0フラグメントはないその逆、全体のデータグラムの最後の断片であることを示しています。
  • フラグメントオフセットは:8バイト単位に全IPデータグラムによって運ばれる電流フラグメンテーションオフセットデータを示します。
  • 生存時間(TTL):IPデータグラムは、ルータ、フィールドマイナス1の値が処理されるたびに、それは0に低下した場合、データグラムは廃棄されます。これにより、IPデータグラムは常に(これは長いループのルーティングの選択に例えば)ネットワーク上で循環されないことを確実にします。
  • 上位層プロトコル:データ伝送プロトコルIPデータグラムの部分を表す(TCP、UDP)を引き渡さなければなりません。
  • ヘッダーチェックサム:IPデータグラムヘッダのチェックサムとルータを助けるためには、受信したIPデータグラムヘッダが正しいことを検知します。
  • 送信元IPアドレス:送信元ホストのIPアドレス。
  • 送信先IPアドレス:宛先ホストのIPアドレス。
  • 選択:このフィールドは、一部にはありません。LWIPプロトコルスタックは、唯一のオプションフィールドを認識しますが、その内容を処理しません。
  • データ領域:IPデータグラムキャリーへのデータの量。

PS: IPv4パケットのためにここに記録異なるIPv4およびIPv6パケットフォーマット、。

2.2 IPパケットデータ構造の定義

LWIPは、IPパケット定義は、ヘッダ情報マクロ定義を取得しながらip_hdr構造は、IPパケットヘッダを説明定義され、マクロ定義は、IPパケットのヘッダ情報を提供しました。ソースの場所:lwip_2_1_2 / SRC /コア/ IPv4の/ ip4_frag.c

無効ip_hdr構造を定義する際に、コンパイラ本体のアライメント動作、構造体のフィールドの多くは、ビット演算によるものであるため。

1  PACK_STRUCT_BEGIN
 2  構造体ip_hdr
 。3  {
 4      / * バージョン/ヘッダ長* / 
5      PACK_STRUCT_FLD_8(u8_t _v_hl);
 6      / * サービスの種類* / 
7。     PACK_STRUCT_FLD_8(u8_t _tos)
 。8      / * データ全長パケット* / 
9。     PACK_STRUCT_FIELD(u16_t _len);
 10      / * 識別子フィールド* / 
11。     _id u16_t PACK_STRUCT_FIELD();
 12である     / * フラグとオフセット* / 
13である     PACK_STRUCT_FIELD(u16_t _offset);
 14  の#define IP_RF 0x8000U / *予約フラグ* /
15  の#define IP_DF 0x4000U / *ドフラグメントではないフラグ* /
 16  の#define IP_MF 0x2000U / *詳細フラグ・フラグ* /
 17  の#define IP_OFFMASK 0x1fffU / *セグメント* /用マスク
 18      / * 生存時間* / 
。19      PACK_STRUCT_FLD_8(u8_t _ttl);
 20である     / * 上位プロトコル* / 
21である     PACK_STRUCT_FLD_8(u8_t _proto);
 22である     / * チェックサム* / 
23である     PACK_STRUCT_FIELD(u16_t _chksum);
 24      / * 送信元IPアドレスと宛先IPアドレス* / 
25      PACK_STRUCT_FLD_S(SRC ip4_addr_p_t);
 26である     (DEST ip4_addr_p_t)PACK_STRUCT_FLD_S;
 27 PACK_STRUCT_STRUCT};
 28  PACK_STRUCT_END
 29  
30  
31である / * 各マクロのIPデータグラムヘッダフィールド情報を取得する* / 
32  
33である // 取得プロトコルバージョン
34である の#define IPH_V(HDR)((HDR) - > _ V_HL >> 4)
 35  // ヘッダ長(ワード)を得る
36  の#define IPH_HL(HDR)((HDR) - > _ V_HL&0x0Fの)
 37  // ゲットバイトヘッダの長さ
38である の#define。IPH_HL_BYTES(HDR)((u8_t)(IPH_HL(HDR)4 * ))
 39は // サービスタイプを取得する
40  の#define IPH_TOS(HDR)((HDR) - > _ TOS)
 41がされて // 取得したデータパケットの長さ
42がある の#defineIPH_LEN(HDR) - ((HDR)> _ LEN)
 43は、 // データのパケット識別子取得
44であるの に#define( - > _ ID(HDR))IPH_ID(HDR)
 45  // 取得フラグメンテーションフラグが+オフセット
46がある の#define IPH_OFFSET (HDR)((HDR) - > _オフセット)
 47  // オフセットを取得しますサイズ(バイト)
48  の#define IPH_OFFSET_BYTES(HDR)\
 49((u16_t)((lwip_ntohs(IPH_OFFSET(HDR))&IP_OFFMASK)* 8U ))
 50  // 生存時間取得し
51である の#define IPH_TTL(HDR)((HDR) - > _ TTL)
 52れる //を上位層プロトコルを受ける
53である の#define IPH_PROTO(HDR)((HDR) - > _プロト)
 54である //はチェックを取得そして、
55 #define IPH_CHKSUM(HDR) - ((HDR)> _ CHKSUM)
 56  
57  
58  / * マクロは、IPデータグラムヘッダを埋めるために使用される* / 
59  
60  // 設定ヘッダ長のバージョン番号
61  の#define IPH_VHL_SET(HDR、V、HL )\
 62(HDR) - > _ V_HL =(u8_t)((((V)<< 4)| (HL)))
 63  // サービスタイプを設定する
64  の#define IPH_TOS_SET(HDR、TOS)(HDR) - > _ TOS =(TOS)
 65  // データグラムの全長設定
66  の#define IPH_LEN_SET(LEN HDR)(HDR)を- > _ = LEN(LEN)
 67  // 設定インジケータ
68  の#define IPH_ID_SET(HDR、ID)(HDR) - > = _id(ID)
 69 // 設定されたオフセットフラグメンテーションフラグ
70  の#define IPH_OFFSET_SET(HDR、OFF)(HDR) - > _ =オフセット(OFF)
 71である //は生存時間を設定する
72  の#define IPH_TTL_SET(HDR、TTL)(HDR) - > _ TTL =(u8_t)(TTL)
 73である //は上位プロトコルセット
74  の#define > _プロト=(u8_t)(プロト) - IPH_PROTO_SET(HDR、プロト)(HDR)
 75  // 設定チェックサム
76  の#define IPH_CHKSUM_SET(HDR、CHKSUMを)(HDR) - > _ CHKSUM =(CHKSUM)
IPパケットのデータ構造の定義

 3. IPデータグラムのフラグメント

理由(1)処理された断片

IPデータグラムがリンク層に送信され、リンク層フレームにカプセル化リンクレイヤIPデータグラムは、ハードウェアカードは、ターゲットホストにリンク層フレームを送信します。リンク層フレーム中で実施することができるデータの最大量は、最大伝送単位(MTU)と呼ばれる、異なるハードウェアカードMTUは異なっていてもよいです。IPデータグラムの長さがMTUを超えた場合、プロセス必要が送信前にフラグメント化します。

フラグメント処理の原理(2)

フラグメント処理IPデータグラムは、データ領域には、いくつかのより小さいIPデータグラムにIPデータグラムを切断すること、および個々のカプセル化リンク層フレームを送信します。

  • 各スライスIPヘッダは、「フラグ」に加えて、これらの2つのフィールド「フラグメントオフセット」、残りは同一です。
  • スライスデータ領域の長さが8の倍数でなければならないので、ユニット、フィールドは8バイトである「フラグメントオフセット」。
  • BIT最終フラグメントフラグ(2)フラグメントが最後のフラグメントであることを示し、0です。
  • ターゲットホストのIP層、リロードに到達したすべてのフラグメントが完了した後、IPパケットを形成します。

(3)フラグメント処理例

4000Byteホストは、IPデータグラム、リンク層MTU = 1500Byte、元のIPデータグラムの断片化プロセスの必要性を送信します。

元のIPデータグラム(4000Byte)= IPヘッダ(20Byte)+データ領域(3980Byte)、データ領域が切断され、各スライスIP「フラグ」ヘッダを埋めるフィールドを「フラグメントオフセット」。

最初のフラグメント: "フラグ" フィールドのビット(2)= 1、0のフラグメントオフセット、データスライスパケット長(1500Byte)= IPヘッダ(20Byte)+データ領域(1480Byte)。

第2の断片: "フラグ" フィールドのビット(2)= 1、フラグメントオフセット185(8分の1480)、スライスデータパケット長(1500Byte)= IPヘッダ(20Byte)+データ領域(1480Byte) ;

第3のサブシート: "フラグ" フィールドのビット(2)= 0は、断片は、スライスデータパケット長(1040Byte)=(20Byte)+ IPヘッダデータ領域(1020Byte)370(185 + 185)をオフセット。

 (4)フラグメント処理ソース

フラグメント処理源は、IPデータグラムの「lwip_2_1_2 / SRC /コア/のIPv4 / ip4_frag.c」、呼び出し先ホスト「ip4_frag()」関数を配置し、断片化工程に送られます。

4. IPデータグラムを送受信します

IPデータグラムの送信及び受信は、ソースが配置されている:lwip_2_1_2 / SRC /コア/のIPv4 / ip4.c

送信された4.1 IPデータグラム

  •  ときに、トランスポート層の必要データを送信するために、IPネットワーク層プロトコルに送信すべきデータ転送の必要性、IP層がIPデータグラムを送信する「ip4_output()」関数を呼び出します。
  • 「Ip4_output()」関数呼び出し「ip4_route_src()」関数は、条件に一致する宛先IPアドレスのリストに応じて適切なNICカードを選択:宛先IPアドレスとネットワークカードアドレスにサブネット、または宛先IPアドレスは、ゲートウェイカードに等しいですアドレス。その後、IPデータグラムを送信する機能「()ip4_output_if」と呼びます。
  • IPデータグラムヘッダ、IPヘッダ情報を入力し、IPデータグラムの分類の開始アドレスへのペイロード・ポインタを調整する「Ip4_output_if_src()」関数。宛先IPアドレスは、ホストの送信元IPアドレスに等しい場合、入力する機能ループバック「netif_loop_output()」と呼ばれ、IPデータグラム長がMTUを超えた場合、「ip4_frag()」関数断片化伝送と呼ばれ、そうでない場合は直接呼び出す「では、netif - > IPデータグラムインタフェース出力は、」送信用にARPプロトコルに渡されます。

4.2 IPデータグラムを受信します

  • リンク層は、IPデータグラムを受け取り、その後、「ip4_input()」関数に渡さ「ethernet_input()」関数によって処理されます。
  • 次いで、「Ip4_input()」プロトコルバージョンIPv4のIPデータグラムヘッダか関数を最初にチェックし、宛先IPアドレスに基づいてローカル・ネットワーク・アダプタ・カード・リストに有効な標的を見つけます。宛先IPアドレスはループバックアドレスの宛先IPアドレスかどうかを決定する「ip4_addr_isloopback()」関数を介して、ホストアドレスと等しくない場合。先カードに一致する場合、次にスライスへの呼び出し「ip4_reass()」機能のリロード、および指定されたトランスポート層プロトコルにデータを渡します。あなたはブロードキャストパケットのために、対象カードが見つからない場合は、直接データが非ブロードキャストパケットについて報告削除機能「ip4_forward()」を介して転送することができます。

5.参考文献

1.野火「LWIPアプリケーション開発の実用的なガイド。」

おすすめ

転載: www.cnblogs.com/linfeng-learning/p/12456138.html