zoukankan      html  css  js  c++  java
  • 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等等)

     

     

     

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

     

  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/Mairr/p/8886555.html
Copyright © 2011-2022 走看看