Но, наконец, я получил менее 10000 (около 9960) в B. Почему это происходит?
UDP - протокол с потерями. Даже если вы получили 10000 в этом тесте, вам все равно придется кодировать вероятность того, что некоторые пакеты будут потеряны. Они также могут быть фрагментированы (если их размер превышает 532 байта) и / или могут быть выведены из строя.
Куда делся потерянный пакет?
Они были сброшены.
Не были ли они фактически отправлены на провод к коммутатору?
Их можно сбросить где угодно. Я не верю, что в Java есть какая-либо логика для отбрасывания пакетов (но это не гарантируется во всех реализациях). Это может быть сброшено ОС, сетевым адаптером, поврежденным на проводе, сброшенным коммутатором.
Или коммутатор их потерял?
Это будет сделано, если пакет каким-то образом был поврежден или заполнен буфер.
Или они действительно добрались до Б, но ОС Б отказалась от них?
Да, или операционная система А. могла бы их удалить.
Или они достигли Java, но Java выбросила их из-за полного буфера?
У Java нет собственных буферов. Он использует базовые буферы от ОС. Но пакеты могут быть потеряны на этом этапе.
Примечание. Независимо от того, насколько вы уменьшите потерю пакетов, вы всегда должны учитывать некоторые потери.