3

サーバー側にはTwistedをベースに、クライアント側にはAndroidフォンなどのクライアントサーバーソリューションを実装しています。Andoirdエミュレーターは1500b(またはそれ以下?)より大きいTCPパケットを受け取らないため、サーバー側でパケットをチャンクできるようにする必要があります。「transport.write」ごとにソケットをフラッシュしないと、Twistedは送信データをバッファリングするため、手動または自動のフラッシュ/maxpacketsize関数がないとチャンクは役に立ちません。Twistedでこれを行うにはどうすればよいですか?私は「reactor.doSelect(1)」関数に精通していますが、EPollリアクターを使用しているため(スケーラビリティとパフォーマンス上の理由から)、doSelectを使用できません。Twisted内の特定の接続のmaxPacketValueを変更することは可能ですか?

誰かが私に光を見せてくれることを願っています...

4

2 に答える 2

2

TCPはストリーム指向のプロトコルであり、パケット指向のプロトコルではありません。を呼び出すとtransport.write、そのデータはTCPストリームに追加され、任意の数のパケットで送信される可能性があります。分割されているか、次または前のへの呼び出しと一緒に接着されている可能性がありますwrite。これはツイストについてかなりよく聞かれる質問ですが、それを尋ねる人は皆、少し違った質問をします。

パケット境界のランダムな性質に依存するのではなく、AMPなどのプロトコル構築キット、またはより基本的にはLineReceiverを使用して、プロトコル内のメッセージを区切ります。

于 2011-10-21T18:24:33.963 に答える
2

TCPパケットはOSによって自動的にチャンク化されます。アプリケーションが実行できるのは、フラッシュするタイミングのヒントを与えることだけです。それとは別に、アプリケーションはストリームの読み取りと書き込みを行うことができます。

通信している2つのピアのOSは、パスMTUディスカバリーを使用して、リンク上のMTUに基づいて最大パケットサイズを自動的に構成します。それを機能させるためにICMPパケットをブロックしないようにしてください。

間違ったMTUが問題になる可能性は非常に低いため(とにかく1500以下のMTUが設定されることが多い)、たとえばwiresharkなどのパケットトレーサーを使用して問題を再診断する必要があります。

于 2011-10-21T09:59:12.417 に答える