如果我想连接到 IP 100.100.100.100、端口 80,我的计算机将向网络发送一个带有该地址的 tcp 数据包。
现在,如果我使用代理服务器,比如 200.200.200.200 端口 8080(您可以在 Internet Explorer 中设置的此类代理),这个过程会如何改变?
当我仍然想连接到同一个 IP 时,IP 头是否会包含目标 IP 还是代理 IP,还是两者兼而有之?
我已经在 Google 上搜索过了,有数百页告诉你如何设置代理,但没有一页解释它的具体工作原理。
答案1
HTTP 请求从客户端发送到代理服务器的端口 8080。然后,代理服务器向目标站点发起新的 HTTP 请求。根据配置,代理通常会在 HTTP 请求中添加“X-Forwarded-For”标头。目标网站上的日志文件将显示代理的 IP 地址,但可能配置为记录“X-Forwarded-For”地址,也可能未配置。
这是典型的配置,但代理软件允许您进行各种自定义。
编辑:我应该指出,当我最初阅读您的问题时,我以为您是在专门询问 HTTP 代理,例如 squid 或 nginx。有许多不同类型的代理可用。在 Internet Explorer 中,您最有可能使用 HTTP 代理,但也有许多其他类型。
答案2
HTTP 是第 7 层协议,所以不要混淆。当您使用 HTTP 代理并输入 google.com 时,HTTP 标头仍然是相同的 google.com,但目标 IP 地址将是代理的 IP 地址,源将是主机 IP 到自定义端口号 8080。
答案3
要使用 HTTP 代理,请求将从客户端发送到代理服务器的 IP 地址,而不是目标服务器。 然后代理必须读取 HTTP 标头提取请求URI. 请求URI包含目标服务器的名称或IP,代理服务器使用该信息转发请求。
这HTTP 规范允许请求行在未使用代理时排除服务器名称和端口(因为如果请求直接发送到该服务器,则这些是不必要的)。但是,根据规范...
当向代理发出请求时,必须使用绝对 URI 形式。
因此,当不使用代理时,请求行可能如下所示:
GET /robots.txt HTTP/1.1
但要使用代理,该行必须包含服务器名称(如果不是 80,则还必须包含端口):
GET http://httpbin.org:80/robots.txt HTTP/1.1
由于代理服务器可以简单地通过预先建立的请求套接字中继逐字响应,因此操作的响应端可以更简单。
答案4
不存在“tcp 数据包”这种东西。TCP 是通过数据流进行操作的。存在 IP 数据包。
你似乎缺乏一些基本的网络知识,我建议你买一本关于 TCP/IP 的好书。大家最喜欢的似乎是 W. Richard Stevens 的《TCP/IP 图解》。
回到你的问题。
代理是一个中间人:
[您] - [代理] - [您要连接的服务器]
现在有两种不同的连接:
[您] - (您与代理的连接) - [代理] - (代理与服务器的连接) - [您要连接的服务器]
当您认为您正在通过代理连接到服务器时,您实际上是在连接到代理并告诉它您想要访问某个服务器。然后代理会打开从其自身到该服务器的第二个连接,并充当在两个方向上传递数据的中间人。