关于HTTP协议全面总结
HTTP的介绍
- HTTP是超文本传输协议的缩写,是用于从www服务器传输出超文本到本地浏览器的传送协议。
- HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。是一个无状态的协议
- 无状态协议:HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
- 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
- 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
- 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
- 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
2. 首部字段:(通用首部,请求首部,响应首部,实体首部,拓展首部)
- 【关于HTTP协议全面总结】【general】:通用首部(请求和响应两个阶段都存在的首部)
包括:
- 请求地址
- 请求方式
- 响应状态
- 服务区IP及端口
- 【Response Header】:响应头信息
- location:http://www.baidu.org/index.jsp
- server:apache tomcat [告诉浏览器我是tomcat]
- Content-Encoding:gzip[告诉浏览器我使用了gzip]
- Content-Lenght:80 [告诉浏览器回送的数据大小]
- Content-Language:zh-cn[支持中文]
- Content-Type:text/html; charset=gb2312[内容格式和编码]
- Last-Modified:Tue,11 Juj,2000 18 18:29:20[告诉浏览器该资源上次更新时间是多少]
- Refresh:1; url=http://www.baidu.com[过多久刷新到哪里去]
- Content-Disposition; attachment; filename=aaa.zip[告诉浏览器有文件下载]
- Transfer-Encoding:chunked[传输编码]
- Set-Cookie:
- Expires:-1[告诉浏览器如何缓存页面]
- cache-Control:[告诉浏览器如何缓存页面(因为浏览器的兼容性最好设置两个)]
- pragma:no-cache
- Connection:close/Keep-Alive
- Date:Tue,11 Jul 2000 18:23:51
- 【Request Header】:请求头信息
- Accept:text/html,image/*(告诉服务器,浏览器可以接受文本,网页图片)
- Accept-Charaset:ISO-8859-1 [接受字符编码:iso-8859-1]
- Accept-Encoding:gzip,compress[可以接受 gzip,compress压缩后数据]
- Accept-Language:zh-cn[浏览器支持的语言]
- Host:localhost:8080[浏览器要找的主机]
- IF-MODIFIED-Since:Tue,11Jul 2000 18:23:51[告诉服务器我这缓存中有这个文件,该文件的时间是...
- Referer:http://localhost:8080/test/abc.html[告诉服务器我来自哪里,常用于防止下载,盗链]
- User-Agent:Nozilla/4.0(Com...)[告诉服务器我的浏览器内核]
- Cookie:
- Connection:close/Keep-Alive [保持链接,发完数据后,我不关闭链接]
- Date:[浏览器发送数据的请求时间]
文章图片
首部.png HTTP的请求方法
- get:传给服务器一些参数来获取服务器上指定资源
- post:将客户端数据发送到一个网管程序
- delete:从服务器删除命名资源
- head:仅发送命名资源的首部
- put:将来自客户端的数据存储在一个服务器资源上去
- trace:对报文进行追踪
- options:决定可以从服务器上执行哪些方法
- post和get的区别
- get有url长度限制(因为参数拼接的问题):chrome:8k ,firefox:7k,ie:2k,所以资源大小限制:get限制大小,post不限制大小
- 安全:get可以看到(因为参数拼接的问题)发送给服务器的数据,post把数据放到主体中,不会被看到
- 缓存:get请求成功后,get可能存在一个缓存纪录,请求的数据很可能是请求的上一次缓存的数据,post不存在缓存情况
ps:get请求url后面加随机数可以解决缓存问题
- 200 请求成功
- 301 永久重定向
- 302 临时重定向
- 303将客户端重定向一个负载不大的服务器上,用于负载均衡
- 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
- 404 无法找到这个资源
- 500服务器错误
- 让浏览器做缓存需要给浏览器发送指定的HTTP头,告诉浏览器缓存多长时间,或者坚决不要缓存。
- Expires(过期时间)
HTTP头信息Expires(过期时间) 属性是HTTP控制缓存的基本手段,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修 改。几乎所有的缓存服务器都支持Expires(过期时间)属性; - Cache-Control(缓存控制)
有用的 Cache-Control响应头信息包括:
max-age=[...秒] 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间 开始到过期时间之间的秒数。 - Last-Modified/If-Modified-Since:
在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变”。
当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。
- Expires(过期时间)
- Expires/Cache-Control Header是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是Cache-Control比Expires可以控制的多一些, 而且Cache-Control会重写Expires的规则。
- Last-Modified/If-Modified-Since是浏览器发送请求到服务器后判断文件是否 已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。
- 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。某个请求任务耗时严重,不会影响到其它连接的正常执行;一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
文章图片
多路复用.jpg
HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。
- header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。
普通的客户端请求过程:
文章图片
普通客户端请求.jpg
服务端推送的过程:
文章图片
服务端推送.jpg
http2.0 请参考 http://www.sohu.com/a/161201715_714863
文章图片
七层协议.png TCP建立连接三次握手
- 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
- 握 手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连 接之前,TCP 连接都将被一直保持下去。
// 第一次握手: 客户端发送SYN码数据包发送给服务器,客户端要求和服务器建立联机;
// 第二次握手:服务端接收联机请求,会发送ACK码到客服端,是要建立联机吗;
// 第三次握手:客服端接收到服务端的ack码,验证是否正确,如果正确,则再次发送ack ,建立连接;
// 三次握手之后,客户端和服务端联机成功,可以发送数据;
// 客户端和服务端发送数据是双向的;客户端给服务端传递的是路径,参数,随机数;服务端给客户端传输自己的资源,文件,数据;
TCP断开连接四次挥手
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
// 1.当客户端发送数据结束,需要发送fin告诉服务端,数据传输结束;
// 2.服务端返回给客户端一个ACK码,知道客户端数据传输完毕;客户端接收到ack,就会把发送到服务端的通道进行关闭;
// 3.服务端数据传输结束之后,也会发送fin给客户端;
// 4.当客户端接收数据完毕之后,会发送给Ack给服务端,服务器可以安心关闭传输数据的通道;
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 画解算法(1.|画解算法:1. 两数之和)
- 醒不来的梦
- 关于自我为中心的一点感想
- ts泛型使用举例
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想
- 关于读书的思考
- https请求被提早撤回