[[ネットワーク講座]] > TCP/IPプロトコル

#norelated

#contents

* TCP/IPネットワークアーキテクチャとは? [#ka1d22e1]
TCP/IP[[ネットワークアーキテクチャ]]とは、[[TCP]]や[[IP]]を中心とした、様々な[[プロトコル]]の集まりを指しています。
TCP/IPネットワークアーキテクチャは、4つの階層から成っています。

| [[レイヤ]] | コンピューター内部の対応 |h
| [[アプリケーション層]] | アプリケーション(Webブラウザなど) |
| [[トランスポート層]] | OS |
| [[インターネット層]] |~|
| [[ネットワークインターフェース層]] | [[NIC]](Network Interface Card) |

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=TCP%2FIP&openfile=image106.PNG

* OSI参照モデルとの対応は? [#ed468a08]

| [[OSI参照モデル]] | [[プロトコル]] | [[TCP/IP]] |h
| [[アプリケーション層]] | [[HTTP]]、[[DNS]]、[[DHCP]]、[[SNMP]]、[[SMTP]]など | [[アプリケーション層]] |
| [[プレゼンテーション層]] |~|~|
| [[セッション層]] |~|~|
|~|BGCOLOR(#FFCCCC):[[TCP]]、[[UDP]] |BGCOLOR(#FFCCCC):[[トランスポート層]] |
| [[トランスポート層]] |~|~|
| [[ネットワーク層]] |BGCOLOR(#FFCCCC):[[IP]]v4/v6、[[ARP]]、[[ICMP]]、[[OSPF]]、[[EIGRP]]、[[IGRP]] |BGCOLOR(#FFCCCC):[[インターネット層]] |
| [[データリンク層]] | [[イーサネット]]、[[トークンリング]]、[[FDDI]]、[[ATM]]、[[フレームリレー]]、[[PPP]]など | [[ネットワークインターフェース層]] |
| [[物理層]] |~|~|

*** ネットワークインターフェース層とは? [#pe09a0fc]
TCP/IPの[[ネットワークインターフェース層]]は、[[OSI参照モデル]]の[[物理層]]に相当します。
ネットワークインターフェース層に含まれる[[プロトコル]]は、
- [[LAN]]のプロトコル:[[イーサネット]]、[[トークンリング]]など
- [[WAN]]のプロトコル:[[フレームリレー]]、[[ATM]]、[[PPP]]など
です。

TCP/IPでは、ネットワークインターフェース層の仕様を特に規定していません。
つまり、TCP/IPのプロトコルは、ネットワークインターフェース層から独立しているので、あらゆるネットワークでTCP/IPを利用した通信を行うことができます。

*** インターネット層とは? [#sfdfd0e2]
TCP/IPの[[インターネット層]]は、[[OSI参照モデル]]の[[ネットワーク層]]に相当します。
インターネット層には、TCP/IPの中心的な[[プロトコル]]である、[[IP]]が含まれています。
IPの他に、[[ARP]]、[[ICMP]]、[[OSPF]]などのプロトコルも含まれています。

*** トランスポート層とは? [#f3c66d55]
TCP/IPの[[トランスポート層]]は、[[OSI参照モデル]]の[[トランスポート層]]と[[セッション層]]の一部に相当します。
トランスポート層には、[[TCP]]と[[UDP]]の二つのプロトコルがあります。

*** アプリケーション層とは? [#tf4cdea3]
TCP/IPの[[アプリケーション層]]は、[[OSI参照モデル]]の[[セッション層]]の一部、[[プレゼンテーション層]]、[[アプリケーション層]]とに相当します。
アプリケーション層には、[[HTTP]]、[[DNS]]、[[DHCP]]、[[SNMP]]、[[SMTP]]など、数多くのプロトコルが含まれています。

* プロトコルの連携によるデータの流れは? [#n6061758]
例えば、WebサーバへアクセスしてWebサイトを見る場合、次のようなプロトコルが連携しています。

| [[レイヤ]] | [[プロトコル]] |h
| [[アプリケーション層]] | [[HTTP]] |
| [[トランスポート層]] | [[TCP]] |
| [[インターネット層]] | [[IP]] |
| [[ネットワークインターフェース層]] | LANやWANのネットワークの種類によって異なる(=TCP/IPでは規定していない) |

CENTER:&ref(zu_02.png);
>http://ascii.jp/elem/000/000/424/424788/index-2.html

CENTER:&ref(tcpip_encapsulation.jpg);
> http://www.hndtc.co.jp/p090/p090_004_tcpip.html

CENTER:&ref(network2-7.gif);
> http://takaq1.plala.jp/contents/jitaku_server/network/network2-7.htm 

CENTER:&ref(fig2-6.png);
> http://togodb.seselab.org/pukiwiki/Network/%B3%AC%C1%D8%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB%A4%C8TCP/IP.html

* 階層ごとのデータの名称は? [#s6daf2f3]
TCP/IPネットワークアーキテクチャでは、各階層ごとに、データの呼び名があります。

| [[レイヤ]] | データの名称 |h
| [[アプリケーション層]] | メッセージ |
| [[トランスポート層]] | セグメント/[[データグラム]] |
| [[インターネット層]] | [[パケット]] |
| [[ネットワークインターフェース層]] | [[フレーム]] |

* インターネット層のプロトコルは? [#if8d2080]

** (1) IPとは? [#wd40a1ee]

CENTER:&size(50){IP = &color(red,pink){Internet Protocol};};

[[IP]](Internet Protocol)は、[[TCP/IP]]の名前の由来にもなっている、代表的な[[プロトコル]]です。
IPによって[[エンドツーエンド]]の通信ができます。

IPによって運ばれるデータを、IPパケットと呼びます。
IPパケットには、[[IPヘッダ]]が含まれています。
IPヘッダの情報によって、[[ルータ]]が適切な[[ルーティング]]を行い、エンドツーエンドの通信が可能となります。

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0&openfile=zu01.gif
>http://www.atmarkit.co.jp/fnetwork/tokusyuu/11mpls/mpls01.html
ルータの基本的な動作。
ルータにパケットが到着するたび、ルーティング・プロトコルにより学習したルーティング・テーブルとあて先IPアドレスを参照して、ネクスト・ホップへパケットをフォワーディングする。

*** IPv4ヘッダフォーマットとは? [#l19914e3]
&color(,pink){ 詳細 → [[IPヘッダ]] };

IP[[パケット]]は、[[IPヘッダ]]とデータ(IP[[ペイロード]])で構成されています。

|>|BGCOLOR(pink):CENTER: IPパケット |
| IPヘッダ | IPペイロード |

- IPv4のヘッダは、&color(red){12のフィールド};と&color(red){オプション};で構成されています。
- オプションを含まない、12のフィールドだけのIPヘッダ長は、&color(red){20バイト};です。
- オプションが追加された場合でも、必ず&color(red){4バイト単位で増える};ように調整されています。
- IPヘッダ長は、&color(red){最大で60バイト};です。=オプションは最大で40バイトまで追加できます。

** (2) ARPとは? [#rafa2924]

&color(,pink){ 詳細 → [[ARP]] };

[[ARP]] (Address Resolution Protocol)は、[[イーサネット]]などの[[LAN]]上で、[[TCP/IP]]通信を行う際に必要な[[プロトコル]]です。
- [[TCP/IP]]では[[IPアドレス]]
- [[LAN]]では[[MACアドレス]]
を利用して、通信を行うが、この二つのアドレスはお互いに関連していない。

- 関連していない&color(red){IPアドレスとMACアドレスを対応させる};役割を持つプロトコルが[[ARP]]
- ARPによって、(MACアドレスの)アドレス解決を行い、イーサネットのフレームを生成シテ、ネットワーク上に送信できる。
- ARPは、ARPリクエストとARPリプライによって、目的のIPアドレスに対応するMACアドレスを求める。

| レイヤー | | アドレス |h
| L3 | [[TCP/IP]]、[[ARP]] | [[IPアドレス]] |
| L2 | [[イーサネット]]などの[[LAN]] | [[MACアドレス]] |

*** GARPとは? [#cf6c4203]

&color(,pink){ 詳細 → [[GARP]] };

自分自身のIPアドレスに対する[[ARP]]を、Gratuitous ARP([[GARP]])と呼ぶ。
「Gratuitous」とは「余計な」という意味。

GARPの目的は、主に次の2つ。
- IPアドレスの重複検出
- ARPキャッシュの更新

*** RARPとは? [#ib4491c2]
&color(,pink){ 詳細 → [[RARP]] };

Reverse ARPのこと。[[ARP]]と逆の働きをする。

- 機器によっては、電源をオフにすると[[IPアドレス]]を保持できない。
- 機器の起動時に、自動的にIPアドレスを取得するためのプロトコルが[[RARP]] (Reverse ARP)。
- &color(red){MACアドレスからIPアドレスを取得する。};
- RARPの動作には、RARPサーバの用意が必要。
あらかじめ、RARPサーバにMACアドレスに対応するIPアドレスを登録しておく。
- RARPクライアントがRARPサーバから、自分のMACアドレスに対応するIPアドレスを取得する。

** (3) ICMPとは? [#k2037662]
&color(,pink){ 詳細 → [[ICMP]] };

- [[ICMP]] = Internet Control Message Protocol インターネット制御通知プロトコル
- [[IP]]のエラーメッセージや制御メッセージを転送するプロトコル。
- [[OSI参照モデル]]でいえば、L3([[ネットワーク層]])のプロトコル。
- [[TCP/IP]]でいえば、[[インターネット層]]のプロトコル。

| 機能 | コマンド | 内容 |h
| エラーレポート機能 | [[traceroute]]| どのような経路を通っていくか追跡する |
| 診断機能 | [[ping]] | 目的の相手と通信できるか=接続性を確認する |

* トランスポート層のプロトコルは? [#vfba827d]

** (1) ポート番号とは? [#b2ccfa96]
&color(,pink){ 詳細 → [[ポート番号]] };

- [[ポート番号]]とは、[[TCP/IP]]プロトコルスタックのアプリケーションプロトコルを識別するための識別番号。
- [[TCP]]または[[UDP]]の[[ヘッダ]]に記述され、上位のアプリケーションが何であるかを示す。
- [[IPアドレス]]によって目的のホストまで届けたら、次に[[ポート番号]]によって目的のアプリケーションまでデータを送り届ける。

ポート番号には、
+ [[ウェルノウンポート>ウェルノウンポート番号]](0~1023)
+ [[ランダムポート>ランダムポート番号]](1024~65535)
の二種類がある。

ウェルノウンポートは、RFC1700で定義されている。

** (2) TCPとは? [#cad96580]
&color(,pink){ 詳細 → [[TCP]] };

- TCP = Transmission Control Protocol
- [[TCP/IP]][[ネットワークアーキテクチャ]]における[[トランスポート層]]の[[プロトコル]]

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB&openfile=zu2.gif

TCPの特徴
+ [[ポート番号]]を使用して、適切なアプリケーションにデータを送り届ける。
+ [[コネクション型プロトコル]]である。
+ [[3ウェイハンドシェイク]]で、TCP[[コネクション]]を確立する。
+ 送信データに[[シーケンス番号]]を付けて、データの[[順序制御]]を行う。
+ 送信データの確認応答がない場合は、エラー発生とみなして、データを再送する[[再送制御]]を行う。
+ ネットワークの混雑度合いに応じて、送信するデータ量を調整する[[フロー制御]]を行う。

*** TCPヘッダのフォーマット [#k6e53864]
&color(,pink){ 詳細 → [[TCPヘッダ]] };

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=TCP%E3%83%98%E3%83%83%E3%83%80&openfile=fig01.gif

- 送信元ポート番号・宛先ポート番号
送信元の[[ポート番号]]、宛先の[[ポート番号]]を格納する。

- [[シーケンス番号]]
送信するデータの順序を示す32ビットの番号。
→ [[順序制御]]

- ACK番号
データを受信した確認通知と、次に送信を期待するシーケンス番号を通知する。
送信データに対する[[ACK]]が返ってこない場合は、再送する。
→ [[再送制御]] (エラー制御)

- データオフセット
[[TCPヘッダ]]の長さ(ヘッダ長)を示す。

- 予約
未使用領域。

- フラグ
6ビットのフィールド。
TCPセグメントの種類を示すビットが格納される領域。

| フラグ | 意味 | 動作 |h
| [[URG]] | 緊急 | 優先的に送信する必要があるデータを含んでいることを示す。 |
| [[ACK]] | 応答 | [[コネクション]]を確立する最初のTCPセグメント(=接続要求)以外は、すべてのTCPセグメントでACK=1 |
| [[PSH]] | 強制転送 | 受信したデータをバッファに貯めず、すぐに上位のアプリケーションに渡す。(TELNETのエコーバック等) |
| [[RST]] | 強制終了 | [[コネクション]]の強制終了を要求する。 |
| [[SYN]] | 同期 | 接続要求に使う。SYN=1のTCPセグメントのシーケンス番号に、自身のACK番号を同期させる。 |
| [[FIN]] | 送信終了 | [[コネクション]]の正常終了を要求する。 |

- [[ウィンドウサイズ]]
受信側の一度に受信可能なデータ量。
送信側に通知する。
送信側は、ウィンドウサイズを超えないように、データ量を調整する。
→ [[フロー制御]]

- チェックサム
[[TCPヘッダ]]とデータ部分([[ペイロード]])のエラーチェックを行うために利用する。

- アージェントポインタ
[[URG]]フラグが立っているときのみ有効で、緊急データの開始位置を示す。

*** [[コネクション]]の確立 [#b6f4e47f]

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=3%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF&openfile=connection_start.jpg

~
| TCPセグメント(送信数) | 送信方向 | [[SYN]] | [[ACK]] |h
| TCPセグメント1 | A → B | 1 | 0 |
| TCPセグメント2 | B → A | 1 | 1 |
| TCPセグメント3 | A → B | 0 | 1 |

- TCPセグメント1:AからBへの接続要求。
これは最初のTCPセグメントで、それ以前の受信確認がないため、ACK=0である。
- TCPセグメント2:BからAへの接続要求(SYN=1)+TCPセグメント1に対する応答(ACK=1)
- TCPセグメント3:AからBへのTCPセグメント2に対する応答(ACK=1)

3回の挨拶が必要なので、[[3ウェイハンドシェイク]]と呼ばれる。

*** [[コネクション]]の切断 [#ca89cfad]

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=3%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF&openfile=connection_end.jpg

~
| TCPセグメント(送信数) | 送信方向 | [[FIN]] | [[ACK]] |h
| TCPセグメント1 | A → B | 1 | 1 |
| TCPセグメント2 | B → A | 0 | 1 |
| TCPセグメント3 | B → A | 1 | 1 |
| TCPセグメント4 | A → B | 0 | 1 |

- TCPセグメント1:AからBへの切断要求。
- TCPセグメント2:BからAへの応答。
- TCPセグメント3:BからAへの切断要求。
- TCPセグメント3:AからBへの応答。

双方向に形成しているTCP[[コネクション]]の切断は、片方向ずつ行うため、4回の挨拶を交わす。
AとBがお互いに[[FIN]]フラグ=1で、相手に対して切断要求を行ってから、TCPコネクションを解放する。
FINによる正常終了ではなく、一方の都合で強制終了したい場合は、[[RST]]フラグ=1にして送りつける。

** (3) UDPとは? [#e2482ebc]
&color(,pink){ 詳細 → [[UDP]] };

- [[UDP]] = User Datagram Protocol の略。
- [[TCP]]と同じく[[TCP/IP]]ネットワークアーキテクチャの[[トランスポート層]]の[[プロトコル]]。
- UDPは、[[コネクションレス型プロトコル]]で、上位のアプリケーションにデータを渡す以外は、基本的に何もしない。

*** UDPヘッダのフォーマット [#v45904ca]
- [[TCPヘッダ]]は20バイトだが、UDPヘッダは8バイト。
[[オーバーヘッド]]が小さいので高速。

CENTER:http://program.sagasite.info/wiki/index.php?plugin=attach&refer=UDP&openfile=fig05.gif

- 送信元ポート番号・宛先ポート番号
送信元の[[ポート番号]]、宛先の[[ポート番号]]を格納する。
- データグラム長
- チェックサム

*** UDPの用途 [#q6a1192b]
| 用途 | 事例 |h
| リアルタイム性のあるデータを転送 | [[VoIP]](IP電話) |
| 複数の相手に同じデータを転送 | ストリーミング(テレビ会議) |
| 少量のデータで、信頼性を必要としない転送 | [[DNS]] |

- [[TCP]]は、1対1の通信([[ユニキャスト]])しかできない。
- [[UDP]]は、1対多の通信([[マルチキャスト]]、[[ブロードキャスト]])ができる。

*** TCPとUDPの信号名 [#adad47c2]
| [[プロトコル]] | プロトコルで扱われる信号の呼び名 |h
| [[TCP]] | セグメント |
| [[UDP]] | [[データグラム]] |

* アプリケーション層のプロトコルは? [#k6b9cd81]
[[TCP]]や[[UDP]]の上位層([[アプリケーション層]])で働くプロトコルの代表例。

- [[HTTP]] (Hypertext Transfer Protocol ハイパーテキスト転送プロトコル)
Webアクセスを行うためのプロトコル
TCPのポート番号は80を使用

- [[SMTP]] (Simple Mail Transfer Protocol 簡易メール転送プロトコル)
電子メールを送信するためのプロトコル
TCPのポート番号は25を使用

- [[POP]] (Post Office Protocol)
電子メールを受信するためのプロトコル
TCPのポート番号は、POP2では109、POP3では110を使用

- [[IMAP]] (Internet Message Access Protocol)
電子メールを受信するためのプロトコル
TCPのポート番号は、IMAP2とIMAP4では143、IMAP3では220を使用

- [[DHCP]] (Dynamic Host Configuration Protocol)
[[TCP/IP]]で通信を行うために必要な情報=[[IPアドレス]]、[[サブネットマスク]]、[[デフォルトゲートウェイ]]など、様々な設定を自動的に取得するためのプロトコル
UDPのポート番号67、68を使用

- [[DNS]] (Domain Name System)
ホスト名とIPアドレスの対応付けを行うプロトコル
TCP/UDPのポート番号53を使用

- [[FTP]] (File Transfer Protocol)
ファイル転送を行うためのプロトコル
TCPのポート番号20、21を使用

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS