一、HTTP的实体数据

一.数据类型与编码

在 TCP/IP 协议栈里,传输数据基本上都是“header+body”的格式。但 TCP、UDP 因为是传输层的协议,它们不会关心 body 数据是什么,只要把数据发送到对方就算是完成了任务。

HTTP 协议则不同,它是应用层的协议,数据到达之后工作只能说是完成了一半,还必须要告诉上层应用这是什么数据才行,否则上层应用就会“不知所措”。

1、MIME type

MIME 是一个很大的标准规范,但 HTTP 只“顺手牵羊”取了其中的一部分,用来标记 body 的数据类型,这就是我们平常总能听到的“MIME type”。
HTTP 里经常遇到的几个类别:

  1. text:即文本格式的可读数据,我们最熟悉的应该就是 text/html 了,表示超文本文档,此外还有纯文本text/plain、样式表 text/css 等。
  2. image:即图像文件,有 image/gif、image/jpeg、image/png 等。
  3. audio/video:音频和视频数据,例如 audio/mpeg、video/mp4 等。
  4. application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。常见的有application/json,application/javascript、application/pdf等,另外,如果实在是不知道数据是什么类型,像刚才说的“黑盒”,就会是application/octet-stream,即不透明的二进制数据。

2、Encoding type

HTTP 在传输时为了节约带宽,有时候还会压缩数据,为了不要让浏览器继续“猜”,还需要有一个“Encoding type”,告诉数据是用的什么编码格式,这样对方才能正确解压缩,还原出原始的数据。
Encoding type 常用的只有下面三种:

  1. gzip:GNU zip 压缩格式,也是互联网上最流行的压缩格式;
  2. deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;
  3. br:一种专门为 HTTP 优化的新压缩算法(Brotli)。

二.数据类型使用的头字段

HTTP 协议为此定义了两个 Accept 请求头字段和两个 Content 实体头字段,用于客户端和服务器进行“内容协商”。也就是说,客户端用 Accept 头告诉服务器希望接收什么样的数据,而服务器用 Content 头告诉客户端实际发送了什么样的数据。

1、Accept

Accept 字段标记的是客户端可理解的 MIME type,可以用“,”做分隔符列出多个类型,让服务器有更多的选择余地。

Accept: text/html,application/xml,image/webp,image/png

这就是告诉服务器:“我能够看懂 HTML、XML 的文本,还有 webp 和 png 的图片,请给我这四类格式的数据”。

2、Accept-Encoding

Accept-Encoding 字段标记的是客户端支持的压缩格式,例如上面说的 gzip、deflate 等,同样也可以用“,”列出多个,服务器可以选择其中一种来压缩数据,实际使用的压缩格式放在响应头字段 Content-Encoding 里。

三.语言类型与编码


不过现在的浏览器都支持多种字符集,通常不会发送 Accept-Charset,而服务器也不会发送 Content-Language,因为使用的语言完全可以由字符集推断出来,所以在请求头里一般只会有 Accept-Language 字段,响应头里只会有 Content-Type 字段。

1、语言国际化问题

MIME type 和 Encoding type 解决了计算机理解 body 数据的问题,但互联网遍布全球,不同国家不同地区的人使用了很多不同的语言,虽然都是 text/html,但需要显示不同的语言文字。

2、语言类型使用的头字段

HTTP 协议也使用 Accept 请求头字段和 Content 实体头字段,用于客户端和服务器就语言与编码进行“内容协商”。

1.Accept-Language

Accept-Language 字段标记了客户端可理解的自然语言,也允许用“,”做分隔符列出多个类型,例如:

Accept-Language: zh-CN, zh, en

这个请求头会告诉服务器:“最好给我 zh-CN 的汉语文字,如果没有就用其他的汉语方言,如果还没有就给英文”。

2.Accept-Charset

客户端向服务器发送的请求字符集

3.Content-Language

服务器应该在响应报文里用头字段 Content-Language 告诉客户端实体数据使用的实际语言类型:

Content-Language: zh-CN

4、Content-Type

服务器向客户端发送的响应字符集类型

//浏览器请求 GBK 或 UTF-8 的字符集,然后服务器返回的是 UTF-8 编码,就是下面这样:
Accept-Charset: gbk, utf-8
Content-Type: text/html; charset=utf-8

四.内容协商的结果

内容协商的过程是不透明的,每个 Web 服务器使用的算法都不一样。但有的时候,服务器会在响应头里多加一个 Vary 字段,记录服务器在内容协商时参考的请求头字段,给出一点信息,例如:

Vary: Accept-Encoding,User-Agent,Accept

这个 Vary 字段表示服务器依据了 Accept-Encoding、User-Agent 和 Accept 这三个头字段,然后决定了发回的响应报文。

四.手动测试

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6
Cache-Control: max-age=0
Connection: keep-alive
Cookie: BAIDUID=4BDBC41C4B5A2DFC695B3A2D1D030D75:FG=1; BIDUPSID=4BDBC41C4B5A2DFC695B3A2D1D030D75; PSTM=1620955327; BD_UPN=12314753; __yjs_duid=1_2fd80adbd4702fa6fcbb85c5d18988501620981308254; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDUSS=3NseUp1NWJkYTNiOHBsMVR4ZjdWMDBnNkwtclFVcDhJYlVSRDV4WG9Bfkc0TXBnRVFBQUFBJCQAAAAAAAAAAAEAAADvPm0vydnE6rK7xNzN~LzHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMZTo2DGU6NgY; BDUSS_BFESS=3NseUp1NWJkYTNiOHBsMVR4ZjdWMDBnNkwtclFVcDhJYlVSRDV4WG9Bfkc0TXBnRVFBQUFBJCQAAAAAAAAAAAEAAADvPm0vydnE6rK7xNzN~LzHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMZTo2DGU6NgY; H_PS_PSSID=33984_33819_31254_34004_33675_33607_26350_33892; MCITY=-233%3A; delPer=0; PSINO=7; BD_HOME=1; BAIDU_WISE_UID=wapp_1621413683864_808; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1; COOKIE_SESSION=8660_0_9_0_47_2_1_0_9_1_1_0_0_0_1_0_1621405720_0_1621414379%7C9%2385166_6_1619163364%7C3; ab_sr=1.0.0_NzIwODYwMWU0ZTljOTEwMGQ1Y2ZhNmMxNTYwNmEzZGI1ZGRmZjBjZDJlNDhiMjVhZjc4NmM2N2MxNGVlOWU4ZjgyZmMyZDg4ZjVhYWQzMjBiZTc1YWQzZTY1M2ZmZDFl; H_PS_645EC=e101aPRRpfAc7owjMeC4jyd5t2JTX3jwvTRm5OL844f9GGN2p5ldUFrg8do; sugstore=1; BA_HECTOR=2la5a1a104a18520k61ga9mj60r
Host: www.baidu.com
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1//User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36

二、HTTP传输大文件的方法

一.数据压缩(适用于传输文本文件)

通常浏览器在发送请求时都会带着“Accept-Encoding”头字段,里面是浏览器支持的压缩格式列表,例如 gzip、deflate、br 等,这样服务器就可以从中选择一种压缩算法,放进“Content-Encoding”响应头里,再把原数据压缩后发给浏览器。
不过这个解决方法也有个缺点,gzip 等压缩算法通常只对文本文件有较好的压缩率,而图片、音频视频等多媒体数据本身就已经是高度压缩的,再用 gzip 处理也不会变小(甚至还有可能会增大一点),所以它就失效了。

二.分块传输

如果大文件整体不能变小,那就把它“拆开”,分解成多个小块,把这些小块分批发给浏览器,浏览器收到后再组装复原。
这样浏览器和服务器都不用在内存里保存文件的全部,每次只收发一小部分,网络也不会被大文件长时间占用,内存、带宽等资源也就节省下来了。
这种“化整为零”的思路在 HTTP 协议里就是“chunked”分块传输编码,在响应报文里用头字段“Transfer-Encoding: chunked”来表示,意思是报文里的 body 部分不是一次性发过来的,而是分成了许多的块(chunk)逐个发送。
“Transfer-Encoding: chunked”和“Content-Length”这两个字段是互斥的,也就是说响应报文里这两个字段不能同时出现,一个响应报文的传输要么是长度已知,要么是长度未知(chunked),这一点你一定要记住。

三.范围请求

HTTP 协议为了满足这样的需求,提出了“范围请求”(range requests)的概念,允许客户端在请求头里使用专用字段来表示只获取文件的一部分,相当于是客户端的“化整为零”。
范围请求不是 Web 服务器必备的功能,可以实现也可以不实现,所以服务器必须在响应头里使用字段“Accept-Ranges: bytes”明确告知客户端:“我是支持范围请求的”。
如果不支持的话该怎么办呢?服务器可以发送“Accept-Ranges: none”,或者干脆不发送“Accept-Ranges”字段,这样客户端就认为服务器没有实现范围请求功能,只能老老实实地收发整块文件了。

三、HTTP的连接管理

一.短连接

二.长连接

三.队头阻塞

四.性能优化

四、HTTP的重定向和跳转

透视HTTP协议-03|HTTP协议进阶(一)相关推荐

  1. 透视HTTP协议-01|HTTP协议简介

    目录 透视HTTP协议-01|HTTP协议简介 透视HTTP协议-02|HTTP协议基础 透视HTTP协议-03|HTTP协议进阶(一) 透视HTTP协议-04|HTTP协议进阶(二) 透视HTTP协 ...

  2. 03 HTTP 协议

    目录 HTTP协议 HTTP特点 HTTP工作流程 HTTP协议组成部分 HTTP协议中URI.URL.URN URI URL URN HTTP请求 Request 请求行 HTTP请求方法 请求头部 ...

  3. 网络协议 9 - TCP协议(下):聪明反被聪明误

    网络协议 9 - TCP协议(下):聪明反被聪明误 原文:网络协议 9 - TCP协议(下):聪明反被聪明误 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - ...

  4. 计算机网络 | 数据链路层 :ARP协议、以太网协议、MTU

    数据链路层 数据链路层与网络层的关联 以太网协议 什么是以太网 以太网帧格式 MAC地址 MAC地址与IP地址 MTU MTU对TCP的影响 MTU对UDP的影响 ARP协议 什么是ARP协议 ARP ...

  5. 网络协议 8 - TCP协议(上):性恶就要套路深

    网络协议 8 - TCP协议(上):性恶就要套路深 原文:网络协议 8 - TCP协议(上):性恶就要套路深 系列文章: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络 ...

  6. 网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议

    参考:简单了解HTTP协议与HTTPS协议 作者:丶PURSUING 发布时间: 2021-03-15 10:55:13 网址:https://blog.csdn.net/weixin_4474282 ...

  7. Matter协议特性解析(一) 支持非Matter协议,私有协议,Matter Bridge技术分析

    聚焦:芯产品,芯市场,芯资讯 近期对Matter有做更深入的学习,打算写出来,和大家一起分享: 对Matter协议有兴趣的,欢迎加好友一起交流: 前言 记得17年蓝牙Mesh发布的时候,感觉物联网的春 ...

  8. 交换机与IP数据报、ICMP协议、ARP协议

    文章目录 1 交换机 1.1 基本的架构图 1.2 交换机的工作原理 1.3 交换机以太网接口的工作模式 1.4 交换机使用命令行进行配置管理 2 IP数据报格式 3 ICMP协议 4 ARP协议 4 ...

  9. 西门子s7协议 android,工控协议 | 西门子S7协议学习分享

    原标题:工控协议 | 西门子S7协议学习分享 *本文作者:gongmo,本文属 FreeBuf 原创奖励计划,未经许可禁止转载. 0×1前言 随着网络安全的发展,工控安全也越发的走进信息安全人员的工作 ...

最新文章

  1. django学习笔记--数据库中的多表操作
  2. 功能分支重新设置后,Git推送被拒绝
  3. Spring MVC注解故障追踪记
  4. 创建性设计模式之2--建造者模式
  5. python随机抽取人名_python实现艾宾浩斯背单词功能,实现自动提取单词、邮件发送,再也不用担心背单词啦...
  6. Android自定义控件学习(六)-------使视图互动
  7. ADO数据库常用操作
  8. 休闲娱乐的计算机配置,入门APU主机配置 1199元双核APU家用娱乐电脑配置推荐
  9. 围棋人机大战属于计算机在什么方面的应用,《信息技术基础》第一章复习题库...
  10. 安川机器人如何注释化指令_关于安川机器人I/O注释导入的报告
  11. “脑科学”已成大国“必争之地” 看各国都亮哪些大招 | 2030年中国脑计划将闯入“终极疆域” 脑科学将成为大国必争之地
  12. Oracle 根据汉字返回对应拼音的 函数
  13. 【巴什博弈 抢夺资源】
  14. 几种Java序列化方式的实现
  15. Java面试必备八股文
  16. 如何在多台电脑间同步
  17. VMware创建虚拟机(win10版)
  18. html css实现可下来的自定义表格,变化多端 – 多种纯CSS的HTML表格设计
  19. 液化气罐油罐车储油罐用凉凉胶隔热底漆 防热防雨
  20. 目标检测算法回顾之发展概览

热门文章

  1. [软件项目管理] BCWS、BCWP、ACWP的理解
  2. u深度制作linux启动盘制作工具,u深度u盘启动盘制作工具 v3.1.15.316
  3. Unity3D空战游戏模板 Air Warfare Pro
  4. CEO年薪过亿,谁说了算?
  5. pythonGUI:tkinter 背单词
  6. kylin如何支持flink_Flink 在快手实时多维分析场景的应用
  7. 计算机管理无法打开权限不足,win10 打不开软件管理员权限不够
  8. ARPU与ARPPU 的概念
  9. 中国新出海故事:人、疫情与纽带
  10. VC API常用函数简单例子大全(1-89)