HTTP 代理是发送自己的 TCP 数据包还是绕过客户端数据包?

网络工程 通讯协议 代理人 http-代理
2021-07-18 08:33:36

需要帮助了解使用 http 代理时 TCP 级别上发生的情况。

当客户端想要通过代理打开网站时,首先在客户端和代理之间建立连接。然后代理只是以两种方式在客户端和目标服务器之间传输流量。在 HTTP 级别,服务器看到与客户端发送的完全相同的数据(例如,用于 HTTPS 连接)。

问题是:对于较低的 TCP 级别是真的吗?服务器是否接收到从客户端发送的完全相同的 TCP 数据包,或者代理服务器可以在传递到目标服务器之前重建它们?另一种质疑方式:如果客户端是一台配置了 TTL=128、TCP 窗口大小=65535 的 Windows 机器,而代理服务器是一个 TTL=64 和窗口大小=5840 的 Linux 服务器,那么目标服务器会看到什么?

1个回答

代理通常是一个用户空间程序,它维护与客户端和服务器的独立 TCP 连接。虽然应用层有效负载可能会被代理保持不变(或不改变,代理通常会添加一些 HTTP 标头,如Via和/或X-Forwarded-For),但原始 TCP 数据包不会简单地通过,而是会创建新的数据包。

对于典型的非透明代理,这些新数据包包含与原始数据包不同的源和目标 IP 和端口。他们还可能以不同的方式打包应用程序有效负载。例如,原始客户端可能在一个数据包中发送了一个小的 HTTP POST 请求,而代理可能会从中生成两个数据包:一个包含 HTTP 标头,一个包含 HTTP 正文。

某些代理可以在目标透明模式下运行。在这种情况下,原始目标 IP 和端口被保留,但源 IP 和端口发生变化。并且一些代理可以在完全透明的模式下运行,另外还保留源 IP 和端口。但在所有这些情况下,代理可能会以不同的方式打包数据。即使数据包的有效载荷保持相同,TCP 序列号也很可能不同。

与在 IDS/IPS 中发现的 DPI(深度数据包检测)相反,它在数据包级别工作。它将分析应用层有效负载(就像代理一样),然后转发原始数据包(与代理不同),通常未经修改或至多略微修改(更改一些字节但保持大小)。