• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:TCPの通信において、受信バッファから上位アプリケーションへデータを渡)

TCP通信における受信バッファから上位アプリケーションへデータを渡すタイミングについて

このQ&Aのポイント
  • TCP通信における受信バッファから上位アプリケーションへデータを渡すタイミングについて教えてください。PSHフラグが立っているデータを受信すると上位アプリケーションへ渡すというのは学びましたが、その他のタイミングはどうなるのか不明です。
  • TCP通信における受信バッファがいっぱいになった場合、受信側で勝手にデータを渡すのか、それとも送信側がPSHフラグを送ってくれるのか疑問です。また、OSに依存する動作なのか、アプリケーションごとに設定できるのかも知りたいです。
  • 一部の情報では、現在はPSHフラグを無視しているとも言われていますが、それだとますますOSがデータをアプリケーションに渡しているように思えます。このあたりの動作について詳細を教えてほしいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

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

nick_2010
質問者

お礼

PSHフラグはデータを上位に渡すことを抑制するわけではないのですね。 もうひと方詳しい回答をいただきましたが、私が聞きたかったことに対する回答はこちらの方が近かったため、ベストアンサーに選ばせていただきました。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jeee
  • ベストアンサー率52% (119/227)
回答No.2

TCP/IPの受信バッファは、アプリケーションレベルとTCPレベルのバッファがあり、アプリケーションレベルのバッファは、受信できるだけのバッファが必要になる思います。 つぎに、受信するための命令の関数の説明がります。 http://members.jcom.home.ne.jp/toya.hiroshi/winsock2/index.html?recv_2.html bufが受信するためのデータ領域のアドレス lenが受信できる長さ で受信できる長さ以上のデータが来た場合には、エラーとなり、WSAEMSGSIZEになります。 対策としては、上記に次の対策がかかれています。 「残りの部分を読みとるにはじゅうぶん大きなメモリをこの関数に渡してください。」 TCPレベルでは、TCP間で送受信の大きさが制御されます。 次の第37回から第43回を参照してください。 http://www5e.biglobe.ne.jp/~aji/3min/ 後は、受信側のTCPでは、受信した大きさごとにbufで示されるアドレスに順番に格納し、 受信し終わったら、受信命令が終了したことを通知する。

nick_2010
質問者

お礼

回答ありがとうございました。 アプリケーションレベルでもバッファが存在するのですね。 2個目のリンクのあたりの情報は知っているつもりですが、アプリケーションレベルのことはよくわかりませんでした。 時間があるときにもう少し詳しく読んでみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • TCP通信

    OS:Win2000、VisualBasic.netで開発しています。 現在TCP通信のプログラムを製造しています。 TCPサーバとTCPクライアントのテストアプリケーションを作成し、接続テストを行っているのですが、 サーバとクライアントの接続、データ送受信の確認はできました。 しかし、一度クライアント側から接続を切断(ソケットを消去)し、 再びソケットを生成してコネクト要求を出しても接続が確立できません。 このときサーバ側はなにも操作していません。 終始接続待機状態にしてあります。 ソースがないと分かりにくいかもしれませんが、 何か思い当たることがある方、アドバイスよろしくお願いします。

  • ソケット通信の送受信遅延-02 その後

    前回のNo.1031658 「ソケット通信の送受信遅延」に追加させてもらいます その後、プロトコルアナライザで現状調査を行い以下の現象を確認しました ◇正常時  サーバがメッセージ送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  0.2msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓  10msecで サーバが送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  0.2msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓          以下繰り返り ◇不具合時  サーバがメッセージ送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  0.2msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓  10msecで サーバが送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  約130msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:0 + 返信データなし ↓  約250msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓ といった状況です どう解釈すれば良いのでしょうか 遅延の原因はソケットなのかそれ以外なのでしょうか?是非アドバイスをおねがいします。

  • TCP及びUDP通信について

    TCP及びUDP通信について 現在WinSockAPIを用いた通信を行うプログラムを組んでいます。 しかしながらネットワークに関しては初心者で、わからない点がいくつか出てきたので質問させて頂きます。 -------------------------------------------------- 1.TCPで双方向通信を行う場合、サーバ側は指定したポートにbind→listenし、接続を待ち受けます。 クライアント側はサーバのIPを指定し、接続確立後にポートはOSが自動で割り振ると聞きました。 つまり、クライアント側がポートを開放せずに通信が出来るのは、OSなどが自動でポートを割り当て、割り当てたポートに到着したデータを該当アプリケーションに渡すからでしょうか? ポート関連は全てルータが管理しているものだと思っていたのですが、OSがポートを割り当てるという動作がよく理解できません。 -------------------------------------------------- 2.UDPで双方向通信を行う場合、端末A・端末Bともに指定したポートにbindする必要があると聞きました。 つまり、UDPで双方向通信を行う場合、端末A・端末Bの双方でポートを開放する必要があるということでしょうか? -------------------------------------------------- 是非ともご教授ください。

  • TCP/IPにおける端末間の通信について(NAPT)

    TCP/IPにおける端末間の通信について(NAPT) お世話になります。 TCP/IPについて質問です。 NAPT機能の付いたルータを介し、インターネット越しに通信を行う場合を想定します。 1.端末A(送信側)から端末B(受信側)にTCPあるいはUDPを用いてデータを送信する場合、端末Bでは必ず待ち受けるポートにbind(listen)し、また端末Aでは指定されたポート宛てにデータを送信する必要があると聞きました。 ここまでは理解できますが、ここにNAPT機能の付いたルータが介入する場合、"例外なく"端末B側のルータでポートマッピングを行う必要があるのでしょうか? 2.上記の認識がもし正しい場合、2台の端末で通信を行う場合は少なくとも片方でポートマッピングが必要ということになります。 だとするならば、SkypeやMSNメッセンジャーなどのクライアント側でポートマッピングが必要のないアプリケーションは、必ずサーバを介した通信を行っているということでしょうか? Skypeなどの仕組みを説明しているサイトを見ると、接続の手順を踏んだのちに端末間で通信を行うとの記述があるのですが、いくら接続先のIPがわかっていても、アプリケーション間で接続を確立するには、片方でポートマッピングが必要になると思うのですが、これはどういうことなのでしょうか? 3.上記の認識が正しい場合、UDPで受信する為には必ずポートマッピングが必要ということになります。 だとするならば、クライアント側でポートマッピングが必要のないアプリケーションは、少なくとも受信にはUDPを用いていないということでしょうか? 以上の3点についてお答え頂けると幸いです。 回答お待ちしています。

  • TCP/IPでRST(リセット)フラグのデータって?

    TCP/IPのデータで質問です。 パソコンのサーバーと無線ハンディをTCP/IPで通信しています。サーバー側は無線ハンディからの要求に応えるプログラム(Visual Basic,Winsockコントロール使用)が起動されています。 このサーバーに無線ハンディ30台(もっと多いこともある)から,いっせいに接続要求を出すのですが,この接続に失敗するハンディがあったりします。 このときLAN上のデータを見てみると,パソコン側からRST(リセット)フラグ(強制切断)のデータが出ていました。どうやらこれが接続に失敗している原因のようなのです。 このRST(リセット)フラグのデータが出るのは,どう行ったときなのでしょうか? どういう理由でRST(リセット)フラグのデータが出るのでしょうか? ご存知の方,いらしゃいましたら教えていただけないでしょうか? よろしくお願い致します。

  • BBルータでTCP通信のデータ部が捨てられている?

    インターネット上のServerと自宅PC間でWebを併用したデータ交換をしているのですが、ある限られたデータ部のみ、自宅のBBルータにより毎回捨てられているようで受信できません。 Serverと自宅PC(Client)にEtherealを同時に仕掛けPacketをモニタリングしました。 Server側のLogを見る限り、Serverは該当データを正しく送り、BBルータも正しく受信しているようです。 しかし、Client側のLogを見ると、その部分は Len=0 になっており、ヘッダ部だけのPacketが送信されて来たかのようになっております。 BBルータの設定可能項目では、いたって通常の設定になっており、また、自宅PCはWindowsXP SP2でFirewallはOff、ウィルス対策ソフトもアンインストール状態で実験しております。今回のトラブル以外は全てにおいて不具合は発生しておりません。 何か単純なTCP規則違反に該当しているのではとRFC793も確認したのですが原因がわかりません。 該当部分のEtherealのLogは以下の通りです。 何か大事なことを忘れていそうなのですが、どなたかご教授をお願い致します。 <Server側Log> ※No.292~294は3way handshakeです。 ※()内はTCP詳細部の内容抜粋です。 ※Server側のPortはWeb併用なので80番をそのまま使用。 No. SRC  DIST  Prot  Info 295 Client Server HTTP Continuation or non-HTTP Trafic 296 Server Client HTTP Continuation or non-HTTP Trafic (http > 62327 [PSH,ACK] Seq=1 Ack=24 Win=65512 Len=90) 297 Server Client TCP http > 62327 [FIN,ACK] Seq=91 Ack=24 Win=65512 Len=0 298 Client Server TCP 62327 > http [ACK] Seq=24 Ack=92 Win=65535 Len=0 299 Client Server TCP 62327 > http [FIN,ACK] Seq=24 Ack=92 Win=65535 Len=0 300 Server Client TCP http > 62327 [ACK] Seq=92 Ack=25 Win=65512 Len=0 <Client側Log> ※No.295と297~300はServer側Logと矛盾はありません。 No. SRC  DIST  Prot  Info 296 Server Client TCP http > 1157 [PSH,ACK] Seq=1 Ack=24 Win=65512 Len=0 以上

  • シリアル通信 大きいサイズの受信処理

    シリアル通信 大きいサイズの受信処理で質問があります OS:LINUX 開発環境 QT5.3 今 相手側機器から10秒ごとに190011Byteのデータくるようなしようとなっています そこで質問ですが 受信側ではどのような処理を組めば10秒ごとに来るデータをすべて受信できるのか よろしくお願いします open関数やread関数などを使用しています ボーレート値は230400bpsです 送受信バッファは1024byteとなっています

  • TCP/IP通信プログラミングにおけるデータ送信タイミングと受信データ処理のタイミングについて

    現在Winsockを用いてTCP/IPメッセージ通信を行うプログラムを作成 しています。 メッセージはヌル文字区切りで送信され、ヌルが発見されると一つの メッセージの終わりということにしてあります。 このメッセージを時間ウェイトを入れずに連続して送信すると受信側で 正常にデータが受信できず、送信したデータの一部しか受信できません。 ある程度の時間ウェイトを入れてやることで正常に送受信できるように なります。 受信側の処理において、recvでデータを取得した後にメッセージパーズ 処理を入れているのですがそれほど重い処理でもありません。いろいろ 調べたのですが正常に送受信するときとしないときの違いが連続送信時 に入れる時間ウェイトにあるということしかわかっておりません。 これがTCP/IPの特性なのか私の開発環境(PC・ネットワーク)に起因する ものなのかがわかりません。どなたかこういった現象についてご経験を お持ちの方がおられましたらご教授願いたいと思っております。 以上

  • OSIモデル上位三層をアプリケーションに割り当てるとしたら?

    OSI基本参照モデルは理想モデルであり、 現実にはTCP/IPモデルに上位三層が応用層として 割り当てられていますが、 ネットワークアプリケーションに実際割り当てて 考えてみましたが私の考えで合っているでしょうか? OE(アウトルックエクスプレス)を例にとって考えてみました アプリケーション層 説明:メッセージやファイルなどの 転送などさまざまなプロトコルがあり、 ユーザアプリケーションにネットワークサービスを 提供する役割を果たす。 OE:メールを受信するさいPOP3を使用する プレゼンテーション層 説明:圧縮方式や文字コードなど、 データの表現形式を規定する。 OE:HTML形式orテキスト形式かを指定する セション層 説明:アプリケーション間の確立・管理・終了を行い、相互に通信するためのルールを定めます。 OE:「送受信」ボタンをクリック 私、yukikundesuyoは発表の場を与えられ、 OSIとTCPを比較せよという課題が与えられたので これを例にとって説明しようと思っています。 回答のほどよろしくお願いします。

  • TCP/IP通信3ハンドシェイクについて

    TCP/IPのTCP通信の3ハンドシェイク通信に関して質問なのですが、インターネットを使ったある端末でセンターのサーバーと6秒に1度程度3ハンドシェイク通信を行ってインターネット回線が正常かどうかを判定する機能を持っているそうなのですが、その時に1回の通信でどの程度のパケットをやり取りしているのかということを質問してみたら、約1.2kbyte程度のパケットをやり取りしていると業者の方が言っていました。 ちょっと興味があってWireSharkでこの端末とサーバ間のパケット通信をのぞいてみたところ、端末が1.2kbyte送信していたのですが、サーバからのACKと思われるパケットが1.2kbyteのパケットを返してきていて、再度端末が60バイト程度のパケットをサーバのIPアドレスに送信していました。 私はてっきり、端末とサーバー間のこの3ウェイハンドシェイクのパケットの総量が1.2kbyteだと思っていたのですが、これだと1.2k + 1.2k + 60 = 2.46kbyteとなると思うのですが、パケットのやり取りとしては正しいのでしょうか? サーバー側が受信したら同じ容量の1.2kbyteのデータをACKとして返してきているように思うのですが、Wiresharkで見ても全く同じデータでは無いようでした。サーバはデータを受け取ったら、ちゃんと受信したという1 or 0のデータみたいなものを返せばよいだけだと思うのですが、理由はあるのでしょうか?

ライセンスの承認解除方法
このQ&Aのポイント
  • ライセンスを2つ購入して一台目のPCにインストールしようとしたら、承認できなくて2つめのライセンスで承認は出来たが、最初のライセンスが使用できなくなった
  • ライセンスの承認を解除する方法はありますか?
  • ソースネクスト株式会社の製品・サービスに関する質問です。
回答を見る