ソケット(ストリーム)とソケット(データグラム)の違いは何ですか?なぜ他のものを使うの?ネットワークプログラミングにおけるストリームとデータグラムの違いは何ですか?
答えて
私はずっと前に、2つの違いを説明するための大きなアナロジーを読みました。私はそれを読んだところを覚えていないので、残念ながらアイデアの著者には信用できませんが、とにかく自分の知識をコアの類推に加えました。
ストリームソケットは通話のようなものです。一方の側がコールを発信し、他方の回答はお互いに挨拶して(TCPのSYN/ACK)、情報を交換します。完了したら、さよならを言う(TCPのFIN/ACK)。片面に別れが聞こえない場合、これは予期せぬ出来事なので、相手は通常相手を呼ぶでしょう。通常、クライアントはサーバーに再接続します。あなたが送信したのとは異なる順序でデータが到着するという保証はありません。データが破損しないという合理的な保証があります。
データグラムソケットは、クラスにノートを渡すようなものです。ノートを渡している人のすぐ隣にいない場合を考えてみましょう。ノートは人から人へと移動します。それは目的地に到達しないかもしれないし、そこに到着するまでに変更されるかもしれない。同じ人に2つのメモを渡すと、ノートが教室を通るルートが同じではないかもしれないし、別のものと同じ速さでメモを渡すことができないため、意図しなかった順序で到着する可能性があります。
ストリームソケットを使用すると、情報を順番に並べてそのまま残しておくと重要です。ここではファイル転送プロトコルが良い例です。内容をランダムにシャッフルして破損したファイルをダウンロードしたくない!
ストリームのオーバーヘッドを高くしたくない場合(データグラムプロトコルが主にデータグラムプロトコルであるため、タイムリーな配信より重要度が低い(VoIPまたはゲームプロトコルと考える)サーバーが多数の要求に同時に迅速に応答できるようにするため)、またはデータがあて先に届いているかどうか気にしないときに役立ちます。
VoIP /ゲームケースを拡張するために、そのようなプロトコルには独自のデータ順序付けメカニズムが含まれています。しかし、1つのパケットが破損したり紛失したりした場合は、再送信要求を発行するためにストリームプロトコル(通常はTCP)を待つ必要はなく、迅速に回復する必要があります。 TCPは回復するまでに数分かかることがあり、ゲームやVoIPのようなリアルタイムプロトコルでは3秒でさえ受け入れられないかもしれません! UDPのようなデータグラムプロトコルを使用することで、失われたデータを無視するか、TCPより早く再要求するだけで、ソフトウェアはそのようなイベントから非常に迅速に回復することができます。
VoIPは単に失われたデータを無視するのに適した候補です。携帯電話の受信状態が悪いときに相手と話をするときのような短いギャップが聞こえるだけです。ゲームプロトコルはしばしばもう少し複雑ですが、通常、失われたデータを無視するか(後で受信したデータが失われたデータを置き換える場合)、失われたデータを再要求するか、完全な状態更新を要求するかのいずれかです。クライアントの状態がサーバーの状態と同期していることを確認します。
ストリームソケット:サーバとクライアントの間で
- 専用&ポイント・ツー・ポイントチャンネル。
- データ伝送にTCPプロトコルを使用します。
- 信頼性と無損失。
- 同様の順序で送受信されるデータ。
- 間違わ/失われたデータ
データグラムソケット回復するための長い時間:
- サーバとクライアントの間に専用の&ポイント・ツー・ポイントのチャネルを。
- データ伝送にUDPを使用します。
- 100%信頼できず、データが失われる可能性があります。
- データは/注文はSYNACKの詳細を含むため
- 1. Spring-SocialにおけるConnectControllerとProviderSigninControllerの違いは何ですか?
- 2. scikit-learnにおけるSVCとSVMの違いは何ですか?
- 3. AMDのAPP SDKと(AMD)ATIのストリーム技術の違いは何ですか?
- 4. 回帰におけるローカルとグローバルの基底関数の違いは何ですか?
- 5. 画像処理における画像分割と特徴抽出の違いは何ですか?
- 6. 仮想化におけるマシンイメージとインスタンスの違いは?
- 7. サービス指向アーキテクチャーにおけるサービスとアプリケーションの違いは?
- 8. clock()、gettickcount()、QueryPerformanceCounter()、およびQueryPerformanceFrequency()の違いは何ですか?
- 9. window.onload = init();の違いは何ですか?およびwindow.onload = init;
- 10. span、input、およびdiv要素の違いは何ですか?
- 11. db:test:clone、db:test:clone_structure、db:test:load、およびdb:test:prepareの違いは何ですか?
- 12. ctypes.pointer、ctypes.POINTER、およびctypes.byrefの違いは何ですか?
- 13. map、each、およびcollectの違いは何ですか?
- 14. UserControl、WebControl、RenderedControl、およびCompositeControlの違いは何ですか?
- 15. ラッパー、バインディング、およびポートの違いは何ですか?
- 16. DOCUMENT_NODE、DOCUMENT_TYPE_NODE、およびDOCUMENT_FRAGMENT_NODEの違いは何ですか?
- 17. インデックススキャン、テーブルスキャン、およびインデックスシークの違いは何ですか?
- 18. insert()、insertOne()、およびinsertMany()メソッドの違いは何ですか?
- 19. SAP/ABAPにおけるこれらの2種類の内部テーブル宣言の違いは何ですか?
- 20. difftimeと ' - 'の違いは何ですか?
- 21. A`と ``の違いは何ですか[:] `
- 22. `&`と `ref`の違いは何ですか?
- 23. バックスティックと$()の違いは何ですか?
- 24. `##`と `hashCode`の違いは何ですか?
- 25. "$^N"と "$ +"の違いは何ですか?
- 26. #{} $ {}と%{}の違いは何ですか?
- 27. typedefとの違いは何ですか?
- 28. %Qと%{}の違いは何ですか?
- 29. `==`と `is`の違いは何ですか?
- 30. $と$$の違いは何ですか?
単に優れた/間違ってデータを紛失回収気にしたりしないでください急速
この例、または非常によく似た例は、The Linux Programming Interfaceです。 2010年版には、これらの例が1155と1159ページに掲載されています。 – Josh