web-dev-qa-db-ja.com

TCP順番に到着することが保証されていますか?

2つのTCPメッセージを送信する場合、後者が前者の前に到着する場合を処理する必要がありますか?それとも、送信した順序で到着することが保証されていますか?これはそうではないと思いますツイスト固有の例。TCP標準に準拠する必要があるためですが、ツイストに精通している人が私自身の安心のためにツイスト固有の回答を提供できる場合は、それをいただければ幸いです。 -)

35
Smashery

2つのメッセージが送信されている限り同じTCP接続で、順序は維持されます。同じプロセスのペア間で複数の接続が開かれている場合は、トラブルにあっている。

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

49
Jeffrey Hantin

TCPはコネクション型であり、クライアントに順番に配信を提供します。もちろん、これは接続レベルにも当てはまります。個々の接続は独立しています。

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

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

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

24
jldupont

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

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

私の以前の投稿で水を濁してすみません...

18
Matt Davis

TCPはストリームであり、UDPはメッセージです。あなたは用語を混同しています。 TCPの場合、ストリームは送信されたのと同じ順序で到着します。TCPには個別のメッセージはなく、到着時にバイトが表示され、メッセージとして解釈されます。 。

7
Jochen Ritzel