【NET技術.005】TCPとUDPについて②
佐藤@IT雑貨屋です。
TCPとUDPは通信仕様の中核でもあるので、概要を説明するにしてもそれなりに紙片をとってしまいますので、ご容赦下さい。
◆TCPヘッダについて
TCPではフロー制御、順番制御、再送制御など様々な制御が機能しています。それらの制御により信頼性の高い通信を実現しています。TCPの機能はTCPヘッダの部分に詰め込まれています。以下にTCPヘッダのフォーマットを示します。
・送信元ポート番号
16ビット超で送信元のポート番号を示します。
・宛先ポート番号
16ビットで宛先ポート番号を示します。
・シーケンス番号
32ビットでシーケンス番号(順序番号)を示します。このシーケンス番号では送信
した順序を示しますが、これはコネクション確率時に初期値がランダムで決められ
SYNパケットで宛先に伝えられます。この番号は初期値に送信したバイト数で決め
られますが、SYNパケットやFINパケットもバイト数に数えられます。
・確認応答番号
3ビット長で確認応答番号を示します。この番号は次に受信すべきデータのシーケ
ンス番号です。確認応答番号から-1したシーケンス番号までのデータを正常に受信
したことを知らせます。
・データオフセット
4ビット長でTCPデータのデータがTCPパケットのどの部分から始まるかを示します。
TCPヘッダの長さと同じく4オクテット単位でTCPヘッダ長を示します。オプション
を含まないTCPヘッダの場合、TCPヘッダの長さは20オクテットなので、データ
オフセットは5となります。
・予約
将来の拡張のあめに用意されている4ビット長のフィールドです。デフォルトは0が
設定されます。
・コントロールフラグ
8ビット長で、ビット毎に意味をもつフラグです。
0bit:CWR
IPヘッダのECNフィールドと共に使用される。輻輳ウィンドウを小さくした事
を通信相手に伝える。
1bit:ECE
IPヘッダのECNフィールドと共に使用される。相手側からこちら側に向かう
ネットワークが輻輳していることを通信相手に伝える。
2bit:URG
このビットが1の場合、緊急に処理すべきデータが含まれている事を示す。その
データの格納先は緊急ポインタを使用して示す。
3bit:ACK
このビットが1の場合、確認応答版ふぉうの数値が有効であるこおを示す。
コネクション確率時の最初のSYNパケット以外は、必ず1でなければならない。
4bit:PSH
このビットが1の場合、受信したデータを直ぐに上位のアプリケーションに渡す
必要がある。0の場合にはすぐ渡さずバッファリングする事が出来る。
5bit:RST
このビットが1の場合、コネクションが強制的に切断される。何らかの異常が検出
された場合に利用する。
6bit:SYN
コネクションの確立に使われる。このビットが1の場合、コネクション確率を要求
すると共に、シーケンス番号に格納されている数字でシーケンス番号を初期化
する。
7bit:FIN
このビットが1の場合、以降送信するデータが無い事を示す。通信が終了し、
コネクションを切断したい場合に使用する。
・ウィンドウサイズ
16ビット長で、ウィンドウサイズを示します。ウィンドウサイズとは一度に受信
できるデータ量です。確認応答番号で示した位置から、受信可能なオクテット数を
示します。TCPでは、ここに示されているデータ量を超えて送る事は許されません。
・チェックサム
16ビット長でTCPヘッダとデータが破壊することを保証するためのチェックサムを
示します。チェックサム計算時には、IPアドレスを含むTCP疑似ヘッダを使用しま
す。TCPではチェックサムは省略できません。
・緊急ポインタ
コントロールフラグでURGフラグが1の場合に有効になる、緊急を要するデータの
格納場所を示すポインタです。データ領域の先頭から、この緊急ポインタで示される
数値分のオクテット数のデータが緊急を要するデータとなります。
・オプション
TCPによる通信の性能を向上させるために設定します。最大セグメント長(MSS:
Maximum Segment Size)を決定することや、セグメントが「歯抜け状態」で
届いた時、複数の確認応答を返すことができる選択確認応答(SACK:Selective
ACKnowledgement)を利用することなどが可能です。
◆TCPの管理
TCPはコネクション型通信を行いますが、その為に必要なのは通信相手との間でコネクション確率を、通信が終わったらコネクション開放を行う事です。
①クライアントは、最初のパケットでコントロールフラグのSYNを立ててコネクション
の確立をサーバー側に要求します。
②サーバはSYNに対して確認応答であるACKとSYNを立てた返信を行います。
➂クライアントはサーバからのSYNに対するACKを返し、コネクションが確立します。
上記一覧のコネクションの手続きを3ウェイハンドシェイクと言います。またこねくしょの解放は以下の流れとなります。
①コネクションを切断する側で、相手先に対してFINフラグを立てたパケットを
送ります。
②FINを受け取った相手側はACKを返送します。ただしFINを受け取った側では、直ぐに
FINを送る必要はなく、自分側でも送るデータが無くなった時にFINを相手側に送り
ます。
➂そしてそのFINを受け取った側がACKを返信した時点で、コネクションは開放
されます。
上記がコネクション開放の手続きですが、コネクション開放持には4パケットの通信が必要になります。
またTCPでは信頼性を提供するために、パケットの喪失(パケットロス)や重複、順序の入れ替わりなどをシーケンス番号と確認応答番号で行い、ウィンドウ制御によいパケットの順序を管理します。具体的にはパケットロスが検知された時には、再送処理が行われます。
◆TCPコネクションの範囲
TCPコネクションは、基本的に通信を行う相手との間で確立しますが、この「通信を行う相手」とは、最終的な目的の相手ではなく、中継転送される場合には、その為に通信する相手ホストとなります。例えばPCとインターネットを経由してサーバに接続に行く場合、PCからサーバにコネクションを確立するのではなく、PCの直上にあるルータ等の中継装置との間でコネクションは確立され、ルータはその先のネットワーク機器との間でコネクションを確立。その様にして最終的なサーバまでパケットは送信されていきます。