Я создаю клиент/сервер дистанционной работы.NET, который будет передавать тысячи файлов переменных размеров (все от нескольких байтов до сотен МБ), и я хотел бы некоторую обратную связь на лучшем методе для достижения этого. Поскольку я вижу его, существует несколько опций:
Каковы самый гибкий метод / метод надежной передачи? Я не то, который коснулся о скорости, но больше о надежности - я хочу, чтобы файл переместился, даже если это медленно. Так как клиент и сервер будет многопоточным, я могу передать несколько файлов одновременно, если соединение позволяет его.
Спасибо за Вашу обратную связь - я добавлю щедрость для получения некоторых рекомендаций на способах, которыми люди выполнили бы это.
BITS (background Intelligent Transfer Service) - хорошее решение. В него встроен многолетний опыт
Некоторые отправные точки:
Хотя спокойствие действительно отвечает на вопрос, который вы задаете со стороны жизни уровня OSI 4, мне кажется, что вы больше смотрите на уровни приложений в вашем вопросе. TCP определенно обрабатывает все, начиная от задержки, окон передачи и т. Д. В сетевой части жизни. Однако он не определяет напрямую, что произойдет, если пользователь преждевременно завершит сеанс загрузки, а затем решит продолжить его с того места, где он остановился.
Чтобы ответить на ваш вопрос под другим углом, я определенно рекомендую разбить файл на разделы и проиндексировать их для всех подключений, независимо от скорости. Затем они могут быть повторно собраны на клиенте после загрузки всего файла. Это позволяет пользователю приостанавливать и возобновлять сеансы загрузки.
Что касается определения скорости, для этого могут быть встроены методы, но один из методов, который вы можете использовать, - это просто создать свой собственный тест скорости: отправить 1 МБ клиенту (загрузка) и пусть он отправит ответ после получения. 1100, разделенное на время, необходимое для получения ответа от клиента, - это количество килобайт / с, необходимое клиенту для загрузки с сервера. И наоборот, чтобы протестировать загрузку с клиента.
Что касается передачи, я бы рекомендовал использовать существующие технологии. SFTP поддерживает передачу зашифрованных данных с аутентификацией. Это в основном FTP, но по SSH. Где-то должны быть API-интерфейсы для взаимодействия с этим.
Кстати, я никогда не делал ничего в той степени, о которой вы говорите, но, надеюсь, мои идеи, по крайней мере, дадут вам пару вариантов для рассмотрения.
Это то, для чего создан протокол TCP и настраивается на него в течение десятилетий или тяжелых испытаний. Удаленное взаимодействие выполняется для небольших вызовов RPC, а не для передачи больших файлов. Вы должны просто использовать TCP-сокет для передачи данных, а протоколы нижнего уровня должны беспокоиться о задержке, окнах передачи, MTU и т. Д.