以前大二的时候,接触到了《HTTP权威指南》这本书,当时觉得这本书好棒,容易懂,而且配了很多图,很容易就明白作者的意思。除去附录,其实也不厚。是不是可能有这样一种趋势,好像外国人都是喜欢把难的东西写的更简单,咱们国内的书可能就喜欢写的很复杂,=。=。当时看了前面三章,到后面讲代理,隧道,网关的时候不太明白就放下了。这段时间有点积累,再加上最近又上了一点点网络课了,再去看的时候就觉很容易明白,也轻松了很多。那时候在CSDN上面写了两篇博客,主要是记录所学的。HTTP概述和TCP/IP。(ps,忽略排版这件事)。所有的图片都是来自这本书。接下来我会每个星期都看几章,然后把东西都整理到博客。主要目的也是整理思路,方便查阅,系统的学习下,也分享给大家。
Web的组件结构
我们知道了万维网的基本组件是HTTP客户端和HTTP服务器,他们其实还有与很多其他的Web应用程序进行交互。下面简单的说明下这些Web组件的是什么和他们的作用。具体有代理,网关,隧道,缓存。以后会有专门的文章专门再讲他们。
代理
HTTP代理服务器是Web安全,应用集成以及性能优化的重要组成模块。
代理是什么?代理是个HTTP中间实体,它位于客户端和服务器端。
这个图上我们看的出来,代理位于他们中间,并且接收所有的客户端HTTP请求,并且将这些请求转发给服务器,这个过程中,代理服务器可能会做一些修改和变动然后转发给服务器。
代理有很多作用,我们一般把代理作为转发所有Web流量的可信任中间节点使用,因为它可以接触到所有流过的流量。比如代理可以作为过滤器,让儿童就不能看不好的内容。再比如,网络工程师用代理服务器提高安全性,把代理服务器当做安全防火墙。再比如我们利用代理服务器做缓存,利用代理做反向代理,内容路由器等等。
代理还可以分为正向代理和反向代理。这个我有先前写过一篇博客。文章地址
这中间可以思考下面的几个问题:
- 代理请求中的URI和服务器请求中的URI有什么不同呢?
- 我们刚刚知道了代理服务器可以修改内容,那么修改URI的原则是什么呢?
- 拦截和反向代理是怎么把服务器主机的信息隐藏起来的呢?我们知道反向代理时,用户不知道代理服务的存在。
- 代理怎么样印象浏览器的只能URI自动完成机制,或主机扩展名特性呢?比如我输入cailidan,浏览器会去搜什么呢?
http://cailidan.com?
还是http://cailidan.cn?
缓存
Web缓存,也成为代理缓存,它是上面的一种特例,是一个特殊的代理服务器。可以常常把代理传送的常用文档存起来。这样下一个请求同一个文档的客户端就可以直接在代理商享受私有副本提供的服务了。
为什么要这样呢?客户端从离他近的地方下载文档不很明显比从远程的Web服务器上下载要快很多吗?Http定义了很多功能,很多头部,用来更高效的缓存,也规范了新鲜度和缓存内容的隐私性。
网关
网关是什么?网关是一个特殊的服务器,作为其他服务器的中间实体使用。主要用来将HTTP流量转化为其他的协议,用户在发送请求的时候,并不知道自己正在是和网关通信,网关这时候表现的就像资源的源端服务器一样。
如上面的图,一个HTTP/FTP的网关会通过HTTP请求对FTP URI的请求,但通过TFP来获取文档。得到了文档会被FTP服务器封装成成一条HTTP报文。并且发送给客户端。
好,到这里,网关和代理又有什么区别呢?
严格来说,代理连接的是两个或者多个使用相同协议的应用程序,而网关却连接的是两个或者使用不同协议的端点。网关扮演的是“协议转换器”的角色。及时客户端和服务器使用的是不同协议,客户端也能够通过它完成和服务器之间的事物处理。
隧道
通过Web隧道,我们可以通过HTTP应用程序访问使用费HTTP协议的应用程序。
隧道是建立起来后,就会在两条连接中间对原始数据进行盲转发的HTTP应用程序。Http隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,并且转发时也不会窥探数据。
Web隧道允许用户通过HTTP连接而发送非HTTP流量,这样就可以在HTTP上稍带其他的协议数据了。使用Web隧道最常见的原因就是要在HTTP连接中嵌入非HTTP流量,这样,这类流量就可以穿过只允许Web流量通过的防火墙了。
如在上面这个图中,看到HTTP隧道的常见用途,是通过HTTP连接承载加密的安全套接字流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。在HTTP/SSL隧道中收到了一条HTTP请求,要求建立一条道目的地址和端口的输出连接,然后在HTTP信道上通过隧道传输加密的SSL流量,这样就可以将其忙转发到目的服务器上去了。
简单的说,HTTP隧道技术就是把所有要传送的数据全部封装到HTTP协议里进行传送。
URL与资源
URL,我们已经再熟悉不过了。URL是因特网资源的标准化名称,URL是URI的子集,下面主要介绍:URL语法,URL编码和字符集规则,常见的URL方案,URL的未来-URN。
URL因特网的语法
URL包括三个部分,URL方案,服务器位置,资源路径–schema,host,path。URL可以指定HTTP之外的其他协议来访问,但大多数都有同样的这种结构。
方案://服务器位置/路径
1 | <schema>://<user>:<password>@<host>:<port>/<path>;<param>?<query>#<frag> |
如下所示:
http://www.cailidan.cn/images/1.png
ftp://ftp.lots-o-books.com/pub/1.xls
rtsp://www.joes.com:554/a/vt_video
URL有绝对路径和相对路径之分。这中间有专门的算法来将相对路径转化为绝对路径。
自动扩展URL
我们知道当用户在输入URL的时候,浏览器会自动进行扩展,不需要用户输入完整的URL。扩展主要是有下面两种方式扩展的。
主机名扩展
比如,如果你再地址栏输入cailidan,浏览器会自动在主机名中插入www和.com,构建出www.cailidan.com。显然我使用的是cn.所以这个时候是得不到正确的解析的。找不到时,浏览器会在放弃前尝试集中扩展形式。浏览器通过这些简单的技巧来节省你的时间。但这在代理的时候会出现问题。
历史扩展
还有一种节省用户输入URL时间的方法,就是把用户以前访问过的URL存储起来。这样你输入的时候浏览器会提供一些选择给你。
字符
URL是可以移植的,这意味着,它要统一的命名因特网上所有的资源,这也意味着要通过各种不同的协议来传送这些资源。安全传输意味着URL的传输不能够丢失。有些协议,比如,传输电子邮件的简单
邮件传输协议。所使用的传输方法就会博取一些特定的字符。为了避免这些问题。URL只能使用一些相对比较小的,通用的安全字母表中的字母。并且我们还希望URL可以供人类阅读。因此,即使看不到的,不可打印的字符,从而成为可以移植的。URL还得是完整的。我们需要转移机制,能够把不安全的字符编码为安全字符。再进行传输。
编码机制
为了避开安全字符集表示法的限制,人们设置了一种编码机制,用来在URL中表示各种不安全字符。这种方法就是通过转义表示法来表示不安全字符的。转义表示法包括了一个百分号%,后面是两个表示字符ASCII码的十六进制数。
字符限制
在URL中,有几个字符被保留起来,有着特殊的含义。这些字符不再定义的US-ASCII可打印字符中,这些字符在将其用在保留用途之外的场合时,要在URL中对其进行编码。比如:%,/,.,#,?,$,&,=之类的。
未来展望
URL是可以在各种因特网协议间共享的统一命名机制。但是URL,它表示的是实际地址,而不是准确的名字。URL会告诉你资源在哪个地方。它会为你提供特定端口上特定的服务器的名字,告诉你可以在这个地方找到这个资源。它的缺点是,如果资源被移走了,URL也不再有效了。那个时候,就无法对对象进行定位了。
然后就有人想,如果一个对象有了一个准确的名称,就像人的身份证一样,那么不管这个资源在哪里,我们都可以通过这个名称找到这个对象。这个时候URN出来了。但是这个目前使用的人不是很多额。因为由URL转换成URN是一个很巨大的工程,更何况在URL已经如此普及的情况下。