コネが重要?TCP/IPの「TCP」とは?

[voice icon=”https://tomslifestylelab.com/wp-content/uploads/2019/05/tom0212.png” name=”この記事を書いている人” type=”l”]

ネットワークエンジニア
Tom

Tomとかいうやつが何者なのか知りたい方は下のプロフィールをご覧ください。

プロフィール

[/voice]

こんにちは、Tomです。

今回は、

「TCP」

について解説していきます。

 

今回お話するTCPは非常にボリュームがあります。

そのため、TCPの各制御に関しては別の記事にまとめました。

別の記事へ飛んでいただくことが多いと思いますが、分けて書いた方が理解しやすいので、ご了承ください。

 

それでは1つずつ見ていきましょう。

1.TCPとは?

TCPは、正式には

Transmission Control Protocol

といいます。

通信プロトコルの一つで、TCP/IPのトランスポート層のプロトコルです。

TCPの役割は、

「通信の信頼性を確保すること」

です。

TCP/IP通信では、IPが異なるネットワーク間でのデータ転送を行ってくれるのですが、
IPは、データを確実に相手側に届けることは保証しません。

下の記事のIPの特徴でも触れていますが、IPはベストエフォート型のデータ転送をします。

「最大限努力するけど、パケットが確実に相手に届くかは保証はしませーん」

と、頼りないのがIPの特徴です。

IPとは?IPプロトコルを徹底解説

IPが保証してくれないので、代わりにTCPがそれを保証します。

データを確実に相手側に届けることを保証して、信頼性の高い通信を実現することがTCPの役割なのです。

2.TCPの特徴

2-1.コネクション型プロトコル

TCPの役割は、信頼性の高い通信を実現することでした。

そのために、TCPは通信を行う相手側とコネクションを確立します。

コネクションとは、「仮想的な通信路」のことです。

通信を行う相手側との仮想的な通信路である「コネクション」を確立して、そのコネクション上でデータの送受信を行います。

そういうプロトコルを「コネクション型プロトコル」といいます。

人間に例えるなら、

相手がちゃんと話を聞くように、最初にガッチリ握手をして、その手を離さずに話を始めるようなものでしょうか。握手が、コネクションにあたります。

そんなやつと話したくないですが、イメージとしてはそんな感じです。

もう一度言いますが、

コンピュータ同士がコネクションを確立して(がっちり握手をして)、その上でデータを送受信(会話)するのがコネクション型プロトコルです。

2-2.TCPは様々な制御を行っている

TCPは、コネクション上でデータを確実に相手側に届けるため、様々な制御を行っています。

例えば、

  • 順序制御
  • 再送制御
  • ウィンドウ制御

などです。

「TCPがよくわからない」という方は、TCPが行うこれらの制御がよくわからないのではないでしょうか?

一見複雑そうにみえますが、一つずつ見ていけば、「なんだ、それだけか」ということがわかります。

この後、ちゃんと解説しますので安心してください。

3.TCPヘッダ

TCPの様々な制御を解説する前に、TCPヘッダについてお話します。

 

TCP/IPのカプセル化のところで説明しましたが、TCP/IPのデータの流れでは、

図のようにアプリケーション層のプロトコル(ここではHTTP)から受け取ったデータ(メッセージ)にTCPヘッダが付加されます。

そして、このヘッダの中身は図のようになっています。

TCPヘッダのデータサイズは基本的に20バイトです。

一番下に「オプション」とありますが、「オプション」に何か値が入った場合は20バイトを超えます。

 

ヘッダの中身を1つずつ見ていきます。

3-1.送信元ポート番号(16ビット)

送信元ポート番号は文字通り、

「メッセージが送られてくるアプリケーションのポート番号」

のことです。

たとえば、GoogleなどのWebブラウザを利用している時の、アプリケーションプロトコルはHTTPです。

そして、サーバ側でのHTTPのポート番号は「80」です。

WebブラウザでWebページを表示するときには、Webサーバから自分のコンピュータにWebページが送信されてきますが、この時のTCPヘッダの送信元ポート番号は「80」が入ります。

実際には、2進数で表すため、

「0000000001010000」

が入ります。

一方、自分がWebサーバに対してメッセージを送る場合は、送信元ポート番号には、自分のコンピュータのHTTPのポート番号が入ります。

この場合、ポート番号は「80」ではありません。

クライアント側(自分のコンピュータ)のポート番号は、WindowsなどのOSがランダムな値を定めます。

なので、クライアント側がWebサーバに対してメッセージを送る時の送信元ポート番号は、OSが決めたランダムな値です。

 

ポート番号について詳しく知りたい場合は、下の記事をご覧ください。

ポート番号とは?

3-2.宛先ポート番号(16ビット)

宛先ポート番号も文字通り、

「メッセージを送るアプリケーションのポート番号」

のことです。

先ほどの送信元ポート番号の時と立場が逆転するだけです。

クライアントがWebサーバに対してメッセージを送る時の宛先ポート番号は「80」ですし、

サーバがクライアントにWebページを送信する時の宛先ポート番号は、クライアントのOSが決めたランダムな値です。

3-3.シーケンス番号(32ビット)

シーケンス番号は、

「分割されて送られてきたデータが、全体のどの部分なのかを示す番号」

です。

後ほど「4.MTUとMSS」のところでご説明しますが、ネットワークで一回に送受信できるデータサイズは決まっています。

そのため、サイズの大きいデータはいくつかに分割されて送られてきます。

その分割されたデータを元のデータに復元するために必要な値がシーケンス番号です。

受信側はシーケンス番号を見て、受信したデータを番号順に並べて元のデータに復元するのです。

3-4.確認応答番号(32ビット)

確認応答番号は、データを受け取ったことを示す値が入ります。

基本的に、相手から送られてきたデータのシーケンス番号とデータサイズを足した値が入ります。

例えば、シーケンス番号が1001で、その時のデータサイズが1000バイトなら、確認応答番号は2001となります。

3-5.データオフセット(4ビット)

データオフセットは、TCPヘッダの長さを示す値です。

セグメントを受け取った相手側のホストは、この値を見て、TCPデータがどこから始まるのかを認識します。

3-6.予約(4ビット)

予約は、文字通り予約です。

将来、機能を拡張するときのためにとっておいてある領域です。

3-7.制御ビット(全部で8ビット)

制御ビットは、コントロールフラグとも呼ばれ、コネクションの確立や確認応答、再送制御など、TCPの様々な制御の際に使われる領域です。

全部で8ビットありますが、1ビットずつに意味があります。

それぞれをフラグといい、「1」が入った時にそのフラグの意味を成します。 

例えば、「ACK」を「1」にして送ることで、“データを確実に受け取りました”ということを相手に伝えることができます。

「FIN」に「1」をすれば、相手に対して“コネクションを切断したい”ということを伝えることができます。

実際の制御でどのように使われるかは、それぞれの制御のところでお話します。

3-8.ウィンドウサイズ(16ビット)

ウィンドウサイズは、受信側が一度に受け取ることのできるデータ量を表す領域です。

シーケンス番号のところでもお話しましたが、ネットワークで一度に送受信できるデータサイズは決まっています。

そのデータサイズを超えるデータは分割して送られるのでした。

 

しかし、分割されたデータを1つずつ送っていては効率が悪いです。

そのため、TCPでは分割されたデータを何個かまとめて送る、という制御を行っています。

 

その際に、「一度に何個まで受け取ることができるか」を送信者に通知するための領域が、ウィンドウサイズです。

詳しくは「9.ウィンドウ制御」のところでお話します。

3-9.チェックサム(16ビット)

チェックサムは、TCPヘッダとTCPデータが壊れていないかチェックするための値が入ります。

チェックサムについて詳しく書くと、丸々一個の記事が必要になるので、「そういう値が入るのか」程度で結構です。

3-10.緊急ポインタ(16ビット)

緊急ポインタは、緊急で送るべきデータが発生した場合に、そのデータの位置を示す値が入ります。

こちらも、「そういう値が入るのか」程度の理解で結構です。

3-11.オプション(可変長)

オプションは、必要に応じて使用される領域です。

例えば、ホスト同士でコネクションを確立する際に、一緒にMSSについて伝え合います。

その時、オプションにMSSの値を入れて送り合います。

「4.MTUとMSS」で詳しくお話しますが、MSSとは、一度に送受信できる最大データサイズのことです。

コネクションを確立する段階で、これからデータを送り合うホスト同士で自分のMSSを伝え、MSSを決めます。

3-12.パディング(可変長)

パディングは、オプションを使用した際に、TCPヘッダが32バイトの整数倍になるよう、調整するための領域です。その際、「0」を入れて調整します。

 

例えば、

オプションを使用しない場合、TCPヘッダは20バイトです。

しかし、オプションで40バイト使用したとします。その時、TCPヘッダが60バイトとなります。

32バイトの2倍の64バイトにするために、パディングに「0」を4バイト分、つまり32個入れます。

4.MTUとMSS

TCPの様々な制御を説明する前に、もう一つ、お話しておかなければいけない内容があります。

それは、

「MTUとMSS」

です。

こちらの内容に関しては、別記事にまとめましたので、そちらをご覧ください。

“なんとなくわかる”では困る!MTUとMSSの違いとは?

5.コネクションの確立・切断(3ウェイハンドシェイク)

ここから、TCPの様々な制御について解説していきます。

まずは、「コネクションの確立・切断」です。

この手順はよく「3ウェイハンドシェイク」と呼ばれます。コネクションを確立するコンピュータ同士が握手するような手順だからです。

こちらの内容に関して、別の記事にまとめましたので、そちらをご覧ください。

コンピュータが握手?3ウェイハンドシェイクとは?

6.確認応答

次は確認応答です。

確認応答とは、

「データを受信したことを相手に通知すること」

のことです。

実際にどのように確認応答が送られるかは、以下の各制御のところで説明しています。

7.順序制御

次に、順序制御です。

順序制御とは、

「分割されて送られてきたデータを、正しい順番に並べて復元する制御」

のことです。

順序制御に関する詳しい内容は、下の記事をご覧ください。

シーケンス番号が手掛かり?TCPの「順序制御」とは?

8.再送制御

再送制御とは、

「通信相手からの確認応答がない場合にデータを再送する制御」

のことです。

再送制御に関する詳しい内容は、下の記事をご覧ください。

再配達します!TCPの「再送制御」とは?

9.ウィンドウ制御

ウィンドウ制御とは、

「確認応答を待たずに一度に一定量のデータを送信する制御」

のことです。

ウィンドウ制御に関する詳しい内容は、下の記事をご覧ください。

一気に送っていいよ!TCPの「ウィンドウ制御」とは?

10.まとめ

いかがでしたでしょうか?

結構ボリュームがありましたね。

TCPの各制御について理解を深めることはできたでしょうか?
一つずつ見ていけば、そんなに難しいものではありません。

ぜひ、自分の知識になるまで何度も復習してください。

それでは、最後まで読んでくださり、本当にありがとうございました。