Study-Hard-Http0.9、1.0、1.0+、1.1

来源:互联网 发布:淘宝众筹便宜么 编辑:程序博客网 时间:2024/04/30 22:54

        众所周知吧,在做web开发的时候,不可避免要与Http打交道,但对于Http是什么?这个家伙又是从哪里来的?这个家伙能做什么?怎么做可能不太熟悉?下面就简单的总结下Http。包括:

  • Http的定义是什么
  • Http的常见的属性
  • Http的连接管理以及各版本的演变
  • 小结
  • 参考资料

一、Http的定义是什么?

        Http的E文是HyperText Transfer Protocol,叫做超文本传输协议。根据wiki的描述,设计http最初的目的是为了提供一种发布和接收HTML页面的方法。
        可能现在的我们已经无法理解再现当时的场景了。不过我们可以着眼于现在,Http将各类信息如图片、html页面、文本、多媒体(电影、音频)等搬到了人们的浏览器上。这就是Http协议,我们可以将Http理解为信息的搬运工。

二、Http中的常见属性

2.1 Http的特性

        Http使用的是可靠的数据传输协议,也就是说,它能够确保数据在传输的过程中不会被损坏或者产生混乱。那么符合这点的传输协议就是TCP了。
        简单回顾下网络的四层模型,应用层-》传输层-》网际层-》数据链路层;那么Http是属于应用层的协议、TCP是属于传输层的协议,正因为TCP协议的特点:面向连接、可靠的字节流服务,使得Http具有了上述的特点。

2.2 Web中的Client与Server

        当Client通过http协议发起了一个请求,远端的Server会相应次请求(无论请求的资源是否存在);并将Client的请求信息返回给Client端,也就是我们常说的两个RR,Request-Response。而这样的一次请求,也是一次Tcp连接的建立与释放的过程(会在后文详细讨论)。如下图:


2.3 Http中的报文

        思考下,当我们写的C/S结构的程序,在Client向Server发送数据的时候,Tcp也会将数据切割成一个个合适的segment,而后封装进自己的结构里Tcp Header + Tcp Data Body;那么Http也有自己相应的报文,其格式如下:
  •  起始行:报文的第一行,在请求报文中(request)用来说明要做什么,在响应报文中(response)说明出现了                什么情况
  • 首部字段:起始行后有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间                   用(:)来分割。首部以一个空行结束
  • 主体:空行之后就是可选的报文主体了,包含了所有类型的数据。
        下面看一下使用Chrome浏览器,监听访问http://www.google.com.hk的Request-Response
  
        可以看出,Client端发起了一个Get /的请求 版本号为1.1,下面都是首部字段有Host、Connection的;而Server的Response中 第一行OK 表示成功(是一个简短的说明),并说明了版本号,之后仍是首部字段。而Response的Body则是:

  
        这就是Http的报文结构以及,一次Request-Response的小示例。接下来分析下Http的连接过程。

2.3 Http中的TCPIP、连接、IP地址、端口号

        Http是一个应用层协议,不需要关心网络通信的实现细节,而负责实现细节的是TCP/IP协议;那么紧跟应用层的传输层TCP提供了:
  •  无差错的数据传输
  •  按序传输(在Client端或Server端得到的数据一定是有序的,TCP完成的重组)
       下面考虑连接的建立,简单的说连接的建立需要Ip与端口号,那么Ip与端口号又是如何获得的呢?我们一定不会对下面的几个URL地址陌生:
        http://127.0.0.1:8080(启动Tomcat)
        http://www.sina.com.cn
        分析可知,第一个URL中的IP为127.0.0.1、Port为8080;
                          第二个,IP地址的获取则需要DNS服务器的配合,端口默认为80。
        

三、Http的连接管理以及各版本的衍变

3.1 Http的连接管理

        对于Http的连接管理,涉及到很多概念,这里简单解释两种,其一:并行连接;其二:持久连接。
  • 并行连接:浏览器可以请求完整的HTML页,通过刚才的模拟也可以看到,在加载google的搜索页的时候,会加载很多的资源,如果这些资源都串行的加载,会给人以“很慢”的感觉;所以,Http支持并行的加载,即同时加载很多个资源,这样给用户的体验是,整个页面都在加载,显得很“快”(这是个错觉:)),并行连接会受到带宽的限制,因为如果带宽一定,会出现多个连接争夺带宽的情况

  • 持久连接:用户会经常打开同一个站点的连接。因此,HTTP/1.1(及HTTP/1.0)允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,一遍未来的HTTP请求重用现在的连接,直到客户端或服务器端决定将其关闭为止。
        实现持久连接的常见方式就是keep-alive(在HTTP/1.0开始出现),即在Request Header中添加一个名为Connection:Keep-Alive的首选项,服务器端在应答的时候如果支持,则在首选项中也添加一个名为Connection:Keep-Alive的东东,如果没有,客户端则认为服务器端不支持持久连接。
        持久连接,节省了连接的建立域关闭的开销,所以效率有所增加。
        注意,在HTTP/1.0中,Connection:Keep-Alive默认是不激活的;在HTTP/1.1中,Connection:Keep-Alive默认是激活的。
        同时在HTTP中,如果服务器端不希望保持这种此后就连接,会显示的在响应中包含Connection:close首部,以youku为例:
    
        否则,如果不显示的包含Connection:close首部,那么HTTP/1.1将维持连接的打开状态。因此不发送Connection:close并不意味着服务器会永远将连接保持打开。

3.2 连接的关闭

        正常来说,所有的HTTP客户端、服务器、或代理都可以在任意时刻关闭一条TCP传输连接。但是,服务器端永远无法确定在他关闭“空闲”连接的那一刻,线路的对端有没有数据要发送,如果有,则会发生连接错误。
       
       那么,如何能安全的关闭一条空闲的链路呢,简单的说就是当服务器Response后,客户端准确的接收到了服务器端发送过来的全部数据,这个数据的界定,则是根据Content-Length首部,Content-Length会描述服务器端向客户端发送的信息总量,通过它也就能判断出真实的数据末尾。
       如果客户端收到的Content-Length与实际并不匹配,接收端则应该质疑长度的正确。

3.3 幂等的概念

        在Web的操作中,有一些事务可以反复多次执行,不会造成副作用,如通过GET获取某个HTML静态页;但还有一些诸如购物下单、网银转账等,则不能重复执行,否则会发生危险。
        那么幂等的概念则是:如果一个事务,不管是执行一次还是很多次,得到的结果都相同,这个事务就是幂等的。实际中GET就是幂等的、而POST就不是。
        因此,在重载一个POST请求时,浏览器通过会alter一个对话框,提示是否希望再次发起事务。

3.4 连接的关闭

        通过周期性的检查输入信道的状态(查找数据、流的末尾)。如果在一定时间内对端没有关闭输入信道,应用程序可以强制关闭连接,以节省资源。

3.5 比较Http 0.9、1.0、1.1各个版本

Http/0.9  : 只有GET方法,不支持多媒体内容
Http/1.0  : 为协议添加了版本号、各种HTTP首部、一些额外的方法、对多媒体的处理
                   GET、HEAD、POST
Http/1.0+:    添加诸多特性:keep-alive
Http/1.1  : 完善HTTP设计中的结构性缺陷,明确语义,引入了性能优化
同1.0相比:
  • 缓存处理
  • 带宽优化及网络连接的使用
  • 错误通知的管理
  • 消息在网络中的发送
  • 互联网地址的维护
  • 安全性及完整性

四、小结

        HTTP需要掌握的知识点比较庞杂,但对于深刻理解web机制、性能调优有着不可磨灭的作用,这其中有很多的东西是值得深入学习与借鉴的。本文完成时间较为仓促,主要用于弥补自身的知识缺陷,难免有很大的不足,在后续的日子中会不断完善的。

五、参考资料

Wiki:http://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
Http 1.1:http://www.ietf.org/rfc/rfc2616.txt
Http 1.0:http://www.ietf.org/rfc/rfc1945.txt
Http 0.9:http://www.w3.org/Protocols/HTTP/AsImplemented.html
《Http权威指南》

原创粉丝点击