图解 HTTP 笔记(三)—— HTTP 报文内的 HTTP 信息
本章主要讲解请求和响应是如何运作的
一、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 信息的更多相关文章
- (第三章,第四章)http报文内的http信息,返回结果的http状态码
第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...
- 图解HTTP总结(3)——HTTP报文内的HTTP信息
HTTP通信过程包括从客户端发往服务端的请求及从服务器端返回客户端的响应. 用于HTTP协议交互的信息被称为HTTP报文.客户端的HTTP报文叫做请求报文,服务器端的叫做响应报文.HTTP报文本身是多 ...
- 图解http 笔记
一,了解web以及网络基础 1,使用http协议访问web web页面是由web浏览器根据地址栏中指定的url从web服务器获取文件资源等信息然后显示的页面. 像这种通过发送请求获取服务器资源的web ...
- 图解HTTP第三章
HTTP 报文内的 HTTP信息 用于 HTTP 协议交互的信息被称为 HTTP 报文.HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本. HTTP 报文大致可以分为两类:请 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 构建高性能WEB站点笔记三
构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
随机推荐
- 记录一些python内置函数
整理一些内置函数,平时用得比较少,但是时不时遇上,记录一下吧(嘻嘻(●'◡'●)) 1.help() 查看模块or函数的帮助文档 help(pandas) #模块 Help on package pa ...
- 推荐排序---Learning to Rank:从 pointwise 和 pairwise 到 listwise,经典模型与优缺点
转载:https://blog.csdn.net/lipengcn/article/details/80373744 Ranking 是信息检索领域的基本问题,也是搜索引擎背后的重要组成模块. 本文将 ...
- 传说中Python最难理解的点,看这完篇就够了
本文转载自简书,作者为菜鸟,感谢作者的辛苦付出. 这不是我第一次学Python入门课,去年.前年我都学过Python入门.所以文章的标题一点都没有标题党的意思.但是整个入门篇还有一个最难的东西没有讲, ...
- 大数据之路week03--day05(线程 I)
真的,身体这个东西一定要爱护好,难受的时候电脑都不想去碰,尤其是胃和肾... 这两天耽误了太多时间,今天好转了立刻学习,即刻不能耽误!. 话不多说,说正事: 1.多线程(理解) (1)多线程:一个应用 ...
- Selenium(七)多窗口切换、等待方法、alert对话框处理
一.多窗口切换 1.打开百度首页 2.在百度中搜索博客园 3.从搜索结果中跳转到博客园 4.博客园首页和百度搜索页面切换 handle:句柄 二.等待方法 time.sleep(5) 先导入方法 参数 ...
- linux实操_shell运算符
1."$((运算式))"或"[运算式]" 2.expr m + n 注意:expr运算符要有空格 3.expr m - n 4.expr \*,/,/% 乘,除 ...
- Java中程序初始化的顺序
1,在一个类的内部(不考虑它是另一个类的派生类):很多人认为,类的成员变量是在构造方法调用之后再初始化的,先不考虑这种观点的正确性,先看一下下面的代码: class Test01...{ public ...
- SpringMVC利用AOP实现自定义注解记录日志
作者:飞翔的拖鞋up 推荐:彻底征服 Spring AOP 之 实战篇 推荐:jason_zhangz 本文抛砖引玉,并没有详细的介绍更全面的内容,通过一个例子让初次使用的人能够快速入门,简单的介绍一 ...
- java后台表单字符串长度验证
1.方法封装前提实体类属性去除首尾空白并进行反转义 //实体类属性的get方法 public String getContent() { if(!"".equals(字符串属性名) ...
- ServletContextListener和ServletContext
web开发中,每个人都必须要深刻掌握的技能——servlet,学习servlet,就必然要理解ServletContext(javax.servle.ServletContext)接口. 先让我们看下 ...