一:Introduction

Web 代理是充当 Web 浏览器和终端服务器之间的中间人的程序。浏览器不是直接联系终端服务器来获取网页,而是联系代理,代理将请求转发到终端服务器。当终端服务器回复代理时,代理将回复发送到浏览器。代理可用于多种用途。

有时在防火墙中使用代理,因此防火墙后面的浏览器只能通过代理联系防火墙之外的服务器。

代理也可以充当匿名者:通过剥离所有识别信息的请求,代理可以使浏览器对 Web 服务器匿名。

代理甚至可以用于缓存 Web 对象,方法是存储来自服务器的对象的本地副本,然后通过从缓存中读取它们来响应未来的请求,而不是再次与远程服务器通信。

在本实验中,您将编写一个简单的HTTP代理来缓存 Web 对象。

对于实验的第一部分,您将设置代理以接受传入连接、读取和解析请求、将请求转发到 Web 服务器、读取服务器的响应并将这些响应转发到相应的客户端。第一部分将涉及学习基本的 HTTP 操作以及如何使用套接字编写通过网络连接进行通信的程序。

在第二部分中,您将升级您的代理以处理多个并发连接。这将向您介绍如何处理并发,这是一个重要的系统概念。

在第三部分也是最后一部分中,您将使用最近访问的 Web 内容的简单主内存缓存将缓存添加到您的代理。

三个部分就可以归纳为:

A. 完成基础的代理的功能
B. 在上一步的基础上实现多线程
C. 在上一步的基础上添加缓存功能

二:实现代理的思路

什么是代理以及代理的作用

首先,我们必须明白代理是干什么用的。这样才能准确清楚我们要做什么。如同字面上的意思,代理起到一个类似中间商的作用。当我们利用代理访问某些网络资源的时候,我们客户端首先向代理发送信息,告诉它我们要访问的资源的位置。然后,代理就代替我们访问该资源(比如发送HTTP请求给服务端),服务端收到访问请求之后,将资源传回给了代理,代理接收后,又发送到我们客户端这边。这样我们就成功地间接访问到了该网络资源。这里以访问www.google.com为例,用一张简单的图来说明一下。

Untitled

那么,为什么我们不能直接访问www.google.com呢?答案显而易见了,www.google.com被墙屏蔽了,在中国大陆境内访问不了(ipv4协议下)。因此,这就是代理的好处之一。通过访问另一台在墙外的主机,由它帮我们去访问一些被墙的网站,然后再返回给我们,这样我们就成功地间接访问到了我们想要的资源了。

当然,代理还有另一个重要的好处,它可以便于我们实现缓存。我们知道,如果我们每次都直接访问服务器,那么势必会给服务器带来巨大的压力,甚至导致服务器瘫痪。而我们如果代理的时候,它可以自动进行页面的缓存,这样下一次我们再访问同一个资源的时候,代理就不需要向服务器发送请求,直接从本地的缓存中拿出页面文件,然后送回给我们即可,这同时也提高了访问的效率。

基本思路