Existe uma maneira de iniciar uma conexão de nível superior, ou seja, uma conexão http e, em algum momento, "reduzi-la" para uma camada inferior ou tcp? Basicamente, uma vez que a conexão foi feita com http, eu quero ser capaz de pegar o soquete e usá-lo com meu próprio protocolo personalizado.
relate perguntas
-
No PostgreSQL no Linux, editar pg_hba.conf e postgresql.conf e reiniciar o Postgres trava meu cluster na reinicialização (torna-o 'inativo')
-
Cabeçalho do host de entrada dobrado
-
Por que o Ultrasurf não está escondendo meu endereço IP?
-
wget retorna erro 404
-
É possível usar FTP sem sistema de arquivos no cliente?
Existem duas respostas, uma para o caso geral e outra para HTTP. E também depende de como você criou a "conexão" HTTP em primeiro lugar.
A maioria dos sistemas operacionais fornece apenas abstrações (sockets) até a camada TCP/UDP, e tudo o mais acima (ou seja, os protocolos da camada de aplicativo) geralmente é tratado - espere por isso - pelo aplicativo. Portanto, quando você estiver usando, por exemplo, um cliente SSH ou um cliente SMTP ou um cliente IRC, o aplicativo sempre pode "descer" para o fluxo TCP bruto porque é isso que o aplicativo tinha em primeiro lugar. O próprio aplicativo constrói tudo sobre a conexão TCP fornecida pelo sistema operacional.
O HTTP, sendo tão difundido, é uma espécie de exceção e geralmente possui bibliotecas compartilhadas (como libcurl ou python-requests) e até mesmo abstrações fornecidas pelo sistema operacional (como WinHTTP).
Bibliotecas como libcurl agem como parte do aplicativo e apenas se baseiam nos mesmos soquetes TCP fornecidos pelo sistema operacional. Alguns deles permitem acesso aos soquetes subjacentes; outros não fazem. Em qualquer caso, eles são opcionais para uso - alguns programas ainda preferem manipular um cliente HTTP sem um bom motivo.
Mas a outra razão pela qual o HTTP é uma exceção é que o aplicativo normalmente não inicia uma "conexão HTTP" em primeiro lugar. HTTP é um protocolo sem estado; a maioria das bibliotecas de cliente HTTP usa solicitação/resposta como abstração e só abre conexões TCP sob demanda. Várias solicitações podem compartilhar a conexão TCP subjacente ou não. (O protocolo pode ser HTTP/1.1 ou pode ser HTTP/2.)
Em outras palavras, muitas vezes simplesmente não há mais uma conexão de camada inferior quando você solicita uma.
Há exceções para isso também. Atualmente, muitos navegadores e sites usam websockets, que começam como uma solicitação HTTP comum, mas depois mudam para uma conexão de fluxo duplex tipo TCP. (No entanto, isso não é necessariamente TCP bruto - os websockets ainda podem usar TLS e podem ter sua própria camada de enquadramento. Acho que os websockets sobre HTTP/2 herdam seu enquadramento.)
Você não "rebaixa" para uma camada OSI inferior neste caso. Em vez disso, você define seu próprio protocolo de nível de aplicativo, que primeiro consiste em algo semelhante ao HTTP, seguido por tudo o que você precisa. As camadas OSI são apenas uma abstração no pensamento (ou seja, lidam com bytes na camada 4 TCP em vez de mensagens estruturadas na camada 7).
Quanto à implementação de seu próprio protocolo usando bibliotecas HTTP existentes: se isso é possível e como isso é feito depende totalmente da biblioteca HTTP. Alguns mantêm o soquete TCP subjacente por conta própria e alguns podem permitir que o desenvolvedor lide diretamente com ele. Alguns permitem que o desenvolvedor apenas crie uma solicitação HTTP como string e analise a resposta HTTP a partir da string e mantenha o controle do soquete TCP totalmente no desenvolvedor.