TCP - это протокол транспортного уровня , в отличие от прикладного уровня. Это означает, что TCP не отвечает за типы отправляемых данных, только за необработанные биты. HTTP имеет заголовки и другие метаданные, потому что это уровень приложения.
Для проекта, подобного тому, о котором вы говорите, вы захотите реализовать собственный протокол прикладного уровня, но это не совсем тривиальная задача. Я хотел бы взглянуть на исходный код python в модуле httplib для примера того, как реализовать такой протокол, но учтите, что это, скорее всего, довольно сильно отличается от того, что вы хотите, так как вам потребуются постоянные сокетные соединения быть первоклассным гражданином в протоколе однорангового чата, подобном тому, который вы описываете.
Другой вариант - использовать одну из различных библиотек RPC, например, xmlrpclib , которая будет обрабатывать приличное количество необходимых низкоуровневых сетевых вещей для вас (хотя и не для передачи файлов; существуют другие библиотеки). как ftplib , который может это сделать).