Я работаю над простой программой передачи файлов и папок на С# с использованием протокола tcp.
Метод, который я использую для передачи файла, состоит в том, чтобы разделить его на небольшие части. Каждая из этих частей будет закодирована в Base64 и вставлена в более сложное сообщение JSON, которое затем будет отправлено другой стороне. Таким образом, благодаря Base64 каждое сообщение всегда будет в текстовом виде.
У меня нет большого опыта работы с сетями, и я решил сделать этот выбор, потому что чтение в Интернете, отправка потока байтов без какого-либо кодирования может привести к тому, что какая-то часть сообщения может быть интерпретирована маршрутизатором или брандмауэром как команда. прервать соединение.
Моя проблема в том, что мое программное обеспечение также работает с очень большими файлами (> 10 ГБ), а кодирование base64 только увеличивает размер данных и делает передачу очень медленной, потому что процессор так много работает для непрерывного кодирования/декодирования.
Теперь я хотел бы знать:
Какой тип двоичных данных вы пытаетесь отправить? Почему он такой большой?
TCP надежен, потому что данные отправляются блоками до 1500 байт с CRC в каждом блоке, и если блок не является ПОДТВЕРЖДЕНИЕМ, он повторно отправляется автоматически. Кодирование не требуется, но размер данных должен быть известен получателю, чтобы он не прекращал чтение в неправильном месте (либо завершающий символ, не являющийся частью данных, либо добавление счетчика байтов к началу). JSON — это http со специальными символами, которые нельзя отправить и которые должны быть в формате Base64.
Is it true that for example, sending a simple file converted only in bytes without first being encoded in any format, risks causing a problem to the router or firewall?
Нисколько. Это совершенно нормально, например, все, что HTTPS-связь является двоичной, и она работает.
Is it correct to use Base64 for large file transfers?
Хотя это можно сделать, это бесполезно, если базовый уровень поддерживает двоичные данные.
Are there better alternatives?
Используйте двоичный код напрямую. Ничего не кодируйте и не декодируйте. Не оборачивайте его в слои вроде JSON, которые на самом деле не нужны для передачи.
TCP — это протокол общего назначения для передачи потоков байты в обоих направлениях. Если бы существовали последовательности байтов, которые он не мог бы безопасно и надежно передавать, его конструкция не удалась бы.