ネットワーク｜TCP/IP

#TCP/IPとは
TCP/IP(Transmission Control Protocol/Internet Protocol)は、現在のインターネット通信およびイントラネット通信において最も利用されている通信プロトコル。TCP/IPは複数のプロトコルから成田、中心的な役割を果たすのがTCPとIPであることからTCP/IPと呼ばれている。
※IP通信で使用するプロトコル郡｜IP, ICMP, TCP, UDP, HTTP, SMTP, SSH, TELNETなど

##TCP/IPの階層モデル
TCP/IPにおける階層モデルは４階層から構成されている。
アプリケーション層、トランスポート層、インターネット層、ネットワークインターフェイス層からなる。

![スクリーンショット 2019-10-09 10.16.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/35b972bb-ade0-8db3-4290-7f28500a08e8.png)

|TCP/IPプロトコルスタック|各層の役割|
|---|---|
|アプリケーション層|主にアプリケーションごとの固有の規定。この層ではHTTP,FTP,SMTP,SSHなどのアプリケーション層のプロトコルにより、通信アプリケーションの機能が実現される。|
|トランスポート層|主にノード間のデータ転送の信頼性を確保するための規定。この層では、TCPまたはUDPのプロトコルを使用する。TCPを使用する場合、信頼性の高い通信を実現する。UDPを使用する場合、信頼性ではなく効率重視のデータ転送を実現する。|
|インターネット層|主にネットワーク間のEnd-to-Endの通信のための規定。この層では、IPが代表的なプロトコルになる。IPにより、ネットワーク上のノードに対し自分の位置情報となる論理アドレス(IPアドレス)を割り当てられるのでEnd-to-Endの通信を実現する。|
|ネットワークインターフェイス層|主に直接的に接続されたノード間の通信のための規定。この層ではLANプロトコルはイーサネット、WANプロトコルはPPPが代表的なプロトコル。イーサネットでは、セグメント上のノードに対して、自分の位置情報となる物理アドレス(MACアドレス)を割り当てることができるので、ローカルでのノード間通信を実現することができる。|


コンピュータ間で通信する場合、以下のように送信側でカプセル化、受信側で非カプセル化を行なっている。また下位層ではアプリケーション側のプロトコルがHTTPであろうと、FTPであろうとただのデータとしてしか認識しない。
※カプセル化/非カプセル化によるメリットがよくわからないので後ほど調べて記載する。

![](https://www.infraexpert.com/studygif/tcpip3.gif)
[※参照元](https://www.infraexpert.com/study/tcpip.html)
各層でのヘッダとは、各層の制御情報のことを指している。


#IPとは
IP(Internet Protocol)は、OSI参照モデルではネットワーク層で動作するプロトコルであり、TCP/IPの階層モデルにおいてはインターネット層で動作するプロトコル。
IPは論理アドレス(IPアドレス)を各ノードに割り当てることで、各ノードを識別することができる。このIPアドレスの宛先を確認することで、あるノードから別ノードへデータ送信することができる。IPアドレスの宛先情報についてはIPヘッダに含まれている。

![](https://www.infraexpert.com/studygif/tcpip4.gif)

##IPヘッダのフォーマット
IPヘッダは20バイトのサイズ。オプションが追加された場合は最大で60バイトのサイズになる。データはIPヘッダではなくIPペイロードと呼ばれる部分となる。

![](https://www.infraexpert.com/studygif/tcpip5.gif)

|各フィールド|英語表記|ビット|各フィールドの説明|
|---|---|---|---|
|バージョン|version|4bit|IPヘッダのバージョン番号の情報。IPv4では「4」の値が入る。|
|ヘッダ長|IHL|4bit|IPヘッダの長さの情報。単位は32ビットであることからオプションを使用しない。IPパケットの場合、「5」の値が入る。32bit×5=160bit=20byte|
|サービスタイプ|Type of Service|8bit|IPパケットの優先順位の情報。例えば音声トラフィックとデータトラフィックとでは音声トラフィックのデータを優先して送出することができる。|
|全長|total length|16bit|IPヘッダを含むパケットの全長。|
|識別番号|identification|16bit|個々のパケットを識別するための情報。パケットが分割された時に分割されたパケットには同じ識別番号にすることで、受信側で複数の分割されたパケットを受信した場合においても、この識別番号に基づき正しく組み立て処理できる。|
|フラグ|Flags|3bit||パケット分割における制御の情報。|
|フラグメントオフセット|Flagment Offset|13bit|フラグメントされたパケットが元のパケットのどの位置であったかを示す情報|
|生存時間|time to live(TTL)|8bit|パケットの生存時間を示す情報。|
|プロトコル|Protocol|8bit||上位層(トランスポート層)のプロトコルが何であるかを示す情報。|
|ヘッダチェックサム|Header Checksum|16bit|IPヘッダのチェックサムを表す情報。IPヘッダにエラーがないかを確認するために利用。|
|送信元IPアドレス|Source Address|32bit|32bit(4byte)で構成された送信元のIPアドレスの情報|
|宛先IPアドレス|Destination Address|32bit|32bit(4byte)で構成された宛先のIPアドレスの情報|
|オプション|Options|可変長|通常は使用されないが、デバッグやテストを行う際に利用される情報|
|パティング|Padding|可変長|通常は使用されないが、上記のオプションを使用した場合に、IPヘッダ長が32ビットの整数倍にならない場合がある。32ビットの整数倍にするために詰め物として空のデータの0の値を入れることにより調整する。|

IPヘッダのフィールドにある「フラグ」の値には以下の3bitの組み合わせが値として入る

|ビット|意味|値|
|---|---|---|
|先頭ビット 0|未使用|0|
|中央ビット 1|パケットのフラグメントを許可する<br>パケットのフラグメントを許可しない|0<br>1|
|最終ビット 1|分割された最後のフラグメントである<br>分割された途中のフラグメントである|0<br>1|

IPヘッダのフィールドにある「プロトコル」の値

|プロトコル番号|略称|プロトコル名|
|---|---|---|
|1|ICMP|Internet Control Message Protocol|
|6|TCP|Transmission Control Protocol|
|17|UDP|User Datagram Protocol|
|88|EIGRP|Enhanced Interior Gateway Routing Protocol|
|89|OSPF|Open Shortest Path First|

##IPプロトコルの特徴
IPプロトコルには特筆すべき3つの特徴がある。IPプロトコル自体には信頼性のあるものではない。信頼性のある通信にするかは上位層に任せてあり、TCPを使用すれば信頼性の高いTCP/IPの通信となる。UDPを使用した場合は、効率性の高いUDP/IPの通信となる。

|IPプロトコルの特徴|説明|
|---|---|
|コネクションレス型通信|ネットワーク通信に際して、事前にネットワーク間でコネクションを確立しないでいきなりデータ伝送をはじめる通信のこと。ただし、上位層プロトコルにTCPを使用した場合、コンピュータ間の通信で見ればコネクション型の通信となる。|
|ベストエフォート型通信|ネットワーク通信に際して、最善の努力は尽くすが、必ずしも十分な品質は保証しない通信のことを指す。しかし、上位層プロトコルにTCPを使用することで、IPを使用した通信でもパケット損失がないように見せることができる。|
|階層型アドレッシング|IPプロトコルにより割り当てられる論理アドレス(IPアドレス)はコンピュータが所属しているグループ(ネットワーク部)と、そのネットワークに接続されているコンピュータを識別する(ホスト部)のこれら2階層により構成されている。|

#TCPとは
TCP(Transmission Control Protocol)はトランスポート層で動作するプロトコル。
TCPの特徴は、信頼性の高い通信を実現するために3way handshake、確認応答、順序制御、再送制御、ウィンドウ制御、フロー制御などの機能を利用している。

##TCPのヘッダのフォーマット
![](https://www.infraexpert.com/studygif/tcpip23.gif)

|各フィールド|ビット数|各フィールドの説明|
|---|---|---|
|送信元ポート番号|16bit|送信元のポート番号の値|
|宛先ポート番号|16bit|宛先のポート番号の値|
|シーケンス番号|32bit|送信したデータの順序を示す値|
|確認応答番号|32bit|確認応答番号の値|
|データオフセット|4bit|TCPヘッダの長さを示す値|
|予約|6bit|全ビット「0」が入る|
|コントロールフラグ|6bit|URG, ACK, PSH, RST, SYN, FINの6ビットで構成される。これらのビットは「1」の値が入る場合に意味をなす|
|ウィンドウサイズ|16bit|受信側が一度に受信することができるデータ量を送信側に通知するために使用される。送信側は、この値のデータ量を超えて送信することはできない|
|チェックサム|16bit|TCPヘッダとデータ部分のエラーチェックを行うために使用される値が入る|
|緊急ポインタ|16bit|コントロールフラグのURGの値が「1」である場合にのみ使用されるフィールド。緊急データの開始位置を示す情報が入る|
|オプション|可変長|TCP通信において、性能を向上させるために利用する。例えば、TCPコネクションの際に、MSSを決定するために使用される。|
|パディング|可変長|TCPヘッダの長さを32ビットの整数にするために詰め物として空のデータの「0」の値を入れることにより調整する|

- コントロールフラグの詳細

|ビット|値が「1」である時の意味|
|---|---|
|URG(Urgent)|緊急に処理すべきデータが含まれていることを意味する|
|ACK(Acknowledgement)|確認応答番号のフィールドが有効であることを意味する。コネクション確立以外は値が「1」|
|PSH(Push)|受信したデータをバッファリングせずに、即座にアプリケーションに渡すことを意味する|
|RST(Reset)|コネクションが強制的に切断されることを意味する。何らかの異常を検出した場合に送信される|
|SYN(Synchronize)|コネクションの確率を要求することを意味する|
|FIN(Fin)|コネクションの正常な終了を要求することを意味する|

バッファリングとは？

##ポート番号とは
コンピュータが通信を行うために通信先のアプリケーションプロセスを特定するための番号。コンピュータ間の通信で通信する宛先のIPアドレスが分かれば、そのIPアドレスにデータを送信できるが、そのデータを受信したコンピュータが、どのアプリケーションでデータを受信するか判断する上で必要となる。

ポート番号は「0〜65535」の範囲で割り当てられている。このポート番号は3つに分類できる。

|ポート番号のタイプ|ポート番号の範囲|説明|
|---|---|---|
|well-knownポート番号|0〜1023|IANAで管理。サーバーのアプリケーションに割り当てられるポート番号|
|登録済みポート番号|1024〜49151|IANAで管理。独自に作成したアプリケーションに割り当てられるポート番号。|
|Dynamicポート番号|49152〜65535|クライアント側のアプリケーションに自動的に割り当てられるポート番号|

#UDPとは
UDP(User Datagram Protocol)は、トランスポート層で動作するプロトコル。
UDPの特徴は、TCPのように3way handshake、確認応答、順序制御、再送制御、ウィンドウ制御、フロー制御などの機能はなく、ほとんど何もしない。何もしないため信頼性は高くないが、速さやリアルタイム性を求める通信に利用される。

##UDPのヘッダのフォーマット
![](https://www.infraexpert.com/studygif/tcpip33.gif)

|各フィールド|ビット数|各フィールドの説明|
|---|---|---|
|送信元ポート番号|16bit|送信元のポート番号の値|
|宛先ポート番号|16bit|宛先のポート番号の値|
|パケット長|16bit|「UDPヘッダ」の長さと「UDPデータ」の長さの合計サイズ|
|チェックサム|16bit|UDPヘッダとデータ部分のエラーチェックを行うために使用される値|

##UDPの用途
1. 音声や映像などのリアルタイム性のあるデータを転送する場合
2. 複数の相手に同じデータを同時に転送する場合
3. 信頼性が必要なく、少量のデータ転送をしたい場合

など

##TCPとUDPの比較

|プロトコル|TCP|UDP|
|---|---|---|
|通信方式|コネクション型|コネクションレス型|
|信頼性|高い|低い|
|転送速度|低速|高速|
|上位プロトコル|http, telnet, ftp, pop...|DNS, NTP, DHCP, SNMP...|
|主な用途|Webの閲覧、メールの送受信、ファイル転送、共有|音声通話、Videoストリーミング、マルチキャスト通信、ブロードキャスト通信、少量のデータ転送|
|主な特徴|・ポート番号を利用した上位プロトコルへのデータ受け渡し<br>・コネクションの確率(3way hand shake)、維持、切断<br>・順序制御、再送制御、ウィンドウ制御、フロー制御|・ポート番号を利用した上位プロトコルへのデータ受け渡し<br>・オーバーヘッドが少ない(ヘッダが8byte)<br>・信頼性がない(パケットロスしても再送しない)|

#ICMPとは？
ICMP(Internet Control Message Protocol)は、IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコル。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用される。ICMPはインターネット層で動作するプロトコル。

##ICMPのフォーマット
![](https://www.infraexpert.com/studygif/tcpip11.gif)

ICMPメッセージは「タイプ」「コード」「チェックサム」「データ」の4つフィールドにより構成される。

|各フィールド|英語表記|ビット数|各フィールドの説明|
|---|---|---|---|
|タイプ|Type|8bit|ICMPメッセージの機能タイプの値が入る。|
|コード|Code|8bit|ICMPメッセージの詳細な機能コードの値が入る。|
|チェックサム|Checksum|16bit|エラーがないかどうかチェック|
|データ|Data|可変長|ICMPの「タイプ」により長さが異なる|

##ICMPの2種類のメッセージ
ICMPメッセージには大きく分類して2種類ある。
1. 問い合わせ(Querry)のメッセージ
　QUerryにより、あるノードから特定のノードに対する通信状態を確認することができる。(ping, traceroute)
2. エラー通知(Error)のメッセージ
　ノード間の通信で経路途中でパケットが廃棄された場合に、その原因を送信元のノードにエラー通知する。

- ICMPメッセージのタイプ一覧

|タイプ|内容意味|種類|
|---|---|---|---|
|0|Echo Reply|エコー応答|Query|
|3|Destination Unreachable|Error|
|5|Redirect|Error|
|8|Echo Request|Query|
|11|Time Exceeded|Error|

- ICMPメッセージのコード一覧


タイプが「0」= 「Echo Reply」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Echo Reply|エコー応答||

タイプが「3」= 「Destination Unreachable」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Net Unreachable|宛先ネットワークに到達できない|Error|
|1|Host Unreachable|宛先ホストに到達できない||
|2|Protocol Unreachable|プロトコルに到達できない|Error|
|3|Port Unreachable|ポートに到達できない|Error|
|4|Fragment Needed and DF was Set|パケットの分割が必要であるが分割禁止フラグ(DF)が立っているので、パケットを破棄|Error|
|5|Source Route Failed|ソースルーティングが失敗|Error|
|6|Destination Network Unknown|宛先ホストが不明|Error|
|7|Source Host Unknown|送信元ホストが使用されていない|Error|
|8|Source Host Isolated|送信元ホストが使用されていない|Error|
|9|Communication with Destination Network is Administratively Prohibited|宛先ネットワークとの通信が管理上禁止されている|Error|
|10|Communication with Destination Host is Administratively Prohibited|宛先ホストとの通信が管理上禁止されている|Error|
|11|Destination Network Unreachable for ToS|指定された優先制御値では、宛先ネットワークに到達できない|Error|
|12|Destination Host Unreachable for ToS|指定された優先制御値では、宛先ホストに到達できない||
|13|Communication Administratively Prohibited|通信が管理上禁止されている|Error|
|14|Host Precedence Violation|ホストの優先度が違反している|Error|
|15|Precedence cutoff in effect|優先制御が事実上切断された|Error|

タイプが「5」= 「Redirect」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Redirect Datagram for the Network|ネットワークへの最適経路変更を通知|Error|
|1|Redirect Datagram for the Host|ホストへの最適経路変更を通知|Error|
|2|Redirect Datagram for the ToS and Network|優先制御でネットワークへの最適経路を通知|Error|
|3|Redirect Datagram for the ToS and Host|優先制御でホストへの最適経路を通知|Error|

タイプが「8」= 「Echo Request」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Echo Request|エコー要求|Query|

タイプが「11」= 「Time Exceeded」の時

|コード|内容|意味|種類|
|---|---|---|---|
|0|Time to Live exceeded in Transit|転送中にTTLの値が超過した|Error|
|1|Fragment Reassemly Time Exceeded|分割パケットを組み立て中に時間が超過した|Error|

#ヘッダ比較

TCPヘッダ
![](https://www.infraexpert.com/studygif/tcpip23.gif)

UDPヘッダ
![](https://www.infraexpert.com/studygif/tcpip33.gif)

ICMPフォーマット
![](https://www.infraexpert.com/studygif/tcpip11.gif)