【IPプロトコルとは】
IPプロトコルは現在のインターネットで使われているプロトコルの基本となって
いるプロトコルで、OSIの第3層のネットワーク層に相当します。
従って、IPプロトコルでは異なったネットワーク間での機器間の通信を行う方法
を規定しており、指定された論理アドレスの機器間でデータを運ぶコンテナの
役割を果たします。
このコンテナの中に、上位層のプロトコルがカプセル化されて運ばれますが、
その上位層プロトコルの代表的なものが、TCPやUDPなどになります。
このためインターネットの通信プロトコルは、「TCP/IP」と呼ばれています。
【IPプロトコルのフレームフォーマット】
IPプロトコルの基本フレームフォーマットは下図の左側のようになっています。
そして実際のIPヘッダ部は右側のような値をセットして送信します。
オプションの部分はあるものと無いものがありますが、その区別はIPヘッダ部の
最初にあるデータ長で区別します。右図はオプションの無い場合の図です。
【IPフレームの内容】
このIPフレームの各フィールドの意味は下表のようになっています。
フィールド名称 機 能 と 内 容 備 考 バージョン IPプロトコルの規定のバージョン番号です。
現在はVer.4なので 4とします。オプション無しなら
あわせて 45H と
設定しますデータ長 4バイトを単位としたヘッダ長を表します。
オプション無しなら 20÷4=5 で 5とします。
オプションの有無をヘッダサイズで確認出来ます。 6以上であれば
4バイト単位でオプションデータがあることになります
TOS サービスタイプですが 00Hとします 全データ長 IPヘッダ+データのサイズをバイトで数え
2バイト長のバイナリ値で設定します。
上位バイト、下位バイトの順です。イーサネットサイズの
上限は1500バイトで
これが最大長識別子 0から始め送信パケットごとに+1する2バイトバイナリ値
最初の値は任意に決められます。フラグメント
オフセット1500バイトより大きなデータを送る場合にフラグメントに分割されて
その連番がオフセットとして設定される。
本説明でのライブラリは分割無しなので0です。最初は0を設定 生存時間 通過できるルータの台数を指定、通常はFFHとして最大数とします。 プロトコル種別 データの中にカプセル化した上位層プロトコルの種別を表します。
代表例 1: ICMP 6: TCP 17(11H): UDPチェックサム IPヘッダ部分だけのチェックサムでエラーチェックに使います。
計算の仕方は下記にあります。宛先IPアドレス 送る相手のIPアドレスを指定します。
この相手のMACアドレスが不明な場合には、自動的に
ARPプロトコルが送られてアドレスが解決されます。オプション オプションデータがある場合追加されるが通常は無い 4バイト単位で追加 データ IPフレームの中味として送られるデータそのもので、
ここにUDPとかTCPなどのプロトコルのデータが入る
【関連するRFC一覧】
インターネットのプロトコルについては、全てRFCでその仕様が規定されて
います。IPプロトコルに関する基本のRFCは下表のようになっています。
一度読まれることをお勧めします。
protocol 基本RFC 関連RFC ARP RFC826 IP RFC 791 RFC790、RFC792、RFC795、RFC796 ICMP RFC 792 RFC760、RFC777、RFC778、RFC791 TCP RFC 793 RFC790、RFC791 UDP RFC 768 RFC760、RFC761、RFC762 DHCP RFC 1541 RFC 783, RFC 792, RFC 887, RFC 903, RFC 951, RFC 1034,
RFC 1035, RFC 1122, RFC 1123, RFC 1191, RFC 1256,
RFC 1340, RFC 1497, RFC 1533, RFC 1534, RFC 1542.DHCP
optionsRFC 1533 RFC 868, RFC 887, RFC 893, RFC 894, RFC 950, RFC 951,
RFC 1001, RFC 1002, RFC 1035, RFC 1042, RFC 1122,
RFC 1179, RFC 1191, RFC 1198, RFC 1256, RFC 1305,
RFC 1340, RFC 1497, RFC 1531.
これらの詳細を図表でまとめて説明しているサイトがあります。
インターネットプロトコルに関する開発を行う方は、下記サイトが良い
参考になると思います。
★ RFC Resoucebook
【チェックサム計算方法】
送受信内容の誤りチェックのためにチェックサムコードを付加しますが、
このチェックサムは下記のように求めます。
まずチェックサムは2バイト幅なので、対象を転送順序で上位から始め上位、
下位、上位と交互に計算対象とします。
計算は各バイトの「1の補数」をチェックサムに加算していきます。
計算時にはチェックサムのフィールドは0000Hとしておきます。
1の補数の計算方法は、通常の2の補数で加算した結果にキャリーを加算する
方法で求めます。そのとき2バイトの演算なので、下位計算結果のキャリーは
上位に加算し、同じように上位の計算結果のキャリーは下位に加算します。
下位または上位にキャリーを加えたときさらにキャリーを上位または下位に加算
します。
最後の結果のビット反転してチェックサムフィールドに書き込みます。
このとき、反転後の結果が0000Hになったときは、さらに反転してFFFFHとして
書き込みます。
これは、0000hがチェックサムを使わないという特別な値になっているためです。
これをC言語で記述するときには、2バイトのlong型の変数で演算し、結果が
0xFFより大きいかどうかでキャリーの有無を判定します。大きいときには
結果から100Hを引いて上位あるいは下位にキャリー分の+1をします。
この実際の関数記述は下記のようにします。