アプリ版:「スタンプのみでお礼する」機能のリリースについて

TCPの通信において、受信バッファから上位アプリケーションへデータを渡すタイミングについて教えてください。

PSHフラグが立っているデータを受信すると上位アプリケーションへ渡すというのは学びましたが、その他どのようなタイミングで上位アプリケーションへデータを渡すのかわからなかったため質問させていただきました。

例えば、PSHフラグのデータが来る前に受信バッファがいっぱいになってしまったら、受信側で勝手にデータを渡してしまうのでしょうか。(それともバッファがいっぱいになると送信側がPSHフラグを送ってくれるのでしょうか。でもゼロウィンドウプローブを考えるとそれもない気がします。)

また、TCPでの通信部分なため、このあたりの動作に関してはアプリケーションごとではなくOSに依存するのかなと思っており、アプリケーションとしてはどのような塊(タイミング)でデータを受信してもちゃんと処理できるのかなというのも気になります。
「現在はPSHフラグを無視している」というのもネット上で見かけましたが、そうするとますますOSの独断でデータをアプリケーションに渡しているのかなと思いました。

このあたりがよくわからなかったので、ご教授願えればと思います。

※スライディングウィンドウ、ゼロウィンドウについてはネットですぐ見つかる程度の範囲では理解しているつもりです。

A 回答 (2件)

pushフラグは送信側が受信側に対して上位へのデータの即時引渡しを要求するフラグ。


あくまで要求なのでこのフラグが立っているかどうかで受信側がどう対処するかは実装依存。
性能が高くなっている今ならpushフラグをセットしていなくても上位への引渡しをすぐに行う実装も多いと思われる。
> 現在はPSHフラグを無視している
というのはフラグの状態に無関係に適切なタイミングで受信側が処理している実装が多いという意味だろうと思われる。
そして、
> 例えば、PSHフラグのデータが来る前に受信バッファがいっぱいになってしまったら、受信側で勝手にデータを渡してしまうのでしょうか
というのは当然勝手に渡すことになる。
pushフラグはセットしないことによって送信側が受信側にデータを上位へ渡すことを抑制させるためのフラグではないので。
    • good
    • 0
この回答へのお礼

PSHフラグはデータを上位に渡すことを抑制するわけではないのですね。

もうひと方詳しい回答をいただきましたが、私が聞きたかったことに対する回答はこちらの方が近かったため、ベストアンサーに選ばせていただきました。

回答ありがとうございました。

お礼日時:2010/07/15 00:25

TCP/IPの受信バッファは、アプリケーションレベルとTCPレベルのバッファがあり、アプリケーションレベルのバッファは、受信できるだけのバッファが必要になる思います。


つぎに、受信するための命令の関数の説明がります。
http://members.jcom.home.ne.jp/toya.hiroshi/wins …

bufが受信するためのデータ領域のアドレス
lenが受信できる長さ

で受信できる長さ以上のデータが来た場合には、エラーとなり、WSAEMSGSIZEになります。
対策としては、上記に次の対策がかかれています。
「残りの部分を読みとるにはじゅうぶん大きなメモリをこの関数に渡してください。」

TCPレベルでは、TCP間で送受信の大きさが制御されます。
次の第37回から第43回を参照してください。
http://www5e.biglobe.ne.jp/~aji/3min/

後は、受信側のTCPでは、受信した大きさごとにbufで示されるアドレスに順番に格納し、
受信し終わったら、受信命令が終了したことを通知する。
    • good
    • 1
この回答へのお礼

回答ありがとうございました。

アプリケーションレベルでもバッファが存在するのですね。
2個目のリンクのあたりの情報は知っているつもりですが、アプリケーションレベルのことはよくわかりませんでした。

時間があるときにもう少し詳しく読んでみようと思います。

お礼日時:2010/07/15 00:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!