2017-04-13 9 views
2

書き込まれたデータの量が少ない場合、TCP/IPソケットへの書き込みはアトミックになると私は理解しています。アトミックでは、受信者がすべてのデータを受信するか、データを受信しないことを意味します。ただし、書き込まれるデータの量が多い場合は、アトミックではありません。私は正しいですか?もしそうなら、何が大きなものとみなされますか?アプリによって書かれたすべてのデータが1つのUDPデータグラムで送信されるためTCP/IPソケットはアトミックですか?

おかげで、UDPの場合 ボブ

+1

ボブ、あなたの質問は良いですし、多くのプログラマーは、彼らがTCPソケットでNバイトを送信すると、他のノードはすべてNバイトを読むと思うというエラーがあります。その後、機能テストを実行して動作します。しかし、それはしばらくの間システムに障害を引き起こすバグです。あなたがしたいのは、単純なアプリケーション層プロトコル、通常はTLV(タイプ、長さ、値)を作成することです。ここで説明します(この問題はプログラミング言語で有効です):http://stackoverflow.com/questions/19839172/how-to-read-all-of-inputstream-in-server-socket-java/19863726#19863726 – rodolk

答えて

1

は、それは、本当です。

TCPの場合、アプリケーションが一度に1バイトのデータしか送信しない限り、そうではありません。 TCPソケットに書き込むと、そのソケットに関連付けられているバッファにすべてのデータが書き込まれます。 TCPはそのバッファからバックグラウンドでデータを読み取り、それを受信者に送信します。

  • は、他のノード(受信機)によって公表ウィンドウ以前に送信されたデータの
  • 金額を受け取る:1つのTCPセグメントを含む、そのフロー制御メカニズムの変数、およびその他の要因に依存してどのくらいのデータTCPは、実際に送信しますまだ
  • スロースタートと輻輳回避アルゴリズム状態
  • 交渉の最大セグメントサイズ(MSS)を認めていない飛行中のセグメントTCPでは

、あなたはassum決してすることができますアプリケーションがソケットに書き込むものは、実際に受信者が1回の読み取りで受信します。ソケットのバッファ内のデータは、1つまたは複数のTCPセグメントで受信側に送信できます。データが利用可能になると、受信機はその時点で実際に利用可能なデータであればソケットの読み取りと復帰を実行できます。

もちろん、送信されたすべてのデータは最終的に受信者に届きますが、途中で障害が発生していない場合、受信者がデータを受信する前に接続を閉じたり読み取りを停止しないと、

+1

"*アプリケーションが一度に1バイトのデータしか送信しない限り*" - これはデータがデフォルトでバッファされているため保証されません。 'TCP_NODELAY'ソケットオプションを有効にしない限り、複数の1バイト書き込みを実行して、それらを単一のTCPセグメントで一緒に送信することができます。 –

+1

いずれにしても、1回の受信操作でそれらをすべて受信*できます。 @RemyLebeau – EJP

+0

@EJP:複数のTCPセグメントが受信され、アプリケーションが新しい読み取り操作を実行する前にソケットにバッファリングされている場合は、はい。 –

2

いいえ。TCPはバイトストリームプロトコルです。メッセージはなく、データグラムのような振舞いもありません。

+0

私が受け取った応答に基づいて、サーバーが4バイトの整数を書き込み、クライアントが4バイトの整数を読み取った場合、書き込みはアトミックではないので、読み取りは2バイトを返すだけで、その後の読み取りは他の2バイト。私はその権利を持っていますか?ボブ。 – Bob

+0

@Bob、それは正しいです。 – rodolk

関連する問題