TCPヘッダーのシーケンス番号について

先生
よろしくお願いします。

ネットワークはなぜ繋がるのか?でのP101に記載している

図2-15が関係する部分で質問があります。
アプリケーションから送信したいデータをTCPが受け取った時に、
アプリケーションからのデータはたいてい大きすぎるのでTCPが
IPパケットに収まるサイズに分割するとあります。
分割した後、受信側のPCでのTCPにおいて、分割されたパケットを
受け取って一つのデータにまとめて、アプリケーションに渡していく
ものだと思っています。P100にも記載されているとおり。

断片にして送ったデータを、受信側のTCPでその断片をつっくけて
元のデータに復元してから受信側のアプリケーションに渡すのは
イメージできます。その時の、断片をつっくけるパケットたちをどのように
判断しているのか?というのが、シーケンス番号を用いていると
考えて良いのでしょうか?

以上です。

名前: 
クリス・ヘグリウス
日時: 
11/07/31 22:38

コメント

そうです。
おっしゃる通り,受信側はシーケンス番号によってデータパケットの順番を判断してデータをくっつけて復元します。

先生

ありがとうございます。
聞き方がわるくすいません。
ききたかったのは、以下です。

分割されたデータを受信側で受け取る場合の話です。
例えば、アプリケーションからのデータが3つに分割されてTCPヘッダーに格納されていたとします。
受信側は、この3つが到着した時点で、受信側のアプリケーションにデータを渡すのですが、
受信側でこの3つ目が到着したらデータをアプリに渡すという判断はどうやっているのでしょうか?
三つ目が到着したら、データの復元は完了したという判断といってもいいと思います。

よろしくお願いいたします。

以上です。

> 受信側で..(略)..データをアプリに渡すという判断は...

そういう意味でしたか。
こちらこそ察しが悪くゴメンナサイ。

さて,この判断ですが,
通常,ネットワーク(ネットワーク機能を組み込んだOS)側では行いません。
つまり,OSから受信側のアプリケーションにデータを渡すのではなく,
アプリケーションがOSに対して,届いたデータを取りにくる,ということです。
プログラミングの言語やスタイルによってやり方はいくつかありますが,
たとえば,C言語でSocketライブラリを使う場合は,
アプリケーションでread()を実行することによって,データを受け取る要求がOSに伝えられ,
そして,OSはその要求に応える格好で受信データをアプリケーションに渡します。
このとき,通信データを全部し終わっていない可能性もありますが,
それでもかまいません。
アプリケーションは通信データを一度に全部受け取るのではなく,
何回かに分けて,その都度受け取るデータのサイズを指定してきます。
だから,その分のデータを順次渡してあげればいいわけです。
たとえば,アプリケーションが10バイトのデータを受け取りにきて,
受信データが10バイト以上あれば,受信データの先頭10バイトを
アプリケーションに渡すという格好になります。
受信データは受信データ格納用のバッファメモリに溜めておきますから,
受信バッファの先頭から10バイト取り出してアプリケーションに渡すということですね。
受信バッファのデータが10バイトに満たない場合もあるかもしれません。
その場合は,通信データが到着するまでアプリケーションを待ち状態にさせておき,
到着したらアプリケーションに渡します。

この受信バッファがポイントで,
これをイメージすると理解しやすいのではないでしょうか。
つまり,相手から通信データが届いたら,受信バッファの末尾に付け足していき,
受信アプリケーションがデータを取りにきたら,先頭から順に渡す,
という格好になるからです。
そして,この通信データを受信バッファの末尾に付け足す動作の際に,
シーケンス番号で順番を確認し,もし順番が崩れていたら,
順番通りに並べ替えて受信バッファにデータを付け足していきます。

先生

早速の回答ありがとうございます。
イメージできそうです。
さらに自分なりに考察してみます。

以上です。