Tuesday, August 20, 2013

p2p over http

Идея проброса трафика через обычно открытый порт

Проброс point2point соединения через http соединение в теории можно осуществить через http 1.0 - так он позволяет иметь постоянное соединение, если не указывать размер результата. В таком случае соединение не будет закрыто до момента закрытия с обеих сторон, что позволяет после передачи стандартных минимальных заголовков иметь прямой канал.

Через прокси таким образом работать не получится так как буде работать только канал от сервера к клиенту, в обратную строну соединение не будет работать, можно создать прямое соединение через POST для отправки данных на сервер без указания размера данных используя передачу параметров запроса после заголовков не указывая multipart параметров и обратное через GET без указания размера. Такой способ соответствует спецификации в теории, но имеет несколько недостатков, так как мы имеем 2 соединения которые нужно объединить в одно виртуальное и обычно сервера не позволяют такое вольное отношение с протоколом вычитывая полностью данные с параметров запроса и буферизируя передаваемые данные и как результат такая система может работать не стабильно.

Как результат можно использовать POST запрос с указанием в ответе HTTP 1.0 без указания размера контента с обоих сторон без ожидание получения полного ответа с обоих сторон - в теории это должно повысить вероятность прохода трафика без задержек через прозрачные прокси и firewall - так как оно будет работать по протоколу который соответствует минимальном требованиям к обычно открытому порту для http.

Можно конечно использовать https - он будет более надежен в данном случае, так как после установления шифрованного соединения узлы через которые проходит трафик не имея ключа не могут влиять на трафик - но даже в этом случае нужно менять логику работы сервера и клиента - так как обычно они не рассчитаны на такое использование, когда после установления соединения мы передаем данные по другому протоколу.

Как расширение данного соединения можно сразу использовать потоковое сжатие подобное lzw в котором можно использовать дублирование символа сброса словаря, как признак того что нужно сбросить буферы и передать распакованный пакет дальше. На передающей стороне передавать такую последовательность в случае заполнения буфера передачи или срабатывание таймера на максимальную задержку на передачу пакета.

No comments: