正確に何を説明できますかSO_SNDBUF
およびSO_RECVBUF
オプション?
OK、なんらかの理由でOSが送信/受信データをバッファリングしますが、この件について明確にしたいと思います。
彼らの役割は何ですか(一般的に)?
それらはソケットごとのバッファですか?
トランスポート層のバッファー(TCPバッファーなど)とこれらのバッファーの間に接続はありますか?
ストリームソケット(TCP)を使用する場合とコネクションレスソケット(UDP)を使用する場合、動作/役割は異なりますか?
良い記事も素晴らしいでしょう。
私はそれをグーグルで調べました、しかし、どんな有用な情報も見つけませんでした。
"SO_"プレフィックスは "ソケットオプション"を表すため、これらはソケットごとのバッファのソケットごとの設定です。通常、システム全体のデフォルトと最大値があります。
_SO_RCVBUF
_の方が理解しやすい:ネットワーク経由で到着してから、このソケットを所有するプログラムによって読み取られるまでの間に、ソケットに到着するデータを保持するためにカーネルが割り当てるバッファーのサイズ。 TCPでは、データが到着してもそれを読み取っていない場合、バッファがいっぱいになり、送信者はスローダウンするように指示されます(TCPウィンドウ調整メカニズムを使用)。UDPの場合、1回バッファがいっぱいの場合、新しいパケットは破棄されます。
_SO_SNDBUF
_、TCPの場合にのみ重要です(UDPでは、送信するものはすべてネットワークに直接送信されます)。TCPの場合、リモート側がは読み取りを行っていません(リモートバッファがいっぱいになると、TCPはこの事実をカーネルに伝え、カーネルはデータの送信を停止します。代わりに、データがいっぱいになるまでローカルバッファに蓄積します)。または、ネットワークに問題があり、カーネルが送信するデータの確認を受け取っていない場合は、いっぱいになる可能性があります。その後、送信バッファーがいっぱいになるまで、ネットワーク上でのデータ送信が遅くなります。アプリケーションによるこのソケットへのwrite()
呼び出しはブロックします(または、_O_NONBLOCK
_オプションを設定した場合はEAGAIN
を返します)。
これはすべて nix Network Programming の本で最もよく説明されています。
Windowsでは、送信バッファはUDPに影響します。ネットワークがパケットを送信するよりも速くパケットを爆発させると、最終的にはソケット出力バッファーがいっぱいになり、SendToは「ブロックする」と失敗します。 SO_SNDBUFを増やすと、この問題が解決します。 WindowsボックスとLinuxボックスの間で送信できる最大パケットレートを見つけるために行っていたテストでは、送信バッファーと受信バッファーの両方を増やす必要がありました。 「ブロックする」エラーコードを検出し、少しスリープしてから再試行することで、送信サイズを処理することもできます。ただし、送信バッファサイズを増やすほうが簡単です。 Windowsのデフォルトは8Kです。この時代のPCにGBのRAMが搭載されていると、これは不必要に小さくなります。
Googleで「SO_RECVBUF msdn」を検索すると、...
http://msdn.Microsoft.com/en-us/library/ms740476(VS.85).aspx
これは、オプションテーブルの次の行を使用して、「ソケットごとにありますか」と答えます。
SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives.
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends.
詳細は後ほど:
SO_RCVBUFおよびSO_SNDBUF
Windows Sockets実装がSO_RCVBUFおよびSO_SNDBUFオプションをサポートしている場合、アプリケーションは異なるバッファーサイズ(大きいまたは小さい)を要求できます。 setsockoptの呼び出しは、実装が要求されたすべての量を提供しなかった場合でも成功する可能性があります。アプリケーションは、実際に提供されているバッファーサイズを確認するために、同じオプションを指定してgetsockoptを呼び出す必要があります。