TCP

TCP(Transmission Control Protocol)とは, 信頼性の高い通信を実現するためのプロトコル.

IPと同様, TCP/IPの中心的な存在であり, インターネットにおいて標準的に利用されている.

TCPはIPの上位層に位置するトランスポート層で動作するプロトコルである.

ネットワーク層のIPとセッション層以上のプロトコル(例: HTTP, FTP, Telnet)の橋渡しをする形で動作する.

一方UDPは, 信頼性は高くないが, 高速性やリアルタイム性を求められる通信で使用される.

どちらかが優れているという訳ではなく, 通信上の特性により使い分けるのが正しい.

ポート番号

ポート番号とは, ノード間で通信を行う際に, 通信先のアプリケーションを特定するための番号である.

ノード間の通信において, 宛先のIPアドレスが分かればそのIPアドレスにデータを送信できるが, データを受信したコンピュータがどのアプリケーションで処理するのかを判断する上で必要となる.

ポート番号は, 0 ~ 65535の範囲で割り当てられ, 以下に示す3種類に分類することができる.

種別 範囲 説明
ウェルノウンポート番号 0 ~ 1023 IANAで管理されている.
サーバのアプリケーションに割り当てられるポート番号.
登録済みポート番号 1024 ~ 49151 IANAで管理されている.
独自に作成したアプリケーションに割り当てるポート番号.
ダイナミックポート番号 49152 ~ 65535 クライアント側のアプリケーションに自動的に割り当てられるポート番号.

ウェルノウン(well-known)ポート番号, つまりよく知られたポート番号は, サーバのアプリケーションに割り当てられる.

登録済みポート番号は独自に作成されたアプリケーションに割り当てられ, 一般的にはサーバ側に割り当てられるが, クライアント側に割り当てられることもある.

また, これらの2つはIANAにて管理されている.

ダイナミックポート番号はクライアント側のアプリケーションで使用される.

ポート番号の仕組み

クライアント側のWebブラウザがWebページを開くためにWebサーバにリクエストする際, 宛先ポート番号を"80"と指定する.

これは, WebブラウザがWebサーバにアクセスする際にはポート番号80番のHTTPを使用すると決められているためである.

そして逆に, WebサーバからWebブラウザにレスポンスを返すには, クライアント側にもポート番号が必要となる.

クライアント側のポート番号はアプリケーションによりランダムに割り当てられる.

Webサーバがクライアントからパケットを受信すると, 送信元のIPアドレスと送信元のポート番号が分かるので, これらの情報を宛先としてレスポンスを返すことにより, 双方向の通信が実現する.

なお, クライアント側で複数のWebブラウザを開いている場合, Webブラウザ毎に正しくWebページを表示させるため, Webブラウザ毎に異なるランダムなポート番号が割り当てられる.

TCPにおける代表的なウェルノウンポート番号

TCPにおける代表的なウェルノウンポート番号は以下に示す通りである.

ポート番号 サービス名

TCPヘッダのフォーマット

TCPセグメントはTCPヘッダとTCPペイロードから構成され, TCPヘッダの中身は以下に示す通りである.

なお, TCPペイロードとは, TCPよりも上位のヘッダを含むデータのことを指す.

フィールド ビット数 説明
送信元ポート番号 16bit 送信元のポート番号の値が入る.
宛先ポート番号 16bit 宛先のポート番号の値が入る.
シーケンス番号 32bit 送信したデータの順序を示す値が入る.
この番号は, ランダムな値か相手から受信した確認応答番号の値である.
確認応答番号 32bit 確認応答番号の値が入る.
相手から受信したシーケンス番号とデータのサイズを加算した値が入る.
ただし, 3ウェイハンドシェイクの際はシーケンス番号に1を加算した値が入る.
データオフセット 4bit TCPヘッダの長さを示す値が入る.
予約 6bit 全ビット"0"が入る.
将来的な拡張のために用意されている.
コントロールフラグ 6bit URG, ACK, PSH, SYN, FINの6つで構成されている.
ウィンドウサイズ 16bit 受信側が1度に受信することができるデータ量を送信側に通知するために使用される.
チェックサム 16bit TCPヘッダとペイロードのエラーチェックを行うために使用される.
緊急ポインタ 16bit コントロールフラグのURGの値が"1"であるときにのみ使用されるフィールドである.
緊急データの開始位置を示す情報が入る.
オプション 可変長 TCPを用いた通信において, 性能を向上させるために使用される.
例えば, MSSを決定するためなどである.
パディング 可変長 TCPヘッダの長さを32ビットの整数倍にするために詰め物として空データの"0"を入れることにより調整する.

コントロールフラグ

以下のフラグは値が"1"である, つまりフラグが立っている場合に意味を成す.

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

TCPにおけるコネクションの確立

TCPはコネクション型通信を提供するプロトコルであるため, データ転送を行う前にコネクションの確立を行い, これを3ウェイハンドシェイクと呼ぶ.

まずはじめに, ホストAからホストBに対してコネクションの確立の要求をする.

TCPにおけるデータ転送

TCPにおけるコネクションの切断

MSS

順序制御

再送制御

ウィンドウ制御

フロー制御

MSS

MSS(Maximum Segment Size)とは, 1回のデータ転送で受信可能なTCPセグメントのペイロード部分の最大値のことである.

例えば, Ethernetを用いたLANの場合, Ethernetフレームが最大1518byteのため, 14byteのEthernetヘッダと4byteのFCS, 20byteのIPヘッダ, 20byteのTCPヘッダを除いた1460byteがMSSとなる.

つまり, MTUから40を減じた値がMSSとなる.

また, PPPoEを使用する場合, EthernetヘッダとFCS, IPヘッダ, TCPヘッダに加え, 6byteのPPPoEヘッダと2byteのPPPヘッダも考慮する必要があるため, 1460byteからさらに8byteを引いて, 1452byteがMSSとなる.

RWIN

RWIN(Receive Window Size)とは, 相手側の確認応答であるAckを待たずに, 一度に送信できるデータサイズのことである.

3ウェイハンドシェイクによりコネクションを確立させる際に, TCPが受信可能なMSSとRWINを相手側に通知する.

RWINは, 回線速度やPCのCPUやメモリーなどにより最適なサイズが異なる.

また, Windows 7におけるRWINは可変のため, 自動的に値が調整されるが, それよりも前のOSはRWINが固定値であった.

OS RWIN
Windows 95 8192byte
Windows 98 8192byte
Windows NT 8192byte
Windows 2000 16384byte
Windows Me 16384byte
Windows XP 65535byte

また, 現在の自分のPCのMTU, MSS, RWINなどは, http://www.speedguide.net/analyzer.phpから確認が可能である.

results matching ""

    No results matching ""