Общие сведения: я работаю с устаревшим кодом и пытаюсь загрузить двоичный файл (~ 2 МБ) на встроенный веб-сервер microhttpd через форму HTTP (запрос POST). В последнее время я заметил, что скорость загрузки с машин Windows 10 значительно ниже, чем с машин, не являющихся Windows 10: загрузка будет отправлять несколько байтов за раз (около 6-7 кусков по ~ 1500 байт каждый ) и затем приостанавливается, иногда на 30-60 секунд, перед отправкой еще нескольких байтов. Уменьшение скорости, вызванное этой проблемой, делает весь процесс загрузки непригодным для использования.
Я выполнил некоторую отладку на встроенном сервере и обнаружил, что он действительно ожидает поступления дополнительных данных в сокет, созданный для запроса POST. и что по какой-то причине эти данные не отправлялись клиентским компьютером. После некоторого анализа в Wireshark для Win10 по сравнению с трафиком, отличным от Win10 c, появляются сообщения, которые я вижу, чтобы соответствовать проблеме, описанной Microsoft здесь: https://support.microsoft.com/en-gb/help/823764/slow-performance-occurs-when-you-copy-data-to-a-tcp-server-by-using-a.
Специально Я вижу, что в случае Windows 10 первый пакет TCP, отправленный на встроенный веб-сервер, действительно «один вызов отправки [который] заполняет весь базовый буфер отправки сокета» , так как согласно статье Microsoft. По-видимому, это не относится к машинам, отличным от Windows 10. Следовательно, мне нужно иметь возможность настроить свои сокеты таким образом, чтобы веб-клиент не отправлял столько данных, чтобы заполнить приемный буфер одним пакетом.
К сожалению, основные модификации самого веб-сервера ( кроме небольших настроек конфига) не может быть и речи, поскольку устаревший код, с которым я работаю, общеизвестно связан и нестабилен. Поэтому я ищу способ указать настройки сокета через JavaScript, если это возможно. В настоящее время я использую плагин JQuery Form, который работает поверх XMLHttpRequests. Поскольку у меня есть полный контроль над страницей JavaScript и встроенным веб-сервером, я могу жестко запрограммировать размеры буферов сокетов соответствующим образом в обоих случаях.
Существует ли способ настройки параметров сокетов низкого уровня, например это из JavaScript? Если нет, был бы другой способ обойти эту проблему?