TCPヘッダ その4

TCPヘッダフォーマット

TCPヘッダについては4回目ですが、ここでもやっぱり最初はヘッダのフォーマットを載せていきます。

ウィンドウサイズ

「ウィンドウサイズ」は一度に受信することができるデータの大きさです。これはTCPのフロー制御である「スライディングウィンドウ」で使われるものです。

TCPはコネクション型プロトコルなので、送信したセグメントに対して確認応答(ACKセグメント)が必要です。サイズの大きいデータを送るときいくつかのセグメントに分割して送ることになります。そのとき、ひとつのセグメントを送ってACKが返ってくるのを待って、次のセグメントを送る。またそのACKを待って送る・・・というように通信を行うととっても効率が悪くなってしまいます。

そこで、いっぺんにいくつかセグメントを送ってしまいましょう!って考えるわけですね。でも、いっぺんにたくさん送ってしまっても相手が処理しきれなければ意味がありません。そこで受信できるデータの大きさを通知して、そこまでいっぺんに送りましょうというのがスライディングウィンドウ方式です。

スライディングウィンドウ

では、簡単に仕組みを見ていきます。図を使って説明していきますが、これはデータ送信を行っている途中と考えてくださいね。また送りたいデータをセグメント単位で考えていきます。

まず、図に使っている記号の説明です。

SEND(X):セグメントの送信。Xはシーケンス番号
ACK(Y,Z):確認応答。YはACK番号、Zはウィンドウサイズ

送信先のBがACK(1,3)を出して、「次はシーケンス番号1のセグメントを送ってね。3つぶんスペースあるから3ついっぺんに送ってくれても大丈夫」と送信元のAに知らせています。

じゃ、Aは「3ついっぺんに送ってしまえ~」ということでSEND(1)、SEND(2)、SEND(3)です。まず1のセグメントがBに届くと、Bはバッファに格納して、ACK(2,2)を返しています。これは「1はちゃんと受け取ったから次は2が来て欲しいです。空いているスペースは2つ分です。」という意味ですね。同じように2、3がBに届くとACKを返して次に来て欲しいシーケンス番号と空いているスペースを知らせていっています。

ACKを受け取った送信元のAを考えていきます。たとえば、ACK(2,2)を受け取れば1はもういらないわけですから1を破棄します。ACK(3,1)、ACK(4,0)を受け取ったときも同じですね。2、3を破棄していきます。
ただ、このあとも送信したいところなのですが、Bにはスペースがありません。

この例では、Bは処理がたまっていて受け取ったセグメントをほったらかしにしたまんまになっているんですね。で、やっとたまっていたセグメントを処理しきって、ACK(4,3)をAに送り「次は4からお願いね。3ついっぺんに送ってくれても大丈夫」と言っています。すると、Aは「3ついっぺんに送ってもいいんだ」ということで、SEND(4)、SEND(5)、SEND(6)を送信しているわけです。

ここでは話を簡単にするために、AからBへの単純なデータ送信ですが、実際には全2重通信で同時にBからAもデータを送ることは可能です。その場合も考え方は同じです。お互いに受信できるスペースをウィンドウサイズで通知しあって、複数のセグメントを一度に送ることによって通信の効率をあげています。

またネットワークが混雑してしまうことを「輻輳(ふくそう)」と呼んでいますが、その輻輳状態を回避するためにもこのウィンドウサイズが使われます。その仕組みは、輻輳を検出したらウィンドウサイズを一気に減少させて送信するセグメントの数を減らします。そのあと徐々にウィンドウサイズを増加させていくことによって輻輳を回避しています。

「ヘッダチェックサム」「アージェントポインタ」

「ヘッダチェックサム」はIPヘッダにもありましたがエラーチェックを行うためのものです。詳しいチェックサム計算については触れません。
最後の「アージェントポインタ」は緊急データがどこから始まるかということを示すポインタです。(ただし、緊急データがどんなものがあるかということはよく知りません。誰か教えて!)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA