web-dev-qa-db-ja.com

UDP sendto()はいつブロックしますか?

UDPソケットでデフォルトの(ブロック)動作を使用している場合、sendto()の呼び出しはブロックされますか?私は本質的にLinuxの振る舞いに興味があります。

TCP送信ウィンドウがいっぱいの場合、輻輳制御によってsend()呼び出しがブロックされることは理解していますが、UDPはどうですか?時々ブロックするのでしょうか、それとも単にパケットを下位層で破棄するのでしょうか?

26

これは、ソケットバッファがいっぱいになった場合に発生する可能性がありますが、オペレーティングシステムに大きく依存します。 UDPは保証を提供しないため、ソケットバッファーがいっぱいになったときに、オペレーティングシステムが必要な処理(ブロックまたはドロップ)を決定できることを保証しません。一時的な救済のためにSO_SNDBUFを増やすことを試みることができます。

これは、システムの微調整にも依存する可能性があります。たとえば、ネットワークインターフェイスのドライバーのTXリングのサイズにも依存する可能性があります。 iperfメーリングリスト でこれについていくつかの議論がありますが、あなたは本当にこれをあなたのオペレーティングシステムの開発者と議論したいです。 O_NONBLOCKおよびEAGAIN/EWOULDBLOCKに特に注意してください。

16
MarcH

これは、オペレーティングシステムがリモートホストのハードウェアアドレスを取得するためにARP要求を実行しようとしていることが原因である可能性があります。

基本的に、パケットが送信されるたびに、ヘッダーにはリモートホストのIPアドレスとリモートホストのMACアドレスが必要です。 192.168.1.34およびAB:32:24:64:F3:21。

「ブロック」動作は、ARPが機能している可能性があります。

古いバージョンのWindows(2kだと思います)では、リクエストに時間がかかりすぎて送信するデータが多すぎると、最初のパケットが破棄されることがあると聞いています。それ以来、サービスパックはおそらくそれを修正しました。

9
mj_