本章主要讲解请求和响应是如何运作的

一、HTTP 报文

用于 HTTP 协议交互的信息被称为 HTTP 报文,客户端的 HTTP 报文叫做请求报文,服务器端的叫做响应报文

HTTP 报文大致可分为报文首部和报文主体两块,两者通过空行划分(CR + LF),通常并不一定要有报文主体

CR:Carriage Return,回车符,16 进制的 0x0d

LF:Line Feed,换行符,16 进制的 0x0a

下图展示了请求报文和响应报文的结构:

其中:

  • 请求行 包含用于请求的方法,请求 URL 和 HTTP 版本。
  • 状态行 包含表明响应结果的状态码,原因短语和 HTTP 版本。
  • 首部字段 包含表示请求和响应的各种条件和属性的各类首部。一般包括通用首部、请求首部、响应首部和实体首部。
  • 其他 包含一些未在 RFC 中定义的首部(Cookie 等)。

二、通过编码提升传输速率

HTTP 在传输时可以按照原始数据直接传输,也可以预先将数据进行压缩后再传输。编码压缩后可以减少传输的数据量,能够提升传输速率,但是会压缩过程会消耗更多的 CPU 资源。

2.1 报文主体和实体主体的差异

  • 报文(message) 是 HTTP 通信过程中的基本单位,由八位组字节流组成,通过 HTTP 传输。
  • 实体(entity) 作为请求或者响应的有效载荷数据被传输,其内容由实体首部和实体主体构成。

HTTP 报文的主体用于传输实体的主体(请求或者响应的)。

通常情况下,报文主体就是实体主体。但是在进行编码压缩时,实体主体部分会被编码,导致与报文主体不同

2.2 压缩传输的内容编码

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩,压缩之后的内容在客户端被接受之后会进行解码还原。

常用的内容编码有一下几种:

  • gzip(GNU zip)
  • compress(UNIX 系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

现在还有一种新兴的优秀算法——Brotli,但是目前还没有被广泛采用。

2.3 分块传输编码

在传送大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种功能成为分块传输编码(Chunked Transfer Coding)

分块传输会将实体主体分割成多个块(chunk)来传输,每一块都用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

三、发送多种数据的多部分对象集合

邮件附件能够同时传送多种内容的数据,是因为采用了 MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多种类型的数据。相应的,HTTP 也采纳了部分多部分对象集合。

多部分对象集合包含的对象如下:

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

我们通过指定 Content-Type 请求头来使用多部分对象结合。

四、获取部分内容的范围请求

指定范围发送的请求叫做范围请求(Range Request)

对于一份 10000 字节大小的资源,可以通过范围请求一次只请求 5001 ~ 10000 字节的资源。

执行范围请求时,会通过 Range 首部字段来指定资源的 byte 范围,比如:

  • 5000 - 10000 字节:

    Range: bytes=5001-10000
  • 5000 字节之后的所有内容:

    Range: bytes=5000-
  • 从一开始到 3000 字节和 5000 字节到 7000 字节的内容:

    Range: bytes=0-3000,5000-7000

针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。

对于多重范围的范围请求,响应会在首部字段 Content-Type 表明 multipart/byteranges 后返回。

五、内容协商返回最合适的内容

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。

内容协商会以语言、字符集、编码方式等为基准判断响应的资源。

包含在请求报文中的一些首部字段就是服务端响应的判断标准:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

图解 HTTP 笔记(三)—— HTTP 报文内的 HTTP 信息的更多相关文章

  1. (第三章,第四章)http报文内的http信息,返回结果的http状态码

    第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...

  2. 图解HTTP总结(3)——HTTP报文内的HTTP信息

    HTTP通信过程包括从客户端发往服务端的请求及从服务器端返回客户端的响应. 用于HTTP协议交互的信息被称为HTTP报文.客户端的HTTP报文叫做请求报文,服务器端的叫做响应报文.HTTP报文本身是多 ...

  3. 图解http 笔记

    一,了解web以及网络基础 1,使用http协议访问web web页面是由web浏览器根据地址栏中指定的url从web服务器获取文件资源等信息然后显示的页面. 像这种通过发送请求获取服务器资源的web ...

  4. 图解HTTP第三章

    HTTP 报文内的 HTTP信息 用于 HTTP 协议交互的信息被称为 HTTP 报文.HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本. HTTP 报文大致可以分为两类:请 ...

  5. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  6. 构建高性能WEB站点笔记三

    构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...

  7. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  8. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  9. 响应式编程笔记三:一个简单的HTTP服务器

    # 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...

随机推荐

  1. js之head请求,闪电般实现交互

    平时我们用到的请求一般为post和get,今天介绍一种新的请求方式,head请求,顾名思义,head请求就是请求头部信息的,也只能请求头部信息,所以相应速度非常快,可以快速的实现前后端的交互 $.aj ...

  2. mongodb模式模型设计及编码-Mongoose

    走到这一步,我们的网站还不能称为动态的网站,因为所要的数据都是伪造的,所以现在要对数据库的模型进行设计   Mongoose 我们用到的工具模块是Mongoose,他能对Mongodb进行建模的这样一 ...

  3. 快看,那个学SLAM 的崩溃了!

    点"计算机视觉life"关注,置顶更快接收消息! 本文列举了当前优秀SLAM方案,点出了SLAM学习者的困境,最后打算搞点大事 请把此文转发给你认识的SLAM大神,愿你头发浓密,心 ...

  4. Unknown initial character set index '255' received from server. Initial client character 解决方法

    Unknown initial character set index '255' received from server. Initial client character set can be ...

  5. email.py

    import os import argparse import yaml import smtplib import csv from email.mime.multipart import MIM ...

  6. java后台表单字符串长度验证

    1.方法封装前提实体类属性去除首尾空白并进行反转义 //实体类属性的get方法 public String getContent() { if(!"".equals(字符串属性名) ...

  7. 从package.json中获取属性

    var pjson = require('./package.json'); console.log(pjson.version); 详见:https://stackoverflow.com/ques ...

  8. 解决Android SDK更新慢

    SDK Manager -> tools -> options: HTTP Proxy Server: mirrors.neusoft.edu.cn HTTP Proxy Port: 80 ...

  9. Asia-Jakarata 2018

    目录 Contest Info Solutions Problem A. Edit Distance Problem C. Smart Thief Problem D.Icy Land Problem ...

  10. Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】

    当时看到这道题的时候我的脑子可能是这样的: My left brain has nothing right, and my right brain has nothing left. 总之,看到&qu ...