HTTP隧道如何工作?

Posted

技术标签:

【中文标题】HTTP隧道如何工作?【英文标题】:how does HTTP Tunneling work? 【发布时间】:2011-09-06 21:33:17 【问题描述】:

我正在查看 JHttpTunnel 库,OutBoundSocket.java 中的这段代码让我有点困惑。

 public void connect() throws IOException
close();

String host=getHost();
int port=getPort();

String request="/index.html?crap=1 HTTP/1.1";

Proxy p=getProxy();
if(p==null)
  socket=new Socket(host, port);
  request="POST "+request;

else
  String phost=p.getHost();
  int pport=p.getPort();
  socket=new Socket(phost, pport);
  request="POST http://"+host+":"+port+request;

socket.setTcpNoDelay(true);

in=socket.getInputStream();
out=socket.getOutputStream();
out.write(request.getBytes());
out.write(_rn);
out.write(("Content-Length: "+getContentLength()).getBytes());
out.write(_rn);
out.write("Connection: close".getBytes());
out.write(_rn);
out.write(("Host: "+host+":"+port).getBytes());
out.write(_rn);

out.write(_rn);
out.flush();

sendCount=getContentLength();

这似乎直接打开了一个到服务器的套接字。防火墙不会阻止吗?

【问题讨论】:

【参考方案1】:

防火墙可以阻止它,但这取决于配置,你可以问代理是否阻止它,答案是一样的。 上面的代码只是大图的一小部分...... 但是通常 HTTP 隧道应该打开一个到 HTTP 服务器的套接字并在 HTTP 请求上封装一个普通流,为了发送这些请求,需要在 HTTP 客户端和 HTTP 服务器之间建立一个套接字,这就是你在这里看到的。 你在这段代码中看不到的是封装的东西。 我希望这会有所帮助。

【讨论】:

以上是关于HTTP隧道如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

进行 HTTP 隧道时如何保持连接打开

通过 ssh 迁移工作台 - 如何设置隧道

如何编写 http 隧道

OpenStack 网络总结之:理解GRE隧道的工作流程

OpenStack 网络总结之:理解GRE隧道的工作流程

如何使用 ngrok 隧道使 spring social facebook 在 localhost 上工作