HTTP你真的懂了吗?

Posted Mairr

tags:

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

最近面试踩了些坑,自己看书看过的内容,即使能记得差不多,回答起来就是很混乱(绝望脸)。比如HTTP的这几个问题,现在整理一下,一个点一个点的说!

 

1.    聊一聊你理解的HTTP

 

1)   Http在OSI七层模型中属于应用层协议

2)   Http请求报文:主要由请求行、请求头、空行、请求正文(get请求没有正文)组成:

  a)   请求行:请求方法(get/head/put/post/trace/delete/options)、URL、协议版本(http1.0/http1.1/http2.0);

  b)   请求头:为请求报文添加附加信息(host/user-Agent/Accept-Charset/Accept-Encoding)

  c)   空行:表示请求头部结束;

  d)   请求正文:可选部分(get请求没有正文);

 

3)   Http响应报文:主要由状态行、响应头、空行、响应正文:

  a)   状态行:协议版本、状态码、状态码描述;

  b)   响应头:附加信息(content-type/content-length);

  c)   空行:响应头结束;

  d)   响应正文

 

4)   Http无状态:对于事务处理是无记忆的不保存客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息会丢失,如果用户发来一个新的请求,服务器无法判断是否与前一次请求的联系;

  a)   优点:服务器不需要为客户端连接分配内存记忆大量状态,也不用在客户端失去连接时清理内存节省服务器资源;

  b)   缺点:缺少状态。在后续处理需要前面的信息,客户端需要重传,导致每次连接传送的数据量增大:

          i.      采用会话跟踪技术解决这个缺点;

         ii.      四种会话跟踪技术:(1)cookie、(2)session、(3)URL重写、(4)作为隐藏域嵌入到html表单中;

 

2.   说说http/1.0、http/1.1?     HTTP/2.0你懂吗?

 

1)   HTTP/1.0和HTTP/1.2区别:

a)   连接方式上:

        i.      HTTP/1.0默认使用短连接;要建立长连接需要在请求消息中包含Connection:keep-Alive的头阈;服务器端接受长连接也会包含一个Connection:keep-Alive的头阈;

       ii.      Http/1.1默认使用长连接,只要客户端/服务器端任意一端没有明确断开TCP连接就一直保持连接;同时,默认采用流水线方式发送请求。

b)   传输数据上,

        i.      HTTP/1.0指定长度机制是content-length字段,静态资源易确定;动态生成的响应,只有等它全部生成之后才能正确地填写content-length值,要求缓存整个响应,服务器端占用大量缓存,延长了响应用户时间;

       ii.      HTTP/1.1用分块传输的方法。消息体分割成组块,每个组块前面加上该组块的长度,末尾发送长度为0的组块,接收方据此判断整条消息都已经传输完毕。避免了服务器端占用大量的内存;

c)   状态码100 continue,HTTP/1.1增加新状态码100 Continue,用于客户端在发送POST数据传给服务器前,征询服务器的情况,看服务器是否处理POST数据;(POST数据大于1024时发起询问)

d)   HOST阈,HTTP1.1在Request消息头里多了一个HOST阈;HTTP/1.0中,认为每台服务器都绑定一个唯一的IP地址,这个IP地址只有一个主机,实际上一台主机可以有多台虚拟机,共享一个IP地址;

 

2)   HTTP/2.0(相比HTTP1.x增加了哪些?)

a)   新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

b)   多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

c)   header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

d)   服务端推送(server push),HTTP2.0具有server push功能。

 

 

3. HTTP浏览器缓存

 

客户端请求过程(这里针对请求-->缓存,不聊DNS /TCP /ARP过程)

1)   客户端请求一个页面page;

2)   服务器端返回页面page,并且给页面page加上一个Last-Modified和Etag标签;

3)   客户端展示页面page,并且将页面page、Last-Modified和Etag的值都缓存起来;

4)   客户端再次请求页面page,并将上次请求时服务器返回的Last-Modified和Etag的值一起传递给服务器;

5)   服务器检查该Last-Modified或者Etag(优先验证Etag)的值,判断该页面自上次客户端请求之后是否改变:

  a)   如果未修改,直接返回响应状态码304和一个空响应体;

  b)   如果已经修改,返回状态码200和新文件;丢弃旧文件,把新文件缓存起来

 

 

补充几个概念:

1. Last-Modified:   记录页面最后被修改时间的HTTP头信息(服务器发到客户端的,针对时间)

2. If-Modified-Since:记录页面最后被修改时间的HTTP头信息(客户端发到服务器端的,针对时间)

3. Etag、if-none-match: 判断资源是否有改变(针对任何属性资源,例如资源的MD5等等)

 

 

 

长连接和短连接的原理,改天补充

 

以上是关于HTTP你真的懂了吗?的主要内容,如果未能解决你的问题,请参考以下文章

golang的slice你真的搞懂了吗

static关键字你真的懂了吗?

数据库的连接池,你真的懂了吗

[转]python3 跨目录模块调用,你真的懂了吗?

flex布局你真的搞懂了吗?通俗简洁,小白勿入~

智能指针循环引用——你真的懂了吗?