カーネルネットワークスタックは、ソケットごとにの受信バッファを保持します。 setsockopt(2)
システムコールの場合は、SO_RCVBUF
オプションを使用してそのサイズを制御できます(Java APIが何であるか把握する必要があります)。
したがって、受信パケットは、そのバッファに十分なスペースがある限り、カーネルにキューイングされます。特定の瞬間にアプリケーションが「受信」機能を実行するためには、ではなく、が必要です。アプリケーションが十分な速さでパケットを待ち行列から外す(すなわち読み出す)ことができない場合、バッファはオーバーフローし、カーネルはパケットを廃棄し始める。 Linux(一般的にはUnix)では、netstat -s
コマンドでパケットの廃棄数を確認できるはずです。
このバッファは、パケットがドロップされる唯一の場所ではありません。オンNICメモリに十分なスペースがない場合、ハードウェアによってパケットがドロップされる可能性があります。カーネルがビジー状態で、一般的なネットワーク入力キューを処理していない場合、デバイスドライバはパケットを破棄できます。あなたはこれに堂々とメッセージを送る必要があります。
TCPは、トータルシーケンシングと、必要であれば、再送信でこのすべてを回避しようとします。あなたが接続されたUDPソケット上の2番目のsend(2)
からのエラーを受け取り、ICMPが正しく動作する場合のみを除いて、UDPは、あなたのために落としたパケットについては何もしません。
最終行は、パケットがバッファされているが、その時点まで廃棄されていることです。
あなたへの誇り! Androidのドキュメントを確認しました。デフォルトのソケットバッファサイズは4098バイトです。これはソケットのコンセプトをより明確にします。 – LordTwaroog