ネットワークの基礎講座

TCP(トランスミッション制御プロトコル)

TCPのコンセプト


 

 


IPはピア間でのデータ・パケットの交信の手段を与えてくれる。しかしながら、ネットワークの状況によってはそのパケットは途中で紛失し未着となる可能性もある。また途中の経路は固定されている訳でもないし、輻輳が生じたりするとパケットごとに到達時間がばらつくこともある。そうすると、送り側でのパケットの順番と受けた時のパケットの順番が異なってしまうこともあり得る。更に送り側は受け側の状況を無視して(というか相手の状況を知るメカニズムを持っていない)パケットを送信するので、受信側のピアが処理できない可能性も出てくる。

 

このような特性は一般のアプリケーションで満足できない。もっと信頼性と順序性が確立され、更にはピア間で複数の種類のデータ交換を同時に行えることが好ましい。例えば、同じピア間で情報検索とIPベースの音声交話を同時に出来ればもっと便利である。これはピア間で複数の通信のチャンネルを持つイメージである。TCPはこのようにIPでは一般のアプリケーションでは不十分なところを補うものと考えてよい。

 

OSIはトランスポート層を次のように定義している:

「トランスポート層は、信頼性あるメッセージの到着を保証し、誤りの検査とフロー制御のメカニズムを持つ。トランスポート層はコネクション・モードとコネクションレス・モードの二つの伝送のモードのサービスを提供する。コネクション・モードの伝送では、他端において完全なメッセージに再組み立てするに必要な形式でのパケットの送受信がなされることになる。」

 

TCP/IPTCP(RFC 793)(とUDP)はまさしくOSIのトランスポート層に対応付けられるものである。この定義で要求されている事項はどのように実現されているのかをまず説明する。

 

 

信頼性あるメッセージの到着の保証

 

TCPが上位のアプリケーションと受け渡しするデータは、数バイトのデータから、例えば画像のように大変大きなものまで存在し得る。しかしながら下位層のIPでは、データグラムあたりの長さに制限があるので、TCPはこれを幾つかのパケットに分割して下位層に渡す。これをセグメントと呼ぶ。受け側で正しい順番でセグメントを並び替える直すことが出来るようシーケンス番号(Sequence Number)が導入された。この番号は送信されるデータのオクテット(バイト)位置を示すもの、あるいはデータの総てのオクテットにはシーケンス番号が付与されている、と考えても良い。この番号はある値からスタートし、受かったあるいは送ったデータ分結果として加算される。このシーケンス番号を導入することで、パケットの欠落や順序の乱れに対応できる。詳細は後ほど説明する。

 

 

誤りの検査

 

誤りの検査は幾つかの手段がある。最初はTCPがパケットとして送り出すセグメント全体のチェックサムでビット誤りなどが検出される。IP層でもCRCによる厳密な誤り検出がすでになされているので、チェックサムで十分という判断であろう。

 

誤りが発生すれば結果として順序誤りが生じるので、これはシーケンス番号により検出される。受け側は最後に受かったシーケンス番号に1を加え(即ち次に期待するシーケンス番号)肯定応答番号(Acknowledge Number)として送信元に送り返す。所定時間内にこの肯定応答が帰ってこなかったら、欠落か誤りが生じたものとして前回のセグメントを再送する。再送のメカニズムも後ほど詳細に説明する。

 

 

フロー制御

 

フロー制御とは、受け側の処理能力や事情に合わせて送りもとでのパケットの送信を制御するメカニズムである。TCPではいわゆるウィンドウ制御と呼ばれる方式が採用されている。一般に送信にも受信にもバッファが用意される。受け側は受信バッファに余裕が出たときに次にどれだけ送ってよいかをウィンドウ(Window)というパラメタで送り元に通知する。ネットワークの効率を上げるためにも、この値が小さくならないよう配慮しなければならない。送り元は受けて最大余裕までのサイズのセグメントを送るべきだし、受け側はなるべく大きなウィンドウ値を返すよう配慮すべきである。これものちほど詳細に説明する。

 

 

コネクション・モードとポートの概念

 

IPは郵便と同じように、パケット単位で相手先にとどけるプロトコルである。しかしながら、電話と同じように相手とある接続を行って、その接続の間相手とそのアプリケーションに関するデータ交換を行うことができれば、相手と複数のアプリケーションを同時に利用できて便利である。電話の場合は実際に回線交換網が相手と回線を接続するが、TCPの場合はIP網の上で接続を実現しなければならないので、仮想的な接続を行うことになる。そのためにポート(Port)という概念が導入されている。

 

ポートというのは、相手のホストと複数の相互通信のパイプを作るための接続口のようなものと捉えることが出来よう。TCPを実装した各ホストは皆16ビットの番号をもった接続口を用意できる。そうすると、二つのホスト間で互いに相手口同士をポート番号を使って接続できることになる。例えばホストA10番とホストB15番が、同時にホストA20番がホストB5番と、計2つのチャンネルが開設される、といった具合である。このときホストCがホストB15番に同時に接続してきても問題は生じない。ポート番号が同じであっても相手が違う(IPアドレスが違う)ので切り分けが可能だからである。現にTCPは(自分のポート番号、相手のポート番号、相手のIPアドレス)からなるポート割付管理テーブルをもとにポートの割付を行っている。電話と同じようにTCPの接続が確立したら双方は同時に話し合うことが可能である。これを全2重方式と呼ぶ。

 

TCPの一般的なアプリケーションはクライアント/サーバの形式である。皆さんになじみのWWWサーバは、クライアントのブラウザから最初にアクセスされる。サーバが自発的にクライアントにアクセスをかける事は無い。サーバは受動的、クライアントは能動的に接続を開始する。標準的なアプリケーションではサーバ側のポート番号が決まっている。これを「よく知られたポート」(Well-known Port)と呼ばれている。下表はその代表的なものである。

 

Port

Key word

Service

5

RJE

Remote Job Entry

7

ECHO

Echo

13

DAYTIME

Daytime

2021

FTP

File Transfer Protocol (control / data)

23

TELNET

Telnet

25

SMTP

Simple Mail Transfer Protocol

53

DNS

Domain Name System (TCP/UDP)

80

HTTP

Hyper Text Transfer Protocol

110

POP3

Post Office Protocol 3

161

SNMP

Simple Network Management Protocol

162

SNMP-TRAP

SNMP-Trap (UDP)

179

BGP

Border Gate Protocol

443

HTTPS

HTTP Over Transport Layer Security/Secure Sockets Layer

33434

TRACEROUTE

Trace Route (UDP)

 

下図はこれまで説明したTCPのコンセプトを図示したものである。


 


それでは、以上の基礎知識をもとに、より詳細な説明を加えることとする。

 

 

 

 

前節     目次     次節