分享

细说网络代理程序

 心不留意外尘 2016-04-25
from http://zhoulifa./6337887.html
2007.06
  1、网络结构
目前的互联网最基本的结构是Server<->Client模式,即一个Client向Server发起请求,Server处理完请求后返回结果给Client。目前见到的各种网络应用也是以这个结构为基础的。比如Web服务器和Web浏览器即是一个Server和Client,通常情况下Web浏览器会直接向一个Web服务器发送一个HTTP的request,服务器处理该request并返回response给客户端。而BT之类的软件所形成的网络结构是稍微复杂一点的Server<->Client模式,即一台主机在做Client从别的主机获取文件的同时会作为Server向另外的主机传送它已经取得的文件内容给别人。
但有些情况下一台电脑并不能直接访问到某个网络,必须通过一个代理才能访问。具有代理的网络最基本的结构如下图所示:

在上图中,Client主机不能直接访问到Server,必须通过中间的Proxy主机。一般来讲Proxy主机必须具有双网卡,两块网卡配置两个IP地址连接两个不同网络,通常把连接Server一端的称为外网(或公网),把连接Client一端的称为内网,当然,通常情况下并不是只有一个Client,可能是一个交换机连接的很多Client。这种结构在我国IP地址资源缺泛的情况下是比较常见的,一个公司可能只有一个公网IP地址,所有员工通过这一个地址访问外网,一个网吧也可能只有一台主机与公网相连,其它所有主机通过那一台主机连接外网。
2、网络流程
在基本的Server<->Client模式下,访问一次网络的流程只有很简单的两个步骤:

1)Client连接Server并向Server发出请求;
2)Server处理Client请求并返回结果给Client,然后关闭网络连接。
在含有代理的网络中,网络流程变得不一样了,分成下面4个最基本的步骤:
A)Client连接Proxy并向Proxy发出请求;
B)Proxy连接Server并向Server转交上述请求;
C)Server处理Proxy转交的请求并返回结果给Proxy,然后关闭Server和Proxy之间的连接;
D)Proxy收到Server的结果后把该结果转交给Client,然后关闭Proxy和Client之间的连接。
以HTTP请求为例,假设Server的Web服务域名是www.,在基本的Server<->Client模式下,网络流程是:
1)Client连接Server并向Server发起请求
GET /index.php
host www.
......
2)Server处理请求,把index.php页面运行的结果返回给客户端

200 HTTP OK
index.php页面的内容
在有代理的网络中,上述A步骤中Client向Proxy发出的请求和B步骤中Proxy向Server发出的请求都是
GET /index.php
host www.
......
只是Proxy会根据请求内容中的host www.分析出这个请求应该转交到哪个Web Server去。即Proxy连接的是host所指定的Server。
而C步骤和D步骤中传递的也都是
200 HTTP OK
index.php页面的内容
同样,为了保证传递的信息准备,Proxy一定要记住之前是哪个Client发出的请求转交给www.这个Server了,才能知道将Server返回的消息传递给正确的Client。
3、软件的编写
为了实现代理上网的功能,我们必须在软件中增加一些。
首先要修改的是Client,在不用代理的情况下,我们在Web浏览器里输入一个地址,比如http://www.,Client程序只需要解析出域名www.的主机,然后连接该主机,向该主机发起一个
GET /index.php
host www.
......
的请求。如果设定了代理,比如192.168.1.254:3128,当我们在Web浏览器里输入http://www.后,Client软件并不去连接www.所在的主机,而是连接192.168.1.254的3128端口,连接成功后向192.168.1.254这个Proxy发出请求
GET /index.php
host www.
......
剩下 的事就交由Proxy来处理,Client软件只需要等着接收Proxy返回的结果就行了。
而这个工作早已经做好了。目前几乎所有的Web浏览器软件都已经做好这个工作了,你只需要在浏览器里设置一个网络代理就行了。

其次要编写的主要软件就是Proxy上的软件。它要接收Client发过来的请求
GET /index.php
host www.
......

然后分析出www.主机再连接该主机,连接成功后转交这一请求给Server,
并要等待Server返回的结果,再把这个结果转交给发起请求的Client。

而不需要做任何修改的是Server端,因为无论在什么情况下,它都是接收对方发过来的请求
GET /index.php
host www.
......
然后处理请求返回结果,最后关闭网络连接。

所以归根到底,真正要编写的软件就是Proxy软件了。
假设上图中Client主机的IP为192.168.1.100,Proxy的两个IP分别为192.168.1.254和202.10.100.100,Server的域名为www.、IP地址为67.100.21.33
在Proxy上编写程序的基本流程是:

1)建立socket,在192.168.1.254:3128地址开始listen;
2)当有连接3128端口时,读取该请求;
3)分析请求内容,找到www.,并通过gethostbyname取得Server的地址67.100.21.33;
4)连接Server的HTTP服务端口,并向Server发起请求;
5)等待读取Server的返回内容,读取完毕后关闭网络连接;
6)把读取的内容返回给Client端,即192.168.1.100连接上来的socket,最后关闭此socket连接。
一个端口转发Proxy的例子请参见: Linux下各类TCP网络服务器的实现源代码
本文只是基本概念说明,所以上面的内容与实际情况并不一致。各位要学会用tcpdump跟踪网络。请参见:

用tcpdump分析协议后用C语言自己编写一个BBS发贴机器人

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多