HTTP 学习笔记

​ 自己空余的时间,做了一些总结性的笔记。每次阅读都会有不一样的收获。决定做一个笔记,记录下来。

一、认知

1.1 TCP/IP 协议族

​ 常见的协议族成员:TCP、UDP、IP、HTTP、ICMP、DNS、FTP、SNMP等等,互联网依托这些协议关联起来。协议的统称认知为: TCP/IP ,HTTP就是协议族中一员。

1.2 协议族为什么分层

​ TCP/IP,分为四层,也有一种说法OSI七层模型。分层设计因为整个协议族涉及的协议很多,如果没有良好的分层接口设计,则修改一处可能引起多处改动,不利于维护,升级。跟我们应用架构一个道理。

  • 应用层:为开发者,用户,提供API接口及通信应用服务。
  • 传输层:为应用层提供设备之间的数据传输相关控制。
  • 网络层:传输线路的规划选择,传输数据。
  • 数据链路层:处理网络相关的硬件设备

更多细节的原因,需要深入每一层细细研究。

1.3 协议族的数据流

​ 访问 www.ldysjun.com,产生的数据会在整个协议族中流转,HTTP协议发起web页面请求,TCP分割数据传输,IP规划传输路线传输数据,链路层接收。

  • 客户端:应用层->传输层->网络层->数据链路层
  • 数据链路层->网络层->传输层->应用层:服务器

(1)传输前对www.ldysjun.com,使用DNS服务进行解析

  • DNS可以通过域名查找到对应的ip地址

(2)TCP 协议提供可靠传输、对数据的可控

  • 依靠三次握手,使用SYN、ACK标志位确定传输可靠性
  • 通过字节流传输服务,将数据分割传输,做到可控。

(3)IP协议的传输依靠需要ip地址、MAC地址。理论上网络设备出厂后MAC是唯一的。为什么有了MAC地址还需要ip地址呢?

  • 依靠MAC地址在全球所有机器中寻找一个目标机器,很复杂。网络希望路由转发规则越简单越好。
  • 可以依靠IP地址到达目标机器所在的网关,因为局域网内IP地址是不确定的,所以依靠ip地址寻址是不严谨的,所以依靠ARP找到对应的MAC地址。
  • 机器从一个网络移动到另一个网络,只需要当前网络重新分配一个ip地址就可以。

1.4 总结

​ HTTP的使用依靠整个协议族成员的相互配合。各个协议族成员在各层中扮演着不同的角色,目的就是实现全球网络的通信。各个模块相互独立,发挥各自作用,TCP/IP的相关设计有很多值得思考,并且应用在于我们系统的设计。

二、初识HTTP

2.1 URL : 统一资源定位符

​ 有时候会听到URL,有时会听到URI。URL 与 URI 的关系?(相关回答摘要自知乎用户wuxinliulei

  • URL是URI的子集
  • 一个 URI 实例和一个支持语法意义上的、依赖于方案的比较、规范化、解析和相对化计算的结构化字符串差不多。
  • 作为对照,URL 类的实例代表了 URL 的语法组成部分以及访问它描述的资源所需的信息。URL 必须是绝对的,即它必须始终指定一个方案

2.2 URL 结构

​ URL由Scheme(协议)、User(登录信息认证)、Host(服务器地址:端口)、Path(路径)、RawQuery(参数)、Fragment(片段符)组成

(1)例如:

1
http://user:pass@host.com:4366/path/main?k=v#f
Scheme User Host Path RawQuery Fragment
http user:pass host.com:4366 path/main k=v f

2.3 请求

​ 浏览一个页面,在浏览器中输入地址http://lastdays.cn/,会发生什么?简要概括总结下。

​ 发起请求,客户端会生成以下报(我先过滤掉一部分,更详细的后面说明)。

1
2
3
4
5
6
7
GET / HTTP/1.1
Host lastdays.cn
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language zh-CN,zh;q=0.9
Cookie Hm_lvt_cf7f851be66540259af32ff62b1cda71=1538051348;
  • GET表示方法,/表示资源对象,HTTP/1.1表示使用的HTTP版本号。

  • HOST域名

总结起来,请求由,请求方法,请求资源路径,协议版本,还有一些可选字段组成。

2.4 响应

​ 请求发出后,服务端会返回一个响应报文,携带着数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HTTP/1.1 200 OK
Server GitHub.com
Content-Type text/html; charset=utf-8
Last-Modified Fri, 21 Oct 2016 03:26:47 GMT
ETag W/"58098af7-855a"
Access-Control-Allow-Origin *
Expires Wed, 03 Oct 2018 08:05:06 GMT
Cache-Control max-age=600
Content-Encoding gzip
X-GitHub-Request-Id E5E2:1E96:501152A:6775B9F:5BB475D8
Content-Length 9352
Accept-Ranges bytes
Date Wed, 03 Oct 2018 08:17:03 GMT
Via 1.1 varnish
Age 203
X-Served-By cache-hkg17922-HKG
X-Cache HIT
X-Cache-Hits 1
X-Timer S1538554624.545655,VS0,VE0
Vary Accept-Encoding
X-Fastly-Request-ID 3b26b96ac349e4d5ee95bb4e049aed192d28eefe
Proxy-Connection keep-alive

首部信息就是版本信息,状态码,原因短语。下面是包含一些其他信息,例如相应时间,其中Last-Modified经常用在客户端数据缓存更新的策略上。其他想赢内容还有一些静态文件。

总结:响应报文由协议版本,状态码,原因短语,以及其他可选字段构成

2.5 方法

​ 请求头中看到GET方法,除了GET,还有:PUT、DELETE、POST、PUT

method 描述
GET 请求指定的资源文件,如果目标地址是CGI服务,可能需要经过一些处理后返回
POST 传输实体数据,也可以获取资源,但是定位并不是为了获取响应的主题内容
PUT 作为文件传输,可以将文件传输到指定位置。因为安全原因,很多web服务并不支持
DELETE 与PUT对应,删除指定路径的文件,web服务会添加验证机制进行开放
HEAD 跟GET方法一样,但是不返回主体部分,经常用于资源有效期的询问
OPTIONS 询问制定资源支持的方法

如果使用指定资源不支持的方法,会发生什么?

  • 返回405错误信息,最好提供一个说明,例如

    1
    {"message":"Method Not Allowed"}

2.6 keep-alive

​ keep-alive(持久连接),初始版本每进行一次HTTP通信,就要经历一次TCP的断开连接,随着互网联媒体的发展。大量的音频,图片数据在传输中不停地断开连接。造成了一定的性能影响。所以出现了keep-alive(持久连接),一次连接,多次请求响应。

​ 通过管线化的方式实现异步传输,管线化之前需要进行同步传输,管线化后,不需要等待回包,就可以进行下一次请求。

​ Cookie的引入是因为HTTP协议本身是无状态的。在不修改HTTP无状态特性下,又为HTTP增加状态管理的目标出发,引入了Cookie。服务端通过Set-Cookie控制客户端是否保存Cookie

比如一个登入操作

  • 客户端登入,服务端回包,附带Cookie数据
  • 客户端保留Cookie
  • 客户端再次请求,携带Cookie
  • 服务端接收Cookie,校验,判断客户端之前登入过,赋予之前的状态信息

三、报文

3.1 请求报文

HTTP服务间交互的信息称为报文。

  • 客户端:发出请求报文
  • 服务端:回包响应报文

请求报文,响应报文

结构 描述
请求行 版本信息、状态码
首部字段 通用首部、请求首部、响应首部、
其他 Cookie、其他RFC首部

请求报文:

1
2
3
4
5
6
7
8
9
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=4082549DEE5E64678FC46642E185D98C:FG=1; BIDUPSID=4082549DEE5E64678FC46642E185D98C; PSTM=1472215668; MCITY=-%3A; BDSFRCVID=pSFsJeCCxG3C4A5iySIze8tzxQmzvLxREDct3J; H_BDCLCKID_SF=tR38LRu8KJjEe-Kk-PnVeUFLQlbZKxJmMgkeWlbMQnTR85CGXUQVWx4_Qb6gXU-L5nT9bDOFfDL2bKKmjTL3K4LOMq5-5b0X-K5L3JD8bnjoHRjvq4bohjPy5G7eBtQm05bxohOIHRoE8M0m2ROkMtutKJjQW-nQ5HbbhCLbWDF5MIDGj50WenLHMfnXetJQ2C7WsJceHJOoDDvx0Uj5y4LdLp7xJMtJ0RT0XxOYMJKWf-c90tc05xAb04oR5b0eWJQ2QJ8BtCtKhD3P; pgv_pvi=7232093184; pgv_si=s9982430208; BDRCVFR[IzI_eUGSZP3]=mbxnW11j9Dfmh7GuZR8mvqV; BD_CK_SAM=1; PSINO=5; BD_HOME=0; H_PS_PSSID=1421_17946_21125_18559_21455_21419_21394_21378_21191_21398; BD_UPN=123253; BD_LAST_QID=17716714193052416912

响应报文:

1
2
3
4
5
6
7
8
9
10
11
12
$ curl -I www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 03 Nov 2016 08:30:43 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:03 GMT
Connection: Keep-Alive
ETag: "575e1f5b-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes

3.2 编码

HTTP数据传输,可以传输原始数据,也可以使用编码,提升传输效率。注意,编码过程本机需要消耗CPU。编码后的实体由接收端解码。

内容编码 描述
gzip GNU
compress UNIX系统的标准压缩
deflate zlib
identity 不进行编码

3.3 分割传输

大数据分割传输,可以让浏览器逐步显示。称之为,分块传输编码。

  • 分块传输编码:每一块使用十六进制来标记大小,实体最后一块使用“0(CR+LF)”来标记。客户端负责接收解码,组装。

3.4 对象集合

客户端文件上传技术,大多数使用对象集合的方式,利用MIME来描述数据类型,在MIME中使用Multipart容纳多份不同数据类型数据。因此发送的报文可以包含图片,视频等媒体信息。多部分数据类型如下:

类型 描述
multipart/form-data web表单文件上传使用
multipart/byteranges 响应报文,包含多段内容使用

3.5 范围请求

对于客户端而言,断点续传功能是一个很重要的能力。例如,暂停下载 ,回复下载。客户端实习该能力的方式基本流程就是,记录文件总大小,已经接受数据大小,未接受数据大小。通过范围请求,请求固定范围大小的数据。

例如:对于一份20000字节大小的数据,使用范围请求,可以请求,500-10000的数据。

byte范围设置格式:

  • 500-10000数据

    1
    Range:bytes=500-10000
  • 10001之后的所有数据

    1
    Range:bytes=10001-
  • 多重范围

    1
    Range:bytes=500-7000,10001-

范围请求,返回码为206,响应首部Content-Type标记为multipart/byteranges。范围请求失败,返回码为200。

四、状态码

4.1 简介

针对状态码,客户端可以了解请求状态,请求是否发生错误,针对不同的状态,做出相应的处理动作。

code 类别 原因短语
1XX 信息性状态 请求正在处理
2XX 成功 请求处理完成
3XX 重定向 请求需要做附加操作
4XX 客户端错误 服务端无法处理该请求
5XX 服务端错误 服务端

4.2 详细描述

状态码详细介绍

五、Web服务器与HTTP