いろんな制御に欠かせない値がここに集約!TCPパケットヘッダ
「伝送の制御をするには、いろんな値に気を配らないといけません…。」
はい、こんにちは!松井真也です。シリーズ「ネットワークからアプリへの橋渡し:トランスポート層の世界」第4回でございます!
前回は、「TCPとは何か?」というお話しでした。トランスポート層のプロトコルの一つであり、信頼性の高い通信を実現するのに不可欠なのでした。HTTPやSMTPなど、壊れたデータが届いては困りますからね。他方、速度は少し遅くなるのでした。
さて、今回は、TCPパケットフォーマットがテーマです。TCPは、その信頼性の高さから広く利用されているわけです。その高い信頼性を実現するための秘密がヘッダにたくさん詰まっています。いったいパケットはどのように構成されているのでしょうか?
早速見てみましょう!
TCPセグメントの構造
TCPでのデータ送受信の単位を「TCPセグメント」と呼びます。あれ、パケットじゃいの?と思う方も多いかもしれません。実際「パケット」と呼ぶこともあります。
ただし、データの送信単位は、一般に「PDU」(Protocol Data Unit)といい、TCPの場合は「セグメント」と呼ばれることが多いです。正確さを考慮して、これ以降「セグメント」ということにしましょう!
セグメントは、制御情報を含むヘッダ部分と、実際のデータを含むペイロード部分から成り立っています。
ヘッダは通信を制御するためのさまざまな情報を保持し、ペイロードは送信するデータそのものです。この2つの部分が一体となって、インターネット上でデータのやり取りが行われます。
ここまでは、IPパケットなどと共通ですね!ここまでOK。
TCPヘッダの構成はこれだ
では、TCPヘッダを紐解いていきますか。多くのフィールドから構成されていますよ。
最初の20バイトは固定長です。それ以降はオプションです。上から見ていきましょう。
1)送信元と宛先のポート番号
真っ先に最重要のポート番号を示すのですね。送信元と送信先のものがあるのでした。ちなみに、ポート番号は、0~65535までの間の値をとるのでしたね。ということは、16ビット(2の16乗(65536))必要ということが分かりますよね!
2)シーケンス番号
シーケンス番号は、TCPパケット内のデータが正しい順序で送信され、受信されることを保証するために使用されます。そう、TCPが持つ制御機能のうち、「順序制御」のために必要です。これにより、データが正確に再構成され、順序通りに処理されます。
3)確認応答番号
確認応答番号は、受信者が次に期待するTCPセグメントのシーケンス番号を送信者に通知します。受け取った側のコンピュータは「このデータは届いたよ」というサインを送り返すんですね。
4)ヘッダ長
4ビットで表されます。ようは、ヘッダの長さがどこまで続いているかを知るためにあるんです。この値は、4バイト単位でヘッダの長さを示します。たとえば、値が5の場合、ヘッダの長さは20バイト(5×4バイト)となります。この場合、ヘッダは固定長部だけで、オプションがないことになりますね!
これにより、ヘッダとペイロードの境界が定義され、データの開始点を特定できます。
5)コントロールフラグ
コントロールフラグは、信頼性の担保のために力を発揮します。通信の状態や制御を示すために使われます。
フラグにはURG、ACK、PSH、RST、SYN、FINなどがあり、それぞれが特定の通信の状態や動作を表しています。例えば、SYNフラグは新たな接続を開始する際に、FINフラグは接続を終了する際に使われます。これらのフラグにより、TCPは柔軟な通信制御を実現しています。
これはコネクションの確立に深く関連しますから、次回詳しくお話しましすよ。
6)ウィンドウサイズ
ウィンドウサイズは、「データを一度にどれだけ送れるか」を決める値です。ウィンドウサイズが大きいと、多くのデータを一度に送れて速くなります。いぇい♪。でも、送る量が多すぎると受け取り手が処理しきれなくなります。ちょうど良いサイズに随時調整しているのです。詳しくは次々回に扱います!
7)チェックサム
また、チェックサムによるエラーチェック機能もTCPの重要な特徴の一つで、これによりデータの正確性が保たれます。万が一データに誤りがあった場合、TCPはそのセグメントの再送を行い、データの正確な伝送を確保します。
8)オプション
TCPヘッダのオプション領域では、さらに詳細な制御や情報の提供が可能です。例えば、ウィンドウサイズの拡張や、最大セグメント長(MSS)の指定などが行われるのだそうです。
はい、本日はここまで。今回は、TCPの制御に欠かせないパケット構成についてお話ししました。TCPによる制御に欠かせない値がコンパクトに詰まっていることが分かりましたね!
次回は、ハンドシェイクをやりましょう!では。
この記事が気に入ったらサポートをしてみませんか?