> 受信側で..(略)..データをアプリに渡すという判断は...
そういう意味でしたか。 こちらこそ察しが悪くゴメンナサイ。
さて,この判断ですが, 通常,ネットワーク(ネットワーク機能を組み込んだOS)側では行いません。 つまり,OSから受信側のアプリケーションにデータを渡すのではなく, アプリケーションがOSに対して,届いたデータを取りにくる,ということです。 プログラミングの言語やスタイルによってやり方はいくつかありますが, たとえば,C言語でSocketライブラリを使う場合は, アプリケーションでread()を実行することによって,データを受け取る要求がOSに伝えられ, そして,OSはその要求に応える格好で受信データをアプリケーションに渡します。 このとき,通信データを全部し終わっていない可能性もありますが, それでもかまいません。 アプリケーションは通信データを一度に全部受け取るのではなく, 何回かに分けて,その都度受け取るデータのサイズを指定してきます。 だから,その分のデータを順次渡してあげればいいわけです。 たとえば,アプリケーションが10バイトのデータを受け取りにきて, 受信データが10バイト以上あれば,受信データの先頭10バイトを アプリケーションに渡すという格好になります。 受信データは受信データ格納用のバッファメモリに溜めておきますから, 受信バッファの先頭から10バイト取り出してアプリケーションに渡すということですね。 受信バッファのデータが10バイトに満たない場合もあるかもしれません。 その場合は,通信データが到着するまでアプリケーションを待ち状態にさせておき, 到着したらアプリケーションに渡します。
この受信バッファがポイントで, これをイメージすると理解しやすいのではないでしょうか。 つまり,相手から通信データが届いたら,受信バッファの末尾に付け足していき, 受信アプリケーションがデータを取りにきたら,先頭から順に渡す, という格好になるからです。 そして,この通信データを受信バッファの末尾に付け足す動作の際に, シーケンス番号で順番を確認し,もし順番が崩れていたら, 順番通りに並べ替えて受信バッファにデータを付け足していきます。
More information about text formats
受信アプリケーションがデータを取りにきます
> 受信側で..(略)..データをアプリに渡すという判断は...
そういう意味でしたか。
こちらこそ察しが悪くゴメンナサイ。
さて,この判断ですが,
通常,ネットワーク(ネットワーク機能を組み込んだOS)側では行いません。
つまり,OSから受信側のアプリケーションにデータを渡すのではなく,
アプリケーションがOSに対して,届いたデータを取りにくる,ということです。
プログラミングの言語やスタイルによってやり方はいくつかありますが,
たとえば,C言語でSocketライブラリを使う場合は,
アプリケーションでread()を実行することによって,データを受け取る要求がOSに伝えられ,
そして,OSはその要求に応える格好で受信データをアプリケーションに渡します。
このとき,通信データを全部し終わっていない可能性もありますが,
それでもかまいません。
アプリケーションは通信データを一度に全部受け取るのではなく,
何回かに分けて,その都度受け取るデータのサイズを指定してきます。
だから,その分のデータを順次渡してあげればいいわけです。
たとえば,アプリケーションが10バイトのデータを受け取りにきて,
受信データが10バイト以上あれば,受信データの先頭10バイトを
アプリケーションに渡すという格好になります。
受信データは受信データ格納用のバッファメモリに溜めておきますから,
受信バッファの先頭から10バイト取り出してアプリケーションに渡すということですね。
受信バッファのデータが10バイトに満たない場合もあるかもしれません。
その場合は,通信データが到着するまでアプリケーションを待ち状態にさせておき,
到着したらアプリケーションに渡します。
この受信バッファがポイントで,
これをイメージすると理解しやすいのではないでしょうか。
つまり,相手から通信データが届いたら,受信バッファの末尾に付け足していき,
受信アプリケーションがデータを取りにきたら,先頭から順に渡す,
という格好になるからです。
そして,この通信データを受信バッファの末尾に付け足す動作の際に,
シーケンス番号で順番を確認し,もし順番が崩れていたら,
順番通りに並べ替えて受信バッファにデータを付け足していきます。