以前の回答はすべて間違っています。実際には、1つの長いsend()
呼び出しを発行するか、いくつかの小さなsend()
呼び出しを発行するかは問題ではありません。
Phillipが述べているように、TCPセグメントにはオーバーヘッドがありますが、アプリケーションプログラマーとしては、セグメントの生成方法を制御することはできません。簡単な言葉で:
1つのsend()
呼び出しが必ずしも1つのTCPセグメントに変換されるわけではありません。
OSは、完全に無料ですべてのデータをバッファリングし、一つのセグメントにそれを送ったり、長いものを取ると、いくつかの小さなセグメントにそれを破ります。
これにはいくつかの意味がありますが、最も重要なことは次のとおりです。
1つのsend()
呼び出し、または1つのTCPセグメントはrecv()
、もう一方の端での1つの成功した呼び出しに必ずしも変換されません
この背後にある理由は、TCPがストリームプロトコルであることです。TCPはデータをバイトの長いストリームとして扱い、「パケット」の概念はまったくありません。ではsend()
、あなたは、そのストリームにバイトを追加し、とrecv()
あなたが他の側オフのバイトを取得します。TCPは、データが可能な限り高速で反対側に届くように、適切と思われる場所でデータを積極的にバッファリングおよび分割します。
TCPで「パケット」を送受信する場合は、パケット開始マーカー、長さマーカーなどを実装する必要があります。代わりにUDPのようなメッセージ指向プロトコルを使用してはどうですか?UDPは、1つのsend()
呼び出しが1つの送信データグラムと1 つの呼び出しに変換されることを保証しrecv()
ます!
TCPだけを持っている場合、すべてがストリームのように見えます