イーサネットLAN（５）【ICMP/ARPとTCP/UDP】

CCNAの試験に向けて学習中。
復習に見返せるようにメモしていきます。
ほぼ自分の勉強メモです。
過度な期待はしないでください。

1.ネットワーク層のその他の機能
-
#### 1-1.ICMP

ICMPは、Internet Control Message Protocolの略で、インターネット制御通知プロトコルとも言う。
ICMPは、<b>ネットワーク上での通信状況の確認や発生した各種エラー情報を報告する</b>ために
用いられるプロトコルです。

通信エラー発生時には、その場所からパケットの送信元に対してICMPによってエラー情報が通知されます。その結果、パケットの送信元は発生した障害内容を知ることができるわけです。
<img width="1000" alt="ファイル名" src="https://i.gyazo.com/873b8edf6478793e21d09b7350e08038.png">
<br>


#### 1-2.pingコマンド

pingコマンドとは、PCやサーバからルータへの通信が可能かどうかを確認する、
要は、宛先までIPパケットが到達しているどうかを確認するために使うコマンドです。 
pingコマンドは、ICMPメッセージを宛先の機器に送信し、応答の有無や内容によって
通信が可能かどうかを確認しています。

pingコマンドは、ICMPの<font color="Red">エコー要求</font>と<font color="Red">エコー応答</font>を利用して通信の可否を確認しています。

<img width="1000" alt="ファイル名" src="https://i.gyazo.com/a146f1175cab671bc6d0d350585c079a.png">
また、エコー要求に対し、何らかの理由で宛先まで到達出来なかった場合には、
エコー応答の代わりにエラーを示す<font color="Red">宛先到達不能</font>メッセージが返ってきます。
<br>


#### 1-3.ICMPヘッダ

ICMPヘッダは、<b>ICMPヘッダ</b>と<b>ICMPデータ</b>から構成されています。
ICMPヘッダの構成は以下の通りです。
<img width="1000" alt="ファイル名" src="https://i.gyazo.com/9ad79e6322198426a5a6ade12e60dda4.png">
<font color="DarkTurquoise">※上記の画像らは、[ICMPとは](https://medium-company.com/icmp/)という記事参照</font>

タイプ（Type）は、ICMPメッセージの種類の表します。
エコー応答は 0、 宛先到達不可能は 3、 エコー要求は 8、 時間切れは 11になります。
コード（Code）は、宛先到達不可能メッセージの場合にエラーの種類を示す値が入ります。
チェックサム（Checksum）は、エラーの有無をチェックする為のフィールドです。
<br>

#### 1-4.ARP(アープ)

ARPは、Address Resolution Protocolの略で、アドレス解決プロトコルとも言う。
ARPは、IPアドレスからMACアドレスを調べる為のプロトコルです。

ARPは、<font color="Red">ARP要求</font>と<font color="Red">ARP応答</font>という2種類のデータを送信し合ってMACアドレスを取得します。

■ARPでMACアドレスを取得する流れ

192.168.0.5のPCが、192.168.0.7のPCへ初めて通信する場合、
先ず、ARP要求を送信します。ARP要求で送られる内容は、
「IPアドレスが192.168.0.7のMACアドレスを教えて下さい。」
という問い合わせとなります。
<img width="500" alt="ファイル名" src="https://i.gyazo.com/29dcc665f5bef231d0fad62dd62bb95a.png">
<br>
<br>

対象の端末が分からない為、スイッチングハブは、ARP要求を受け取るとポートに繋がっている
全てのPCに問い合わせします。
これを、<b>ブロードキャスト</b>といいます。
<img width="500" alt="ファイル名" src="https://i.gyazo.com/47db8ac2d3fca4cba796c21843ddf592.png">
<br>
<br>

全端末は、ARP要求を確認し、自身のIPアドレスに対する問い合わせであった場合、
これに返答する為にARP応答を送信します。
該当の192.168.0.7のPCがARP応答で「私のMACアドレスはXXXです。」と返します。
対象でない端末はなにも応答しません。
<img width="500" alt="ファイル名" src="https://i.gyazo.com/9213f023f2b2e669154577552997bdb4.png">
<br>

取得した192.168.0.5のPCは、MACアドレスとIPアドレスをセットで<font color="Red">ARPテーブル</font>に保存され、
以降はARPテーブルを参照して通信します。
ARPテーブルには保存期間があります。保存期間が過ぎると再度取得します。
<br>

■ルータを通るARPの流れ

異なるネットワークに通信する際は、出入り口となるルータを通る必要があります。
異なるネットワークの出入り口を、<font color="Red">デフォルトゲートウェイ</font>といい、ここではルータがそれに
当たります。
PCには、このデフォルトゲートウェイのIPアドレスがあらかじめ登録されている必要があり、
登録されていなかった場合、他のネットワークとは通信出来ません。
その為に、ホストAは、先ずデフォルトゲートウェイのMACアドレスをARP要求で問い合わせます。
その際、MACアドレスを、ブロードキャストで問い合わせます。
ルーターは、ブロードキャストを通さない機器なので、このARP要求はセグメントB迄は届きませんが、
同じセグメント内の端末には届きます。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/b6b5fd7f765a87513445f5920439ac71.png">
<br>
<br>
ルーター(デフォルトゲートウェイ)がルーター自身のMACアドレスをARP応答で返します。
これによってホストAは、セグメントBにあるホストに送信したい場合は、ルーターにデータを
送信すればよくなります。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/ef1fcad498237f01ddbeadf7d23dc4bb.png">

この時のパケットの宛先は、
宛先IP：172.16.0.2
送信元IP：192.168.0.1
宛先MAC：0000.0000.aaaa
送信元MAC：aaaa.aaaa.aaaa
<br>
<br>

その後そのルーターは、宛先のIPアドレスを見て、宛先ネットワーク情報が登録されている
ルーティングテーブルを参照に、何処に転送すれば良いか調べます。
只、宛先となるホストEのMACアドレスがわからない為、ルーターはセグメントBにARP要求を流し、
宛先IPアドレスから宛先のMACアドレスを調べます。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/f097a5814a95c88606f8ad51f8bc20f4.png">
<br>
<br>

ホストEは、自身のMACアドレスをARP応答で返します。
これによってルーターから目的のホストへデータを送信することができるようになりました。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/7540f5fb3c301be24997152dd2d81fe0.png">
この時のパケットの宛先IPと送信元IPは変わりませんが、
MACアドレスは変わります。
このようにルーターは、<b>パケットを転送する際にMACアドレスの情報を書き換えます。</b>
宛先IP：172.16.0.2
送信元IP：192.168.0.1
宛先MAC：eeee.eeee.eeee
送信元MAC：0000.0000.bbbb

<br>

2.トランスポート層の概要
-
#### 2-1.トランスポート層の役割

トランスポート層の主な役割は、アプリケーション層で利用されているプロトコル間での通信を
制御する事です。
受信したデータを対象のアプリケーションに渡すと言いった橋渡しをするといった事を行います。

トランスポート層の代表的なプロトコルに<font color="Red">TCP</font>と<font color="Red">UDP</font>があります。
<br>

#### 2-2.TCP

TCPは、<font color="Red">コネクション型</font>のプロトコルです。
コネクション型とは、データの送信をする前に相手と通信出来るかどうかを確認し、
コネクション確立してからデータの送信を行います。

■TCPヘッダ

TCPでは、信頼性を確保する為、TCPヘッダに下記のような様々な情報を格納しています。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/92896499af02048e2aa12e4451ef5328.png">
送信元ポート番号：送信元のアプリケーションを示すポート番号
宛先ポート番号：宛先のアプリケーションを示すポート番号
シーケンス番号：送信するデータの順序を管理する為のフィールド
ACK番号：どこまで受信したかを管理する為のフィールドで、次に送信されるデータの
シーケンス番号になる
<br>

■TCPの主な役割

- 接続の確立

TCPにおいては、通信を開始する前にデータの送信元と宛先のホスト間で接続を確立する
必要があります。
使用される接続確立方法を、<font color="Red">3ウェイハンドシェイク</font>といい、
以下の手順の通り “3回のやりとり" によって確立されます。
<img width="500" alt="ファイル名" src="https://i.gyazo.com/f3e2cd47cf897cf21835fc8f9117adbb.png">
<b>SYNフラグ</b>：TCP接続の開始を要求する際に使うフラグで、
このフラグをつけて送信し、TCPでやり取りする端末間で同期します。
<b>ACKフラグ</b>：相手からの要求を承認して応答することを示す。
<b>シーケンス番号</b>：送信のデータの順番を示す
<b>確認応答番号（ACK番号）</b>：どこまで受信したかを通知する為の数値。

①ホストAからホストBにコネクション確立の要求をします。
　SYNフラグが「1」で、ACKフラグが「0」、ホストAからの送信データの起点となる
　シーケンス番号（ここでは「0」）を設定したTCP接続要求セグメントをホストBに送信します。

②ホストBはホストAのコネクション要求に応えます。
　そして、ホストBからもコネクション確立を要求します。
　SYNフラグが「1」で、ACKフラグが「1」、ホストBからの送信データの起点となる
　シーケンス番号（ここでも「0」）、ACK番号に受け取ったTCP接続要求に+１した値を
　返します（ここでは「1」）。

③ホストAもホストBからのコネクション要求に応えます。
　SYNフラグが「0」で、ACKフラグが「1」、
　シーケンス番号は「相手から受信したACK番号」なので「1」、
　ACK番号は②と同じ考え方で「相手から受信したシーケンス番号」に「+1」を加算した値となります。
　つまり、今回の場合は「1」です。
<br>


- 送信データの順序確保

TCPでは、<font color="Red">MSS</font>に合わせてデータを分割してデータを送信します。
※MSSとは、1回に送信出来るデータの上限
シーケンス番号により、同じデータが届いてしまっていないか重複チェックやデータの並び替えを
行う事ができます。また、確認応答番号（ACK番号）によりどこまでデータが届いたかを知る事が
できます。TCPでは信頼性を確保する為に、必ず確認応答を返す仕組みになっています。
<br>


- ウィンドウ制御とフロー制御

ウィンドウ制御とは、ウィンドウというばバッファ領域を用意し、送信データがウィンドウサイズに
達する迄は確認応答を待たないで、データをまとめて送る事。
こうする事で、確認応答を待たずに転送出来るので、転送の効率は向上します。

フロー制御とは、データ通信状況に応じて送信停止や速度制限、データ量を制御などの
調整を行う機能のこと。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/61d15caf6713f1172711730a9d501c8a.png">
<br>

#### 2-3.UDP

UDPとは、<font color="Red">コネクションレス型</font>のプロトコルであることから、
TCPに比べると信頼性がないものの高速に転送を行うことができます。
また、TCPはコネクションを確立して通信する為、1対1の通信となりますが、
UDPはコネクションを確立する必要性がない為、<b>ブロードキャスト</b>や<b>マルチキャスト</b>が可能です。

■UDPヘッダ

UDPでは、上位層（アプリケーション層）から渡されたデータにUDPヘッダを付加し、
それを<font color="Red">UDPデータグラム</font>として下位層に渡します。
UDPヘッダは、ヘッダサイズ（8byte）が少ない事から、<b>処理の付加が軽くなります。</b>

UDPヘッダには下記のような情報が格納しています。
<img width="700" alt="ファイル名" src="https://i.gyazo.com/01ee05c67b997a0e1903f021ed42405a.png">
<br>

■UDPヘッダの主な役割

UDPヘッダの役割は、出来るだけ早くデータを送信する事です。なので、TCPの主な役割の
ようなものはありませんが、上位層と下位層の橋渡しに適しています。

また、UDPヘッダは、TCPヘッダよりもヘッダサイズ（8byte）が少ない事から、
UDPヘッダは、その分アプリケーションのデータを多く送受信することができます。
ただし、パケットが到達する保証がないことから、パケットロスなどの場合アプリケーション側で
再送処理をして通信を成立させるかパケットロスが容認できるアプリである必要があります。

UDPヘッダは、信頼性の確保を行わない<font color="Red">ベストエフォート</font>な通信となります。
<br>

#### 2-4.ポート番号

ポート番号とは、アプリケーション層で利用されるプロトコルを識別する為の番号の事。
ネットワーク上では、IPアドレスを使ってホストを識別し、ホスト上で複数のアプリケーションを
利用している場合には、さらにポート番号を使ってアプリケーションを識別します。

■TCPでよく使用されるポート番号
<img width="700" alt="ファイル名" src="https://i.gyazo.com/4a55de3359266e23de2c7d9d410d156d.png">

■UDPでよく使用されるポート番号
<img width="700" alt="ファイル名" src="https://i.gyazo.com/cb5b051e35f3cd57821da4a87c73a2fc.png">



■3つの種類のポート番号
<img width="800" alt="ファイル名" src="https://i.gyazo.com/c72d34e3486cd37a56017cc6866b2f7f.png">

①<font color="Red">ウェルノウンポート番号</font>はサーバのアプリケーションに割り当てられます。
②登録済みポート番号は独自に作成されたアプリケーションに割り当てられます。
③のダイナミックポート番号はサーバとのプロセスに応じクライアントのアプリケーションに動的に割り当てられます。


参考記事
-
<font color="DarkTurquoise">※[ARP](https://ryo10leo.hatenablog.com/entry/2020/04/21/000445)という記事参照</font>
<font color="DarkTurquoise">※[TCPとUDPの違いとは？](https://hldc.co.jp/blog/2019/07/11/2819/)という記事参照</font>
<font color="DarkTurquoise">※[TCP three-way handshaking](https://www.infraexpert.com/study/tcpip9.html)という記事参照</font>
<font color="DarkTurquoise">※[ポート番号](https://beginners-network.com/port.html)という記事参照</font>

<br>
過去投稿記事
-
[ネットワークの基礎（１）【接続形態と通信方法】](https://qiita.com/k-yasuhiro/items/38d643ec262a0309db06)
[ネットワークの基礎（２）【プロトコル(OSI参照モデル)】](https://qiita.com/k-yasuhiro/items/0e5accf951223e2332e4)
[ネットワークの基礎（３）【プロトコル(TCP/IPモデル)】](https://qiita.com/k-yasuhiro/items/401630a552221d19ac13)
[イーサネットLAN（１）【LANケーブル】](https://qiita.com/k-yasuhiro/items/9c339643070d4db1e6ac)
[イーサネットLAN（２）【LAN内の機器】](https://qiita.com/k-yasuhiro/items/199d108007c6e1c2dbfc)
[イーサネットLAN（３）【ネットワーク層の機能と概要/IPアドレス】](https://qiita.com/k-yasuhiro/items/56598d2611b41762b8f3)
[イーサネットLAN（４）【サブネット化】](https://qiita.com/k-yasuhiro/items/b62312bd60e6b275359e)