HTTP连接流程:
1.从URL中解析出serv主机名
2.将主机名通过DNS解析为IP
3.解析端口号(如果有)
4.建立一条cli---serv的TCP连接
5.cli向serv发送http请求
6.serv处理请求,返回http响应
7.断开TCP连接,一次HTTP请求响应结束
HTTP请求报文:
(起始行)<方法><请求路径><HTTP版本>
(首部)<各种键值对形式的参数,如ContentType:text/html
Connection:KeepAlive>
(空行)
<主体>
//
HTTP请求报文:
(起始行)<版本><状态><原因短语>(如:http/1.1 200 OK)
(响应头)<还是各种键值对形式的参数>
(空行)
<主体>
常用方法:
GET:从服务器获取一个文档
POST:向服务器发出需要处理的数据
GET和POST区别
PUT:向服务器资源中存储数据
HEAD:告诉服务器只返回响应头(可以用来查看URL是否存在,查看资源类型,测试资源有没有被修改过)
解决问题:如何解决网速等外部因素正常情况下,cli向serv请求数据加载缓慢?
答:使用并行连接解决(一般为4个):HTTP允许cli打开多个TCP连接,去并行执行多个HTTP事务(提高页面加载速度)
并行连接存在的问题:
1.在cli带宽跑满的情况下,并行连接并不会有很明显的提速
2.受限于cli与serv的处理性能,在cpu跑满时,同样不会有很明显的提速
那么我们就想到了能不能让TCP连接持久化,产生了持久连接这个概念
持久连接:在HTTP/1.0(Keep-Alive)HTTP/1.1(persistent-connection)中都有支持
以http/1.0为例,cli如果要保持持久连接,会在请求首部添加connection:Keep-Alive,如果serv可以支持长连接,会在响应头部也返回一个Keep-Alive,但是双方都不保证何时关闭这个长链接。cli一般会请求保持少量的长连接。
持久连接的好处就是可以避免缓慢的TCP建立连接,DNS再次解析域名,,避免慢启动的拥塞适应阶段。
持久连接+并行连接在处理数据量小的数据时,优点极为明显,但是随着数据量增大,持久连接+并行 连接的优势会显得越来越无力。
HTTP/1.1中还支持TCP的管道化连接:将请求放入队列,只保证请求的发送顺序是正确的。这样可以减少网络的等待时间。管道化连接不可以传输非幂等性的请求:
(如商品下单),因为管道化连接需要考虑非正常的TCP连接断开。
web缓存:当web请求抵达缓存时,如本地有已缓存的副本,,就可以直接从本地设备中提取文档。
优点:减少了冗余的数据传输
缓解了网络瓶颈
降低了对原始服务器的要求,服务器的响应会更快
有缓存服务时的处理步骤:
1.接收:接收request
2.解析:对报文解析,提取url和各个首部
3.查询:查看是否有本地副本可用,如果没有,就从原始服务器获取一份,存在本地
4.新鲜度检测:判断过期时间,如果不新鲜,询问服务器是否对资源有更新(若响应为304(Not Modified),则说明资源为进行过更改)
5.创建响应:缓存会用新的首部和已缓存的主体构建报文
6.发送
7.写日志
问题:确保缓存与服务器数据强一致:http/1.1:Cache-Control(max-age = xxx(秒))
再验证:If-Modified-Since:< date >(1.0)自date以后,若url未被修改,则返回304,若修改过,则返回携带新首部的新文档(包括date),
If-None-Match:< Tag>(1.1):对每次修改后的数据添加版本号(类似时间戳),如版本号有变化,则返回新的文档(包括Tag)
如cli强制不使用缓存中的数据,会在请求首部添加no-cache字段,强制让缓存进行新鲜度验证。
以上为《HTTP权威指南》部分观后总结,如有错误请指出,共同进步!!!