41

2 つの TCP メッセージを送信する場合、後者が前者より先に到着する場合を処理する必要がありますか? それとも、発送した順番通りに届く保証はありますか?TCP 標準に準拠する必要があるため、これは Twisted 固有の例ではないと思いますが、Twisted に精通している人が私の心の平和のために Twisted 固有の回答を提供できれば、それは高く評価されます :-)

4

4 に答える 4

52

2 つのメッセージが同じ TCP 接続で送信されている限り、順序は維持されます。同じペアのプロセス間で複数の接続が開かれていると、問題が発生する可能性があります。

Twisted やその他の非同期イベント システムについてはdataReceived、バイトが受信された順にメッセージが表示されると思います。ただし、遅延呼び出しに作業をプッシュし始めると、制御フローを認識できないほど「ひねる」ことができます。

于 2009-11-06T23:19:18.847 に答える
25

TCP は接続指向であり、そのクライアントに順序どおりの配信を提供します。もちろん、これは接続レベルにも当てはまります。個々の接続は独立しています。

通常、「TCP ストリーム」と「UDP メッセージ」を指すことに注意してください。

使用するクライアント ライブラリ (Twisted など) に関係なく、基礎となる TCP 接続はそれとは無関係です。TCP は「プロトコル メッセージ」を順番にクライアントに配信します。「プロトコル メッセージ」とは、もちろん、TCP 層で使用するプロトコルを指します。

さらに、I/O 操作は本質的に非同期であり、システム負荷に大きく依存し、さらにネットワークの遅延と損失を悪化させるため、 TCP 接続間のメッセージの順序付けに依存できないことに注意してください。

于 2009-11-06T23:21:52.223 に答える
19

TCP は、送信者によって最初に送信されたとおりに、受信者が再構成されたバイト ストリームを受信することを「保証」します。ただし、TCP 送受信エンドポイント (つまり、物理ネットワーク) 間では、データが順不同で受信されたり、断片化されたり、破損したり、失われたりする可能性さえあります。TCP は、不良パケットの再送信を引き起こすハンドシェイク メカニズムを使用して、これらの問題を解決します。受信側の TCP スタックは、これらのパケットを送信された順序で配置するため、TCP ソケットから読み取ると、最初に送信されたとおりにデータを受信できます。

Twisted でdoReadメソッドを呼び出すと、バッファのサイズまでデータがソケットから読み取られます。このデータは、単一のメッセージ、部分的なメッセージ、または複数のメッセージを表す場合があります。バッファーからメッセージを抽出するのはユーザー次第ですが、この時点でバイトが送信された順序になっていることが保証されます。

以前の投稿で水が濁ってしまい申し訳ありません...

于 2009-11-06T23:26:56.247 に答える
8

TCP はストリーム、UDP はメッセージです。用語を混同しています。TCP の場合、ストリームが送信されたのと同じ順序で到着することは事実です。TCP には個別のメッセージはなく、バイトが到着すると表示され、メッセージとして解釈するかどうかはユーザー次第です。

于 2009-11-06T23:20:34.753 に答える