web-dev-qa-db-ja.com

SOCK_DGRAMおよびSOCK_STREAMとは何ですか?

アプリケーションを見るようになったこの奇妙なことに出会ったのは、デフォルトでSOCK_STREAM 関数。なぜそうですか?これは SOCK_STREAM単に複数のストリームを作成しますか?または、標準のSOCK_STREAM TCP stream(s)?

私は津波がUDPに基づいていると思っていましたが、まだTCPのようないくつかの機能を持っていますTCP公平性、友好性など。

誰かがこの問題に光を当ててください。私はこれについて完全に混乱しています。

30
echo9

TCPはほとんど常にSOCK_STREAMを使用し、UDPはSOCK_DGRAMを使用します。

TCP(SOCK_STREAM)は接続ベースのプロトコルです。接続が確立され、接続が一方の当事者またはネットワークエラーによって終了されるまで、2つの当事者は会話を行います。

UDP(SOCK_DGRAM)は、データグラムベースのプロトコルです。 1つのデータグラムを送信し、1つの応答を取得すると、接続が終了します。

  • 複数のパケットを送信する場合、TCPはそれらを順番に配信することを約束します。UDPはそうではないため、順序が重要な場合、受信者はそれらをチェックする必要があります。

  • TCPパケットが失われた場合、送信者は通知できます。UDPの場合はそうではありません。

  • UDPデータグラムのサイズには制限があり、メモリからは512バイトだと思います。 TCPはそれよりはるかに大きな塊を送信できます。

  • TCPはもう少し堅牢で、より多くのチェックを行います。 UDPは日陰の軽いウェイトです(コンピューターとネットワークのストレスが少ない)。

他のコンピューターとの対話方法に適したプロトコルを選択します。

47
Michael J

更新:私の答えはこれ以上関連性がないようですが、元の質問はUDTに言及しました。UDTはUDPの上に構築された接続指向のプロトコルです。詳細はこちら: http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol


UDTは、従来のBSDソケットAPIを模倣するAPIを提供しているように見えるため、ストリーム指向およびデータグラム指向のアプリケーションの両方で、ドロップイン置換として使用できます。確認してくださいsendmsgおよびrecvmsg-SOCK_STREAMで作成されたソケットで使用すると例外がスローされ、すべてのストリーム指向APIはSOCK_DGRAMで作成されたソケットで例外をスローします上手。

SOCK_DGRAMの場合、それはいくつかの追加処理を実行しますが、そのような場合にUDPソケットを単純に透過的にラップするわけではありません-クイックレビューの後でコードを理解する限り(UDT内部またはプロトコル仕様)。 技術論文 を読むことは大いに役立つでしょう。

ライブラリは常に、その基礎となる「実際の」ソケットをデータグラム1として作成します(channel.cpp、CChannel::openを確認してください)。

7
Code Painters