背景
之所以要写这篇文章,是因为我碰到了如下的问题:在浏览器中输入网址并回车,浏览器显示说代理服务器可能有问题,或地址不正确
但电脑此时是联网的,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
,可以看到浏览器有如下输出: