みなさんこんにちは!
(スキルアップIT講座)です。
今回は、トランスポート層について学びましょう。
今回は、トランスポート層プロトコルであるTCPとUDPについて学びます。
前提として、
・ ネットワーク階層モデルの知識
・ イーサネットの知識
・ イーサネットフレームの構造の知識
を必要とします。「インターネットワーキング」及び「イーサネット」・「イーサネットフレームの構造とデータリンク層アドレス」を未受講の方はそちらから受講した方が良いでしょう。
ネットワーク階層モデルの第4層、トランスポート層のプロトコルについて学びます。
トランスポート層のプロトコルは、ポート番号によってIPアドレス接続だけでは不可能なサービスや処理ごとでの通信を区別します。
トランスポート層のプロトコルにはTCPとUDPがあります。通信の用途・目的に応じてTCPまたはUDPを使い分けます。TCPは信頼性のある通信を提供します。信頼性よりも処理の軽さを利用するアプリケーションにはUDPを選択します。UDPを利用するアプリケーションプロトコルにDNS・TFTP・DHCPがあります。
TCPヘッダ・UDPヘッダにはアプリケーションで使用するポート番号を格納します。TCPかUDPかの区別はIPヘッダ内に格納してあります。
TCP(Transmission Control Protocol)は、信頼性のあるコネクション型のデータ転送を提供します。TCPの提供する信頼性とは、
シーケンス番号と応答確認番号による
「パケットの配信の保証」「正しいデータ順序送信の保証」
と、パケットヘッダとパケットデータの両方の正確さを検証する
「チェックサム機能の提供」
さらに、TCPパケットの損失した場合には
「パケットを再送信する機能」
です。パケットの再送信も確認応答で実現しています。
応答とは、Acknowledgementの事です。TCPでは送信側は受信側からの応答を期待して通信データを送信します。受信側は通信データを受信すると「届きました。」と応答を送信側に対して行います。送信側は受信側からの応答をかくにんして通信の正常性を確認します。
送信側が送る通信データにはシーケンス番号が格納してあります。シーケンス番号はその割り当てられたバイト列の応答確認番号として利用されます。特定の時間経過後、応答が戻らなかったバイト列は再送信されます。
パケットの受信順序が乱れても、シーケンス番号制御によってパケットの順序は正しく並び替えられアプリケーション層に引き渡されます。
確認応答とは、送信側の「確認」と受信側の「応答」で成立しています。
ウインドウ制御とは応答確認を待たずに次のデータを送る仕組みです。ウインドウ制御は効率の良い通信を実現します。TCPでは通信データを受信すると応答確認を送り返します。ウインドウ制御はこの確認応答の仕組みを利用しています。
データを受取った宛先は、内部バッファをオーバーフローすることなく受取れる最大のデータ量を応答確認で通知します。送信側は応答確認の内容から応答を待つことなく送れるパケット数を計算します。
ウインドウサイズとは応答確認一回で一度に送れるバイト数です。
1ウインドウサイズで一回分
2ウインドウサイズで二回分
になります。
最初のウインドウサイズはコネクション確立時に受信側から提示されます。1ウインドウサイズの場合、送信側はパケットを送るたびに確認応答を待ちます。
受信側のデータ処理が効率よく、受信バッファに空きが出ると、受信側は応答確認でウインドウサイズを大きくできるバイト数を通知します。2ウインドウサイズの場合、送信側は応答確認を待つことなく2パケットを送ることが可能です。
受信側のデータ処理が追いつかなく、受信バッファに空きがなくなる場合には、受信側はウインドウサイズを減らす応答確認を通知します。
TCPが確立するコネクション型のセッションは3ウェイハンドシェークで確立します。
送受信の両端で最初のシーケンス番号を承認することで両端を同期します。
3wayハンドシェイクはTCP通信の確立時に必ず行われます。では実際のトラフィックをキャプチャして見てみましょう。
これは送信側が受信側に対して送信した一つ目のパケットです。TCPヘッダの中にフラグ領域があり、SYNビットのみに1が立っています。このビットによってこのパケットがSYNパケットである事が判ります。
シーケンス番号は0です。
これは受信側からの応答確認です。SYNビットとACKビットに1が立っています。
応答確認番号は1です。これは送信側のシーケンス番号 + 1です。
シーケンス番号は0です。
ウインドウサイズを8760バイトと通知しています。送信側コンピュータのウインドウサイズの1/2のサイズです。
受信側からのSYN + ACKパケットを受け取った送信側が送ったACKパケットです。ACKビットのみ1が立っています。
応答確認番号は1です。これは受信側のシーケンス番号 + 1です。
シーケンス番号はSYNパケットのシーケンス番号 + 1です。
TCPのメリットは信頼性です。しかし信頼性の向上はオーバーヘッドの増加を生みます。そのためデータの転送速度が低下します。
信頼性よりも高速転送を重視する場合にはUDPを使用します。
トランスポート層のもうひとつのプロトコルがUDPです。UDPはコネクションの確立や応答確認を行いません。そのためオーバーヘッドがTCPより少ない通信が可能です。信頼性を重視しないアプリケーションには、処理の軽いUDPを選択しています。例えば、DHCP等のブロードキャストを使用したアプリケーションや、DNS(ドメインネームシステム)のような単発的でデータの交換の少ない問い合わせや応答に使用しています。
UDPの通信で信頼性確保が必要な時には、より上位層のプロトコルやアプリケーションによって信頼性を確保します。
UDPは全てのデータグラムが同じサイズです。フロー制御がないのでサイズを動的に設定しません。
UDPを利用している代表的なアプリケーションプロトコルを覚えておきましょう。 NFS・SNMP・DNS・TFTP・DHCP・RTP
がUDPを利用したアプリケーションプロトコルです。
実際のトラフィックをキャプチャしてみましょう。名前解決はWebブラウザでインターネット上のホスト名解決をするだけで簡単にキャプチャできます。
上の図はDHCPです。DHCP Requestは送信元がUDPポート68番・宛先がUDPポート67番です。IPアドレスから宛先がネットワーク全体を表しているので、IPブロードキャストパケットである事が判ります。送信元ポートをソースポート・宛先ポートをディスティネーションポートとも呼びます。
この図では判りませんが、1行下のDHCP ACKはソースポートがUDPポート67番・宛先ポートがUDPポート68番です。
下の図はDNSです。DNSはクライアント側ランダムポートのUDPパケットでサービス提供側がUDPポート53番です。
UDPパケットのフレーム構造を見てみましょう。プロトコルアナライザとしてイーサリアルを使用しました。そこでFCSは表示されません。
FCSを除いたフレーム長が185バイトです。IPv4パケットですからIPヘッダは20バイトです。そこでイーサネットヘッダ14バイトとIPヘッダ20バイトをフレーム長185バイトから除くと151バイトという値になります。
UDPヘッダ内にデータグラム長が151バイトと記述してあります。計算どおりです。
コンピュータ通信網におけるデータは「パケット」と呼ばれる単位に分割されて送られる、ということを既に述べました。この場合の「パケット」の定義は広義の意味になります。
ネットワーク階層モデルで各階層でのデータの呼び名があります。ここにも「パケット」という語が出てきます。
ネットワーク階層モデルの物理層では「ビット」です。物理層では光ケーブルやメタルケーブル・電磁波を通信メディアとして利用しています。その中を流れるデータは光信号・電気信号のパルスで、0もしく1のどちらかの状態を伝えます。
データリンク層では「フレーム」です。イーサネットを利用していれば「イーサネットフレーム」です。
ネットワーク層では「パケット」と呼びます。この層の有名なプロトコルにIPがあります。IPを利用していれば「IPパケット」です。分割せずに転送可能なIPパケットの最大サイズをMTUと呼びました。
トランスポート層では、コンピュータデータを「セグメント」もしくは「データグラム」と呼びます。トランスポート層のプロトコルであるUDPのDは「データグラム」ですね。TCPプロトコルを利用しているデータならば「セグメント」でOKです。
IPパケットを分割せずに転送可能な最大サイズをMTUと呼んだことを思い出してください。IPパケットからIPヘッダを除いた標準的なL3データはTCPヘッダとL4データをあわせたTCPセグメントです。このL4データで受信可能なセグメントサイズの最大値をMSS Maximum Segment Sizeといいます。
MTU値が1500バイトのとき、標準的なMSSはIPヘッダ20バイトとTCPヘッダ20バイトを引いた1460バイトになります。
本講義は以上です。
またお会いしましょう。それでは!