考虑以下设置
+-------+ +--------+ +----------+
| | | | | |
| +----------->+ +---------->+ |
| | TCP TUNNEL | | HTTPS | |
+-------+ +--------+ +----------+
User SSH Server Web server
用户对 127.0.0.1:8888 执行 HTTP GET 请求
用户正在通过 TCP 隧道从 127.0.0.1:8888 传输到SSH 服务器,使用 SSH 端口转发
用户正在通过 TCP 隧道SSH 服务器发送到 Web 服务器,服务器响应传输编码:分块
用户仅接收前 700KB 的数据,连接就挂起。
当使用固定的 Content-Length 时,同样的事情也能完美运行。
调查
当从 SSH 服务器本身执行相同的 HTTP GET 请求时 -收到全部回复
当从另一种类型的 TCP 隧道(即从用户到 SSH 服务器的 SOCKS)执行相同的 HTTP GET 请求时 -用户仅接收 700kb 的数据
通过隧道执行 HTTP GET 请求时,HTTP 服务器以固定长度的主体进行响应,所有数据均已接收
谜题
我们应该从哪里开始寻找?为什么 HTTP GET 在直接从 SSH 服务器运行时可以完美运行,但通过隧道运行时却不起作用?