什么是HTTP协议引自维基百科https://en.wikipedia.org/wiki...超文本传输??协议(HTTP)是一个应用层用于传输分布式、协作、超媒体信息系统的协议。听起来很绕口,换句话说:HTTP协议是一种传输协议,用于将超文本从WWW服务器传输到本地浏览器。HTTP协议发展HTTP协议是万维网联盟(WorldWideWebConsortium)和互联网工作组IETF(InternetEngineeringTaskForce)合作的结果,(他们)最终发布了一系列的RFC,RFC1945定义了HTTP/1.0版本。其中最著名的是RFC2616。RFC2616定义了当今常用的版本——HTTP1.1。HTTP/0.91991年发布的HTTP/0.9,这个版本极其简单,只有一个GET命令,服务器只能响应一个HTML格式的字符串,发送后服务器关闭TCP连接。HTTP/1.01996年5月,发布HTTP/1.0版本,增加如下状态码(statuscode),多字符集支持,多部分发送(multi-parttype),授权(authorization),缓存(cache))、内容编码(content-encoding)、数据格式(Content-Type)介绍POST命令和HEAD命令。HTTP请求和响应的格式也发生了变化。除了数据部分之外,每次通信还必须包含头部信息(HTTPheader),用于描述一些元数据。HTTP/1.1缓存HTTP/1.0Expires是http1.0提出的表示资源过期时间的header。描述了一个绝对时间,由服务器返回,用GMT格式的字符串表示,如:Expires:Thu,31Dec203723:55:55GMT,Pragma:no-cache头域,客户端使用这个header字段表示请求的资源不能从缓存中获取,必须从源中获取。HTTP/1.1Cache-Control描述了一个相对时间。在进行缓存命中时,使用客户端时间进行判断。因此,与Expires相比,Cache-Control的缓存管理更有效,也更安全。注意:这两个header只能开启其中一个,也可以同时开启。当响应头中Expires和Cache-Control同时存在时,Cache-Control的优先级高于Expires:带宽优化Content-RangeHTTP/1.0HTTP/1.0中,会出现一些浪费带宽的现象,例如,客户端只需要对象的一部分,但服务器发送整个对象。例如,客户端只需要显示文档的一部分,或者下载大文件时需要支持断点续传功能,而不是在出现断线后重新下载完整包。HTTP/1.1HTTP/1.1在请求报文中引入了range头字段,只允许请求资源的某一部分。响应消息中的Content-Range头域声明了返回对象的偏移值和长度。如果服务器返回对象请求范围内的内容,则响应码为206(PartialContent),防止Cache将响应误认为是完整的对象。长连接Connection:Keep-AliveHTTP1.0HTTP1.0规定浏览器和服务器只保持短连接。浏览器的每次请求都需要与服务器建立TCP连接。服务器完成请求处理后,立即断开TCP连接。服务器不跟踪每个客户端也不记录过去的请求。另外,由于大多数网页的流量都比较小,TCP连接很少经过慢启动区,不利于提高带宽利用率。HTTP1.1HTTP1.1支持持久连接(PersistentConnection)。多个HTTP请求和响应可以在一个TCP连接上传输,减少了建立和关闭连接的消耗和延迟。管道机制/流水线(Pipelining)处理HTTP1.1也允许客户端发送下一个请求而不用等待上一个请求结果的返回,但是服务器必须按照接收到客户端请求的顺序将响应结果发回给确保客户端客户端能够区分每个请求的响应内容,这也大大减少了整个下载过程所需的时间。Content-Length字段现在一个TCP连接可以传输多个响应,所以必须有一种机制来区分数据包属于哪个响应。这就是Content-length字段的作用,它声明了这个响应的数据长度。Host头字段HTTP1.0在HTTP1.0中,每个服务器都绑定了一个唯一的IP地址,因此请求报文中的URL不传递主机名(hostname)。但是随着虚拟主机技术的发展,一台物理服务器上可以存在多个虚拟主机(Multi-homedWebServers),它们共享一个IP地址。HTTP1.1HTTP1.1请求报文和响应报文都应该支持Host头域,如果请求报文中没有Host头域,就会报错(400BadRequest)。此外,服务器应该接受对标有绝对路径的资源的请求。在HTTP1.1中加入了Host请求头域后,WEB浏览器可以使用主机头名称明确表示要访问服务器上的哪个WEB站点,实现了在一个WEB服务器上使用相同的IP地址和端口号。在Internet上创建多个具有不同主机名的虚拟WEB站点。其他1.1版本也增加了很多动词方法:PUT,PATCH,HEAD,OPTIONS,DELETEHTTP2/.0HTTP/1.1缺点虽然1.1版本允许TCP连接的多路复用,但同一个TCP连接中的所有数据通信都是按顺序进行的。在处理完一个响应之前,服务器不会继续处理下一个响应。如果前面的响应特别慢,后面就会有很多请求在排队等候。这称为“队头阻塞”。为了避免这个问题,只有两个办法:一是减少请求数,二是同时打开更多的持久连接。这导致出现了许多网页优化技巧,例如合并脚本和样式表、在CSS代码中嵌入图像、域分片(domainsharding)等等。如果HTTP协议设计得更好,这些额外的工作是可以避免的。二进制协议HTTP/1.1的头部信息必须是文本(ASCII编码),数据体可以是文本也可以是二进制。HTTP/2是一个完整的二进制协议,头部信息和数据体都是二进制的,统称为“帧”(frame):头部信息帧和数据帧。二进制协议的一个好处是可以定义额外的帧。多路复用HTTP/2多路复用TCP连接。在一次连接中,客户端和浏览器都可以同时发送多个请求或响应,不需要按顺序一一对应,避免了“队头阻塞”。比如在一个TCP连接中,服务端同时收到A请求和B请求,所以先响应A请求,发现处理过程很耗时,就把处理完的部分发送出去A的请求,然后响应B的请求,完成后,发送A请求剩下的。数据流向由于HTTP/2数据包是乱序发送的,同一连接中连续的数据包可能属于不同的响应。因此,数据包必须被标记以表明它属于哪个响应。头信息压缩HTTP协议没有状态,所有的信息都必须附加到每个请求中。因此,请求的很多字段都是重复的,比如Cookie、UserAgent,每次请求都必须附加完全相同的内容,这样会浪费大量带宽,影响速度。HTTP/2通过引入标头压缩对此进行了优化。一方面,头信息在发送前用gzip或compress压缩;另一方面,client和server同时维护一个header信息表,所有的字段都会存储在这个表中生成一个indexnumber,以后不会发送相同的字段,只发送indexnumber发送,提高了速度。服务器推送HTTP/2允许服务器在没有请求的情况下将资源发送给客户端,这称为服务器推送。一个常见的场景是客户端请求一个网页,其中包含很多静态资源。一般情况下,客户端在收到网页后必须解析HTML源代码,找到静态资源,然后发送静态资源请求。实际上,服务端可以预料到客户端请求一个网页后,很可能会再次请求静态资源,所以主动将这些静态资源连同网页一起发送给客户端。HTTP的五大特点1.支持客户端/服务器模式。2.简单快捷:客户端向服务器请求服务时,只需要传递请求方法和路径即可。常用的请求方式有GET、HEAD、POST。每种方法指定一种不同类型的客户端-服务器联系。由于HTTP协议简单,HTTP服务器的程序体积小,所以通信速度很快。3.灵活:HTTP允许传输任何类型的数据对象。正在传输的类型由Content-Type标记。4.无连接:无连接的意思是限制每个连接只能处理一个请求。服务器处理完客户端的请求并收到客户端的响应后,断开连接。这样,可以节省传输时间。早期这样做的原因是要求资源少,追求快。后来通过Connection:Keep-Alive实现了长连接5.Stateless:HTTP协议是一种无状态的协议。无状态意味着协议没有用于事务处理的存储能力。缺少状态意味着如果后续处理需要先前的信息,则必须重传,这会导致每个连接传输的数据量增加。另一方面,当服务器不需要以前的信息时,它的响应速度更快。再来说说statelessHTTP是一种无状态的协议,也就是说每个请求都是独立的。无状态是指协议对事务处理没有记忆能力,服务器不知道客户端处于什么状态。即我们向服务器发送HTTP请求后,服务器会根据请求向我们发送数据,但发送后,不会记录任何信息。但是对于需要状态的页面,比如用户主页需要用户登录信息,下单需要选择的项目等,服务器必须知道浏览器当前的状态。维护HTTP连接状态的两种技术应运而生,一种是Cookie,一种是Session。Cookie是一种通过客户端保持状态的解决方案。它存储在HTTP响应头(ResponseHeader)中。每次请求时,请求头都会携带cookie来保持浏览器状态。浏览器中的“记住密码”功能是基于cookies的。会话由服务器维护。服务端创建一个Session,并为该Session生成一个唯一的Sessionid,这个Sessionid会在后续的请求中用来取回创建的Session;Session创建后,可以调用Session相关的方法给Session添加内容,这些内容只会保存在服务端,只会将Sessionid发送给客户端;客户端再次发送请求时会带上Sessionid,服务端收到请求后会根据Sessionid找到对应的session。会话,以便它可以再次使用。正式这样一个过程,用户的状态会被维护。InsufficientHTTP和HTTPSHTTP通信使用明文(未加密),内容可能被窃听,未验证通信方身份,因此可能遇到伪装,无法证明消息的完整性,因此可能被篡改HTTPSHTTP协议没有加密机制,但是可以与SSL(SecureSocketLayer)或TLS(TransportLayerSecurity)结合使用,对HTTP通信内容进行加密。属于通信加密,即在整个通信线路上进行加密。HTTP+encryption+authentication+integrityprotection=HTTPS(HTTPSecure)SSL/TSLSSL(SecureSocketsLayerSecureSocketsLayer)TLS:(TransportLayerSecurity,传输层安全协议)HTTPS使用共享密钥加密(对称)和公钥加密的混合体使用双方密钥加密的加密机制(非对称)。如果可以安全地交换密钥,则可以考虑仅使用公钥加密进行通信。但是公钥加密比共享密钥加密慢。因此,我们应该充分利用各自的优势,将多种沟通方式结合起来。在密钥交换环节采用公钥加密方式,在后续的通信建立和消息交换阶段采用共享密钥加密方式。HTTPS握手过程简要说明如下:1.浏览器向网站发送其支持的一组加密规则。服务器获取浏览器公钥2,网站从中选择一组加密算法和HASH算法,将自己的身份信息以证书的形式回传给浏览器。证书中包含网址、加密后的公钥、证书的颁发机构等信息。浏览器获取服务器公钥3.获取网站证书后,浏览器会做以下工作:a)验证证书的有效性(颁发证书的机构是否合法,证书中包含的网站地址是否为与被访问的地址一致等),如果证书可信,浏览器栏会显示一个小挂锁,否则会提示证书不可信。b)如果证书是可信的,或者用户接受了不可信的证书,浏览器会生成一串随机密码(后续通信的密钥),并用证书中提供的公钥加密(共享密钥加密)。c)使用约定的HASH计算握手报文,用生成的随机数对报文进行加密,最后将之前生成的所有信息发送给网站。浏览器验证->随机密码,并用服务器公钥加密->生成HASH握手,并用密码加密4、网站收到浏览器发送的数据后,进行如下操作:a)使用自己的私钥解密信息取出密码,用密码解密浏览器发送的握手报文,验证HASH是否与浏览器发送的一致。b)用密码加密握手消息并发送给浏览器。服务器用自己的密钥解密随机密码->用密码解密握手消息(共享密钥通信)->验证HASH是否与浏览器一致(验证浏览器)5.浏览器解密并计算HASH握手报文的,如果与服务器发送的HASH一致。这时候握手过程就结束了,所有的通信数据都会用之前浏览器生成的随机密码,采用对称加密算法进行加密。HTTPS不够用,速度慢且昂贵。对整个页面的请求必须使用HTTPS才能继续。..参考文章1.HTTP协议简介2.浅谈HTTP的无状态3.深入理解HTTP协议4.HTTP请求响应过程与HTTPS的区别会员对HTTP缓存的原理介绍6TCP三向握手(建立连接)和四次挥手(关闭连接)7HTTP/1.1和HTTP/1.0的区别8HTTP头详解9HTTP1.1和HTTP1.0的比较10如何理解HTTP的“无连接、无状态”特性协议?11《图解HTTP》
