Ответ 1
Пока вы можете написать спецификацию данных, отправляемых через сокет TCP, у вас есть собственный протокол.
В основном это касается определения команд и полезных нагрузок. Вы должны выполнить сериализацию своего командного пакета, прежде чем вводить их через TCP. Endianness - общая ошибка, если вы упаковываете пакет в двоичном формате. XML и JSON - это обычные текстовые форматы обмена данными. Лично я про-JSON.
Обратитесь к BSON, MessagePack или protobuf для двоичной сериализации. Они упаковывают данные напечатанные в двоичные файлы, поэтому они имеют лучшую проверку типов, чем сериализацию на основе текста и более компактную по размеру. Они также обрабатывают конечное преобразование, управление версиями пакетов и предоставляют драйверы/привязки на разных языках. Сервер и клиент могли быть написаны на разных языках.
EDIT: добавлены образцы RFC
Увидев комментарий Росса Паттерсона, я также рекомендую прочитать RFC для ссылок на определение протокола. RTSP и HTTP - это текстовые протоколы, RTP и медиаформаты (MPEG4 AV, H-264) являются двоичными протоколами.
EDIT:
Демистификация протоколов и производительность сериализации с Тоддом Монтгомери