美文网首页
图解HTTP总结

图解HTTP总结

作者: real勾玉 | 来源:发表于2016-05-23 23:59 被阅读387次

    主要梳理下简单的HTTP协议的基础知识,供大家参考

    HTTP是什么

    URI vs URL

    uri: uniform resource identifier统一资源标识符
    url: uniform resource locator统一资源定位符,是通过web浏览器访问资源的
    urn: uniform resource name,统一资源命名,是通过名字来标识资源


    Paste_Image.png

    HTTP是无状态的,如何保存状态?

    url带查询参数
    cookie

    HTTP有哪些方法

    GET: 用来请求访问已被URI识别的资源
    POST: 用来传输实体的主体
    PUT: 用来传输文件
    HEAD: 获取报文首部,不返回报文主体部分
    DELETE:删除文件
    OPTIONS: 询问支持的方法

    Paste_Image.png

    TRACE:追踪路径
    CONNECT:要求用隧道协议链接代理

    持久连接 keep-alive

    只要任意一端没有明确提出断开连接,则保持TCP连接状态
    管线化:并发请求

    HTTP报文

    用于HTTP协议交互的信息被称为HTTP报文
    请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行(用CR[Carriage Return,回车符:16进制0x0d]+LF[Line Feed,换行符:16进制0x0a]作换行符)数据构成的字符串文本。

    1,请求报文和响应报文的结构

    Paste_Image.png Paste_Image.png

    ps:一般4种首部:通用首部、请求首部、响应首部和实体首部
    常用的内容编码:
    gzip(GUN zip) compress(UNIX系统的标准压缩)deflate(zlib)identity(不进行编码)
    2,分割发送的分块传输编码
    HTTP/1.1中存在一种称为传输编码(Transfer Coding)的机制,可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。

    发送多种数据的多部分对象集合(multipart)

    MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展),允许邮件处理文本、图片、视频等多个不同类型的数据。
    多部分对象集合包含的对象如下:

    • multipart/form-data
      在Web表单文件上传时使用
    Paste_Image.png
    • multipart/byteranges
      状态码206(Partial Content,部分内容)响应报文包含多个范围的内容时使用。
    Paste_Image.png Paste_Image.png

    HTTP状态码

    Paste_Image.png
    状态码详解
    • 2XX 成功

    200 OK
    204 No Content 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新消息内容的情况下使用
    206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

    • 3XX重定向

    • 301 Moved Permanently 永久性重定向。
      好处:
      1,没有网址规范化问题:当有几个不同的URL指向同一个页面时,告诉搜索引擎哪个URL才是你想要
      2,SEO(搜索引擎优化)中提到一点:如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的PageRank等信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。

    • 302 Found 临时性重定向。
      SPAM(搜索引擎垃圾技术)

    • 303 See Other,表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源。
      PS:
      1)当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送
      2)301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。

    • 304 Not Modified

    • 307 Temporary Redirect 会遵照浏览器标准,不会从POST变成GET。
      个人理解:协议中这么多很多类似的跳转,302现在被大量使用,http1.1出现了303&307,应该是对302的细分出两个新的状态码,出发点是想让303&307替代302,但是现实是很多项目都是使用302。还有一点POST重定向的场景是否很多。

    • 4XX客户端错误:4xx的响应结果表明客户端是发生错误的原因所在

    • 400 Bad Request
      表示请求报文中存在语法错误。

    • 401 Unauthorized 表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息

    • 403 Forbidden 表明对请求资源的访问被服务器拒绝

    • 404 Not Found 表明服务器上无法找到请求资源

    • 5XX服务器错误 表明服务器本身发生错误

    • 500 Internal Server Error 表明服务器端在执行请求时发生了错误

    • 503 Service Unavailable 表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端
      PS:状态码和状况的不一致时,需要前后端把响应情况都要提前自定义好。如果是返回页面,最好做拦截,不要直接返回没有任何样式的响应。比如我们的404页面和500页面

    与http协作的WEB服务器

    代理、缓存代理

    HTTP 首部

    首部字段结构: 首部字段名: 字段值
    PS:HTTP首部字段重复了,这种情况是根据浏览器内部处理逻辑的不同,结果可能并不一致。有的是优先处理第一次出现的首部字段,有的则会优先处理最后出现的首部字段。故要尽量不要重复

    • 4种HTTP首部字段类型
      1)通用首部字段(General Header Fields)
      请求报文和响应报文两方都会使用的首部
      2)请求首部字段(Request Header Fields)
      从客户端向服务器端发送请求报文时使用的首部。
      3)响应首部字段(Response Header Fields)
      从服务器端向客户端返回响应报文时使用的首部
      4)实体首部字段(Entity Header Fields)
      针对请求报文和响应报文的实体部分使用的首部

    HTTP/1.1规范定义了如下47种首部字段
    通用首部字段:请求报文和响应报文双方都会使用的首部

    Paste_Image.png

    请求首部字段

    Paste_Image.png

    响应首部字段

    Paste_Image.png Paste_Image.png

    实体首部字段

    Paste_Image.png

    主要说明下控制缓存的首部字段的区别:
    1,Cache-Control
    Cache-Control: private, max-age=0, no-cache
    缓存请求指令

    Paste_Image.png Paste_Image.png

    缓存响应指令

    Paste_Image.png

    表示是否能缓存的指令:
    1)public:表明其他用户也可利用缓存
    2)private:响应只以特定的用户作为对象
    3)no-cache:为了防止从缓存中返回过期的资源。表示客户端将不会接收缓存过的响应
    4)no-store:暗示请求(和对应的响应)或响应中包含机密信息。该指令规定缓存不能在本地存储请求或响应的任一部分。
    PS:从字面意思看很容易把no-cache误解成为不缓存,但事实上no-cache代表不缓存过期的资源,缓存会想服务器进行有效期确认后处理资源,也许称为do-not-server-from-cache-without-revalidation更合适。no-store才是真正地不进行缓存,注意区别
    5)s-maxage:功能和max-age指令相同,不同点在于,s-maxage指令只适用于供多位用户使用的公共缓存服务器。即,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理
    6)max-age:判定缓存资源的缓存时间数值比制定时间的数值更小,则客户端就接收缓存的资源。如果max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。如果同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略掉Expires首部字段,1.0版本相反。
    2,Pragma是http/1.1之前版本的历史遗留字段,仅作为与http/1.0的向后兼容而定义。
    Cache-Control: no-cache
    Pragma: no-cache
    3,ETag:告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
    强ETag值,不论实体发生多么细微的变化都会改变其值
    弱ETag值,只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变。会在字段最开始处加W/。例:ETag: W/"usagi-1234"
    配合使用首部:
    If-Match
    If-None-Match
    If-Range
    4,If-xxx这种样式的请求首部字段,称为条件请求。
    If-Modified-Since
    If-Unmodified-Since
    If-Range:告知服务器若指定的If-Range字段值(ETag值或时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之,则返回全体资源
    5,Expires:将资源失效的日期告知客户端。
    6,Last-Modified

    相关文章

      网友评论

          本文标题:图解HTTP总结

          本文链接:https://www.haomeiwen.com/subject/gdjerttx.html