HTTP 小结

Posted FarmGuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 小结相关的知识,希望对你有一定的参考价值。

1 HTTP1.0/1.1/2.0/3.0 区别

1.0 默认一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接。但浏览器都支持同时多个TCP的连接。Connection: Keep-Alive默认关闭。
1.1 支持持续连接,分为非pipelining和pipelining,非pipelining就是收到前一个响应后才能发出下一个请求,而pipelining则客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次返回响应结果,存在着队头阻塞的情况。Connection: Keep-Alive,默认开启的。
2.0 支持多路复用,复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"(但因为用的TCP协议,TCP使用确认机制,可能出现TCP的队头阻塞)。支持二进制分帧,将请求和响应数据分割为更小的帧。支持服务器推送,允许服务端推送资源给客户端。
3.0 基于UDP,省去了三次握手的消耗。多路复用,彻底解决 TCP 中队头阻塞的问题。

2 Get/Post 区别

1、语义来说,Get是获取数据,即从服务端客户端,Post是提交数据,从客户端到服务端。如果反过来用也是可以的,但这不符合惯例。
2、GET请求参数是通过URL传递的,多个参数以&连接,POST请求放在request body中。
3,Get会被缓存,被历史记录保留,而Post不会。
4,编码方式:GET请求只能进行url编码,而POST支持多种编码方式( application/x-www-form-urlencoded 或 multipart/form-data)。
5,Get的URL长度有限制
6,Get的数据类型只允许ASCII,而POST没有限制。
7,Get是一个TCP包,而Post可能是两个,当首个包返回100时,再提交第二个包。
8,GET的URL长度有限制,POST无限制。
最主要的区别就是1,其他的区别基本上都是浏览器实现的区别。

3 浏览器敲下回车后发生了什么

1、解析URI,区分出host、path、query。
2,检查缓存,如果存在且在有效期直接展示。
3、查询Host文件获取IP,如果查询不到,则由DNS进行解析获取IP地址。
4、根据IP和端口(80/443)进行三次握手,建立TCP连接。
5、发送请求报文,由请求行(GET/POST,path,HTTP/1.1)、首部行(见3常用字段)构成。
6,传输层增加TCP首部,网络层增加IP首部
7,判断是否同一个网络,是则根据MAC地址发送给,否则使用路由表查找下一跳地址,以及使用 ARP 协议查询它的 MAC 地址。
8,接受响应报文,由状态行(HTTP/1.1 200 OK),首部行我(见3常用字段)构成
9,浏览器通过解析html,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。绘制各个节点并展示。
要注意的是,浏览器的解析过程并非是串连进行的,比如在解析CSS的同时,可以继续加载解析HTML,但在解析执行JS脚本时,会停止解析后续HTML,这就会出现阻塞问题。
10,断开链接。

4 HTTP常用字段

request:
host:域名
accept:具体类型如applicaiton/json,text/html
accept-encoding:压缩算法,如gzip
accept-language:语言,如en-US,zh-CN
cache-control:缓存控制
cookie:
user-agent:请求标识
Connection:长链接,如keep-alive

If-Modified-Since:之前response返回的last-modified
If-None-Match:之前response返回的Etag,优先于If-Modified-Since。
//以下仅POST使用
Content-length:文件长度

response:

date:时间
server:
etag:文件校验码
content-type:文件类型,如text/html
content-length:文件长度
content-encoding:压缩算法,如gzip
last-modified:最后修改时间
connection:长链接,如keep-alive
expires:过期时间,是一个绝对时间,如expires: Thu, 10 Nov 2015 08:45:11 GMT,和last-modified配合,这个时间是基于服务器的,在判断有效期时和客户端的时间做比对,当客户端时间不准确时,容易产生误差。
cache-control:max-age=10 缓存时间(单位s),相对时间,优先于expires。

HTTP的缓存策略是,当请求时,判断本地是否有缓存,以及是否在有效期,如果在有效期则直接使用。否则发起请求时,带上If-Modified-Since、If-None-Match,由服务端判断缓存是否过期,当返回304(未修改)则继续使用本地缓存,否则会返回新的数据。

4 ios 中请求缓存

NSURLRequest有个属性cachePolicy,用来配置缓存策略

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)

    NSURLRequestUseProtocolCachePolicy = 0,
    NSURLRequestReloadIgnoringLocalCacheData = 1,
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,
    NSURLRequestReloadRevalidatingCacheData = 5,
;

1,NSURLRequestUseProtocolCachePolicy表示使用HTTP的缓存策略,这也是默认的策略。
2,NSURLRequestReloadIgnoringLocalCacheData表示忽略本地缓存,即直接发起请求,请求头中没有if none match, if modified since参数。
3,NSURLRequestReloadIgnoringLocalAndRemoteCacheData
4,NSURLRequestReturnCacheDataElseLoad,优先使用本地缓存,没有再去发起请求,注意使用本地缓存时,并不会校验时间是否过期。
5,NSURLRequestReturnCacheDataDontLoad,只使用本地缓存,不会校验时间是否过期,当有缓存时,效果和NSURLRequestReturnCacheDataElseLoad一样。
6,NSURLRequestReloadRevalidatingCacheData,
忽略本地缓存,直接发起请求,但请求头会带上中if none match, if modified since参数,由服务端来进行有效性校验。iOS 13之前无效。

当指定使用缓存的策略,且本地有缓存,则不会发起请求,但URLSession的一些代理方法还会执行的。但如didReceiveChallenge之类的就不会执行,最终的statusCode是200。

其他内容

以上是关于HTTP 小结的主要内容,如果未能解决你的问题,请参考以下文章

如何在ArcGIS中队两个生成的插值面进行相减?

七《图解HTTP》- HTTP首部和HTTP协作服务器

图解HTTP第六章:HTTP首部

读《图解HTTP》有感-(HTTP首部)

HTTP协议图--HTTP 报文首部之首部字段(重点分析)

HTTP 报文 之 HTTP 首部