学习RFC相关知识以及心得
一、相关知识
1、超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议。它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外,还可以通过扩展它的请求方式,错误代码和报头来完成许多任务。HTTP的一个特点是数据表示方式的典型性和可协商性允许独立于传输数据而建立系统。HTTP在1990年WWW全球信息刚刚起步的时候就得到了应用。本说明书详细阐述了HTTP/1.1协议,是RFC 2068的修订版。HTTP的第一个版本叫做HTTP/0.9,是一种为互联网原始数据传输服务的简单协议。由RFC 1945[6]定义的HTTP/1.0进一步完善了这个协议。它允许消息以类似MIME的格式传送,包括有关数据传输的维护信息和关于请求/应答的句法修正。但是,HTTP/1.0没有充分考虑到分层代理,高速缓存的作用以及对稳定连接和虚拟主机的需求。
2、HTTP协议是一种请求/应答协议。 与主机建立连接后,客户以请求方法,URI和协议版本的形式向服务器发送请求,继以类MIME信息,其中包括请求修改,客户信息和可能的正文内容。HTTP通信在通常发生在TCP/IP连接上。默认端口是TCP 80,不过其它端口也可以使用。
3、HTTP使用"<主要>.<次要>"的编号方案表示协议版本。协议的版本方针是希望允许发送者表示消息的格式和性能以便理解更深一层的HTTP通信,而不仅仅是当前通信获得的特征。
4、统一资源标识符(URI)
(1)URIs的许多名字已为人所知:WWW地址,通用文件标识符,通用资源标识符[3],以及最后统一资源定位器(URL)[4]和统一资源名称(URN)[20]的结合。只要与HTTP相关,统一资源定位器只是格式化的字符串,它通过名称,地址,或任何别的特征确定了资源的位置。
根据使用时的上下文,HTTP里的URI可以表示成绝对形式或基于已知的URI的相对形式。两种形式的区别是根据这样的事实:绝对URI总是以一个摘要名字作为开头,其后是一个冒号。关于URL更详尽的信息请参看"统一资源标识符(URI):一般语法和语义",RFC 2396 [42](代替了RFCs 1738 [4]和RFC 1808 [11]).本说明书采用那份说明书里关于"URI-索引","绝对URI","相对URI","端口","主机","绝对路径"和"权力"的定义.
(2)http方案通过HTTP协议定出网络资源的位置.本节定义了这种方案-http URL特殊的语法和语义.
http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
如果端口为空或未给出,就假定为80.语义即:已识别的资源放在服务器上,在那台主机的那个端口上监听TCP连接,对资源的请求的URI为绝对路径,无论什么可能的时候,URL里使用IP地址都是应该避免的(参看RFC 1900 [24]).如果绝对地址没有出现在URL里,它用作对资源的请求的URI时必须作为"/"给出.如果代理收到一个不是充分资格域名的主机名,一定不能改变主机名.
(3)URI 比较
当比较两个URI是否匹配时,客户应该对整个URI进行区分大小写,以八字节为单元的比较.以下情况例外:
-一个为空或未给定的端口等同于那个URI索引里的默认端口;
-主机名的比较必须是不区分大小写的;
-方案名的比较必须是不区分大小写的;
-一个空绝对路径等同于绝对路径"/".
Characters other than those in the "reserved" and "unsafe" sets are equivalent to their ""%" HEX HEX" encoding.
除了"保留"或"危险"集里的字符(参见RFC 2396 [42]) ,字符等同于它们的""%" HEX HEX"编码.
例如,以下三个URI是等同的:
5、URL与URI的区别
先看看官方的解释:
URL:uniform resource location 统一资源定位符
URI:uniform resource identifier 统一资源标识符
这也就是说,URI是一种资源的标识;而URL也是一种URI,也是一种资源的标识,但它也指明了如何定位Locate到这个资源。URI是一种抽象的资源标识,既可以是绝对的,也可以是相对的。但是URL是一种URI,它指明了定位的信息,必须是绝对的。而我们平时所说的相对地址,仅仅是相对于另一个绝对地址而言。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
(1)URI是个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。URL是URI的一个特例,它包含了定位Web资源的足够信息。
(2)在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。
拜读了其他博主的,发现一个帖子很好的用图表示了其两个的联系,如图所示:
二、读后心得
RFC(Request For Comments)-意即“请求评议”,包含了关于Internet的几乎所有重要的文字资料。通常,当某家机构或团体开发出了一套标准或提出对某种标准的设想,想要征询外界的意见时,就会在Internet上发放一份RFC,对这一问题感兴趣的人可以阅读该RFC并提出自己的意见;绝大部分网络标准的制定都是以RFC的形式开始,经过大量的论证和修改过程,由主要的标准化组织所制定的,但在RFC中所收录的文件并不都是正在使用或为大家所公认的,也有很大一部分只在某个局部领域被使用或并没有被采用,一份RFC具体处于什么状态都在文件中作了明确的标识。
由于实在是英语水平有限,所以再看之前有去参考中文翻译,但可能有一些地方未翻译出原作者的含义,加上再看的同时也并未完全了解,所以在我看到不了解的地方时有重新看英文版,然后百度搜索相关知识点,对于HTTP协议整体上有了更新的认识,比如请求/响应协议、协议的格式定义、缓存控制等。虽然看完2616 和部分的7540,7230还是对其知识点不太熟悉,但还是扩大了更多的知识面。
由于并没有掌握其真正内容,所以阅读了参考书《图解HTTP》,专门阅读了“与HTTP协作的web服务器”这一章。以下是我查阅的相关概念以及我浅显的理解。
一台web服务器可搭建多个独立域名的web网站,也可作为通信路径上的中转服务器提升传输效率。
一个ip可以对应多个域名,一个域名对应一个ip,所以一台web服务器可以搭建多个域名的web网站。
http在刚开始时仅仅是做为HTML文档通信的一种协议,但随着web技术的飞速发展,它也开始展现出自己的不足,如下所示:
1、通信的过程中使用明文,很容易遭到攻击者的入侵。
2、不验证通信方的身份,因此可能遭遇到入侵者的伪装。
3、无法证明报文的完整性,很可能遭到篡改但察觉不出来。
针对以上的一系列问题,我们引进了HTTPS,HTTPS并不是应用层的一种新协议,只是http接口部分用SSL和TLS协议代替而已。
即:HTTPS = http + SSL/TSL 或者 HTTPS = http + 加密 + 认证 + 完整性保护 ;
对报文进行加密,对客户端、服务器进行通信方的确认,对通信途中的报文完整性进行验证,而HTTPS的及时出现解决了这一系列问题,并迅速受到了web的广泛欢迎。
在相同的ip地址下,由于虚拟主机可以寄存多个不同主机和域名的web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。
-
一台Web服务器可搭建多个独立域名的Web网站,也可作为通信路径的中转服务器提升传输效率。
-
用单台虚拟技术及实现多个域名。
-
通信数据转发程序:代理(有转发功能的应用程序)、网关(转发其他服务器通信数据的服务器)、隧道(在相隔甚远的客户端和服务器两者之间进行中转并保持双方通信连接的应用程序)。
-
代理服务器:不改变请求的URI,会直接发送给前方持有资源的目标服务器(源服务器),源服务器返回给代理服务器,代理服务器再传给客户端。每次通过代理服务器转发请求或者响应时会追加写入Via首部信息。代理服务器可以级联多台,Via会标记出经过的主机信息。使用代理的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为只要目的等等。代理有多种使用方法,按两种基准分类,一种是是否使用缓存,另一种是是否会修改报文,对应缓存代理和透明代理。
-
网关:利用管管可以由HTTP请求转化为其他协议通信。工作机制与代理十分相似。利用网关能够提高通信的安全性,因为可以在客户端域网关之间的通信线路上加密以确保连接的安全。比如网关可以连接数据库使用SQL语句查询数据,另外在Web购物网站进行信用卡结算时网关可以和信用卡结算系统联动。
-
隧道:可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信,目的是确保客户端能与服务器进行安全的通信。隧道本身不会去解析HTTP请求,通道本身是透明的。
-
保存资源的缓存:缓存是指代理服务器或客户端本地磁盘保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。缓存服务器的缓存有效期限,失效则从源服务器更新。客户端缓存也有有效期限,失效则更新。