对于后端开发来说,了解Http协议很重要。
一、Http发展史
正式讲HTTP2之前我们先讲一下HTTP的发展史。
HTTP/0.9 - 单行协议
HTTP于1990年问世,那时候HTTP非常简单:只支持GET方法;没有首部;只能获取纯文本。
HTTP/1.0 - 搭建协议的框架
1996年,HTTP正式被作为标准公布,版本为HTTP/1.0。1.0版本增加了首部、状态码、权限、缓存、长连接(默认短连接)等规范,可以说搭建了协议的基本框架。
HTTP/1.1 - 进一步完善
1997年,1.1版本接踵而至。1.1版本的重大改进在于默认长连接;强制客户端提供Host首部;管线化;Cache-Control、ETag等缓存的相关扩展。
二、目前存在的问题
现在我们先不聊HTTP2, 看一下HTTP发展到1.1存在有哪些问题:
1.线头阻塞:TCP连接上只能发送一个请求,前面的请求未完成前,后续的请求都在排队等待。
2.多个TCP连接: 虽然HTTP/1.1管线化可以支持请求并发,但是浏览器很难实现,chrome、firefox等都禁用了管线化。所以1.1版本请求并发依赖于多个TCP连接,建立TCP连接成本很高,还会存在慢启动的问题。
3.头部冗余,采用文本格式: HTTP/1.X版本是采用文本格式,首部未压缩,而且每一个请求都会带上cookie、user-agent等完全相同的首部。
4.客户端需要主动请求。
三、HTTP/2.0的时代来了
理论上HTTP/2.0会比HTTP/1.1有一倍多的性能提升,弱网环境下,性能提升会更加明显。 HTTP/1.1 与2.0 性能比较
Http简介:
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在 http和其他几种网络协议 http和其他几种网络协议 [1] 多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
请求消息
- HTTP Keep-Alive
Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
- Date头域
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
- Pragma头域
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
- Referer头域
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。
-
Range头域
Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。
解释:对内容的截取,用户需要多少内容,服务器截取一部分响应用户端。
-
User-Agent头域
User-Agent头域的内容包含发出请求的用户信息。
get和post的区别
基本的区别
1.get用来获取数据,post用来提交数据
2.get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制。
3.get请求的数据会附加在url之 ,以 " ?"分割url和传输数据,多个参数用 "&"连接,而post请求会把请求的数据放在http请求体中。
4.get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的。
5.get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中。
首先get和post在本质上都是tcp链接,但由于http协议和浏览器或者服务器的限制,从而使它们在应用过程中产生了差别,但较大的区别:get在请求时发送一个数据包,会将header和data一起发送过去,而post会产生两个数据包先发送header,服务器返回100,然后在发送data,服务器返回200
安全方面
这里的安全和通常所理解的安全意义不同,如果一个请求的语义本质上就是获取数据(只读),那么这个请求就是安全的。客户端向服务器发起的请求如果没有引起服务器端任何的状态变化,那么它就是安全的而post请求来提交数据必然会是服务器发生相应的变化。从这个角度看,get请求相对服务器而言,是安全的,post则不安全的。
幂等
幂等通俗的来讲就是指同一个请求执行多次和仅执行一次的效果完全相等。幂等主要是为了处理同一个请求重复发送的情况,假如在请求响应之前失去连接,如果这个请求时幂等的,那么就可以放心的重发一次请求。所以get请求时幂等的,可以重复发送请求,post请求时不幂等的,重复请求可能会发生无法预知的后果。
可缓存性
一个请求是否可以被缓存,绝大多数部分,post都是不可缓存的(某些浏览器可能支持post缓存),但get是可以缓存的。
总结
1.get是请求获取指定资源,get方法时安全、幂等、可缓存的,get方法的报文主体没有任何语义。
2.post是根据报文主体来对指定资源做出处理,post不安全,不幂等,不可缓存(大部分情况下)。