Я предлагаю использовать contentLength вместо networkStream.DataAvailable , чтобы определить, когда передача данных завершена.
DataAvailable просто означает, что есть данные, полученные стеком ОС, однако, в зависимости от сетевой маршрутизации и фрагментации, они могут не прийти к моменту проверки состояния, поэтому вы прекращаете получать эти данные слишком рано .
Чтобы доказать или опровергнуть это, вы можете сделать сравнение двоичного файла между тем, что загружала ваша программа, и тем, что загружал бы обычный браузер. Если первый из них усечен, то мы нашли проблему.