代理服务器(Proxy)原理

背景

之所以要写这篇文章,是因为我碰到了如下的问题:在浏览器中输入网址并回车,浏览器显示说代理服务器可能有问题,或地址不正确
在这里插入图片描述
但电脑此时是联网的,ping www.baidu.com也可以正常运行
通过查找资料后,发现了问题所在:打开电脑的控制面板 -> 找到 Internet选项 -> 上方功能栏点击 连接 -> 局域网设置 -> 把 代理服务器 下的 为LAN使用代理服务器选项的勾去掉 -> 点击确定
在这里插入图片描述
从上图中可以发现电脑使用了127.0.0.1作为代理服务器的IP地址,端口号为10086。注意127.0.0.1这个IP地址表示这台主机本身,因此实际上该配置将电脑自己设置为了代理服务器,那为什么这样设置无法通过浏览器访问网址?在网上查找资料时,没有找到针对这一问题作具体解释的文章,因此我便打算写这篇博客来解释其中的原因。

IP地址可以认为是用来确定和哪台主机进行通信,而端口号则是用来确定和主机上的哪个进程进行通信

什么是代理服务器

举个例子,一台主机想要访问某个网址,该主机不会直接向对应的服务器请求该网址,而是通过一个中间服务器,主机告诉中间服务器我想要哪个网址的内容,中间服务器代替主机去请求该网址,中间服务器得到响应后将该响应发送给主机。这里的中间服务器就是代理服务器(Proxy Server)

典型地,翻墙软件的基本工作原理就基于此

为什么会出现 代理服务器可能有问题,或地址不正确 的错误

由于设置了代理服务器为 127.0.0.1,因此每次浏览器请求Web页面的时候,都会先和代理服务器进行通信,告诉代理服务器主机要请求的URL。
具体的来说,浏览器会先尝试和代理服务器建立TCP连接,连接建立成功后,浏览器会将HTTP请求发送给代理服务器,代理服务器收到请求后便向对应的Web服务器发送请求来获取页面。
由于设置了端口号为10086,因此浏览器会尝试和该代理服务器上运行在端口10086的进程建立TCP连接,而之所以会出现 代理服务器可能有问题,或地址不正确,一个可能的原因就是代理服务器上没有运行在端口10086上的进程,因此浏览器无法和代理服务器建立TCP连接,从而出现代理服务器可能有问题,或地址不正确的错误。

ShadowsocksR这种软件的工作原理也是类似这样,首先它会建立一个socket套接字,然后绑定主机的IP地址以及一个端口号,绑定成功后,它更改主机的代理服务器设置,比如说设置代理服务器IP地址为127.0.0.1,即主机本身,设置端口号为它绑定的端口号。
这样一来,浏览器请求Web页面的时候,先和ShadowsocksR进程建立TCP连接,建立成功后,将HTTP请求发送给ShadowsocksR进程,然后ShadowsocksR进程会和其记录的真正的代理服务器来通信,让真正的代理服务器去请求对应的Web页面

动手实验一下

使用Python实现简陋的代理服务器

下面为一个代理服务器的Python代码,该服务器在接收到浏览器的HTTP请求后,仅仅只是将该HTTP请求的内容打印出来

import socket

host = ''
port = 10086
proxy_sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
proxy_sever_socket.bind((host, port))
proxy_sever_socket.listen(1)
while True:
    connect_socket, addr = proxy_sever_socket.accept()
    msg = connect_socket.recv(102400).decode()
    print(msg)
    connect_socket.close()

运行代理服务器

运行该代码后,该代理服务器绑定了主机上的端口10086,这点可以用命令netstat -ano | findstr 10086来查看,输出如下所示
在这里插入图片描述
可以看到进程21012占用了端口10086
打开任务管理器,找到该进程,从下图可以看出pythone.exe占用了端口号10086,这是合理的,因为我是用Python执行的这段代码
请添加图片描述

更改主机设置

接下来如下图所示更改设置
在这里插入图片描述
到目前为止,已经成功地设置该服务器为代理服务器。

使用浏览器测试

接下来,打开浏览器,输入网址www.baidu.com并回车,可以看到代理服务器有如下输出:
请添加图片描述
浏览器输出为
请添加图片描述
如果关闭该代理服务器,再输入网址www.baidu.com,可以看到浏览器有如下输出:
请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值