目 次
目 次/関連項目

4.5 TCP

4.5.1 TCPについて

 TCPを使用した通信では、IPデータを受け取った後、信頼性のあるデータ転送を行うための制御を行っている。信頼性のある通信を実現するためにデータ破壊やパケットの喪失、重複、順序の入れ替わりなどの問題に対応できるようになっている。

4.5.2 TCPセグメントの内容

 TCPセグメントはTCPヘッダとTCPデータから構成されている。本節ではTCPヘッダの内容について説明する。TCPの機能に関する情報は全てこのTCPヘッダ中に格納される。

TCP Header
(TCPヘッダ)
TCP Data
(TCPデータ)
図4.5.1:TCPセグメント


4.5.3 TCPヘッダ形式


 TCPヘッダ形式を図4.5.3に示す。 TCPのヘッダはUDPに比べ多くの情報が含まれている。このヘッダによってTCPの信頼のおける通信が可能になっている。また、UDPヘッダにはUDPパケットのパケット長を示すフィールドがあったがTCPヘッダにはそのようなフィールドは存在しない。TCPはインターネット層からTCPのパケット長を教えてもらいその長さからデータの長さを知るようになっている。

 これらのフィールドのうちシーケンス番号、確認応答番号、ウインドウサイズ、コードビットのACK、SYN、FINの各フラグはTCPによる通信に「信頼性」を持たせるための重要なフィールドである。  

0 4 8 16 24
31
Source Port
(送信元ポート番号)
Destination Port
(宛先ポート番号)
Sequence Number
(シーケンス番号)
Acknowledgement Number
(確認応答番号)
Data Offset
(データオフセット)
Reserved
(予約)
Code Bit
(コードビット)
Window
(ウインドウサイズ)
Checksum
(チェックサム)
Urgent Pointer
(緊急ポインタ)
Options
(オプション)
Padding
(パディング)

図4.5.2:TCPヘッダ

4.5.4 フィールドごとの説明

■Source Port (送信元ポート番号)
 
送信元のポート番号が16ビットで格納される。

■Destination Port (宛先ポート番号)
 送信先のポート番号が16ビットで格納される。

■Sequence Number (シーケンス番号)
 32ビットのフィールドで、シーケンス番号が格納される。シーケンス番号とは、「このTCPセグメントのデータが送信するストリーム全体のどの位置のデータであるか」を示す番号である。

■Acknowledgement Number (確認応答番号)
 32ビットのフィールドで、確認応答番号が格納される。確認応答番号は、次に受信するデータのシーケンス番号になっている。

■Data Offset (データオフセット)
 4ビットのフィールドで、TCPヘッダのヘッダ長が格納される。データオフセット×4(オクテット)がヘッダ長になる。TCPヘッダの長さは20オクテットなので、オプションが無い場合データオフセットには「5」を表す「0101」が格納される。

■Reserved (予約)
 6ビットのフィールドで、将来の拡張のために用意されている。通常は全て「0」になっている。

■Code Bit (コードビット)
 6ビットのフィールドで、各々のビットはフラグとして使用される。各ビットの順番と名前、その役割は次のように決まっている。

Code Bit(コードビット)
URG ACK PSH RST SYN FIN
図4.5.3 コードビットの各ビット

  • URG(Urgent Flag)
     このビットが1の時は、緊急に処理するべきデータが含まれていることを示す。緊急に処理するべきデータは緊急ポインタフィールドで示される。

  • ACK(Acknowledgement Flag)
     このビットが1の時は確認応答フィールドが有効であることを示す。コネクションを確立する時のSYNセグメント以外はいつでも1になっている必要がある。

  • PSH(Push Flag)
     このビットが1のときは受信したデータをすぐに上位のアプリケーションに渡す。0ならばすぐに上位アプリケーションに渡さずに、バッファリングすることができる。

  • RST(Reset Flag)
     このビットが1のときはコネクションが強制的に切断される。これは何らかの異常が検出された場合に送信される。たとえば使用されていないポート番号に接続要求が来ても通信はできない。そういった場合に、受信側はこのRSTフラグに1が設定されたセグメントを送信する。送信側ではそのセグメントを受け取ったらコネクションを切断する。

  • SYN(Synchronize Flag)
     このビットが1の時にはコネクションの確立要求を表す。このビットに1が設定されたセグメントを特別にSYNセグメントと呼ぶ。SYNセグメントにはシーケンス番号フィールドにシーケンス番号の初期値が格納されている。

  • FIN(Fin Flag)
     このビットが1の時にはもう送信するデータがないことを表し、コネクションの切断要求を示す。このビットに1が設定されたセグメントを特別にFINセグメントと呼ぶ。送信すべきデータを全部送信したらこのFINセグメントを送信側と受信側でお互いに送信し、コネクションの切断をする。

■Window (ウインドウサイズ)
 16ビットのフィールドで単位はオクテットである。受信側で受信可能なデータサイズを送信側に通知するのに使用される。送信側はこのウインドウサイズ以上のデータを送信することはできない。
 送信側がウインドウサイズの最新情報を知るためこのフィールドを0に設定したセグメントを送信する。この場合データ長は1オクテットになる。

■Checksum (チェックサム)
 チェックサムは16ビットのフィールドであり、機能としてはUDPのチェックサムと同じであるが、TCPのチェックサムは必ず使用しなければならない。チェックサムの計算時にはUDPと同様にTCP疑似ヘッダというデータをTCPヘッダの前に一時的に付加して計算する。計算方法はUDPと同様なのでここでは詳述しない。

送信元IPアドレス
宛先IPアドレス
パディング
0
プロトコル番号
6
TCPパケット長
図4.5.4TCP疑似ヘッダ

■Urgent Pointer (緊急ポインタ)
 16ビットのフィールドで、コードビットフィールドのURGビットが1のときに有効になる。このフィールドには、緊急に処理する必要のあるデータの場所を示す値を格納する。TCPセグメントの中のTCPデータの先頭から、緊急ポインタで示されたオクテット数を足した場所が緊急に処理すべきデータの場所になる。緊急データをどのように処理するかはアプリケーションが決める。

■Options (オプション)
 オプションはTCPの通信において機能を付加するために用いられる。RFC793では、以下の表のようなオプションが定められている。この中で、タイプ2のMaximum Segment Size(MSS)はコネクションの確立時にSYNセグメントの中で、最大セグメント長を決めるために利用される。
タイプ
長さ(オクテット)
オプション名
0
-
End of Option List
1
-
No-Operation
2
4
Maximum Segment Size
図4.5.5 TCPオプションフィールド

オプションはこれだけではなく、他にもRFC1146,RFC1323,RFC1644,RFC1693,RFC2018,RFC2385などたくさんある。


■Padding (パディング)
 TCPヘッダの長さが32ビットの倍数になるまで0を格納して調整するためのフィールド。