《图解http》的学习

http(超文本传输协议)是 web 客户端与服务器之间资源交互的基础通信规范,web 的所有内容传输都基于 http 协议完成

第一章

1、tcp/ip协议族分层管理

http 是 tcp/ip 协议族的子集,互联网整体基于 tcp/ip 协议族运作,协议采用分层管理设计,实现职责解耦,某一层的改动不会影响其他层,tcp/ip 分为四层:

1)应用层 —— 向用户提供服务的通信活动,http协议、ftp、dns都属于这一层,是http协议所在的一层

2)传输层 —— 提供网络中两台计算机之间的数据传输,核心协议为tcp(传输控制)协议和udp(用户数据报)协议,http基于tcp协议实现可靠的端到端传输

3)网络层 —— 处理网络上流动的数据包,核心是ip,负责为数据包选择传输路径,将数据包准确的送到目的地

4)链路层 —— 处理网络硬件部分,包括网卡、驱动、物理传输媒介等

2、tcp/ip通信传输流

发送端从应用层http向下逐层传输,每经过一层后添加该层的首部信息,完成数据封装

接收端从链路层向上逐层传同步输,每经过一层消去对应的首部信息,完成数据解封装,最终在应用层还原http请求

3、与http关系密切的三大协议
ip协议(网络层)

将数据包准确的送到目标地址

1)ip地址为节点分配的网络地址,用于定位网络中的节点

2)mac地址为网卡所属的固定物理地址,用于局域网内的节点寻址

arp协议机制

1)arp协议(地址解析协议)可通过目标ip地址反查对应的mac地址,实现数据包的链路层转发

路由特性

1)数据包在互联网中通常通过多台网络设备中转,无法掌握全网的传输路径,仅负责下一跳的转发地址

tcp协议(传输层)

为http提供可靠的字节流服务,将大块的数据分割为报文段为单位的数据包进行管理,确保数据完整准确的送达

1)三次握手机制,确保tcp连接可靠建立

​ 客户端发送带SYN(同步)标志的数据包,向服务器发起连接

​ 服务器返回带SYN/ACK(同步/确认)标志的数据包,确认收到客户端请求并回传同步信号

​ 客户端发送带ACK(确认)标志的数据包,告诉服务器连接确认完成,握手结束

* 若三次握手过程中在某一阶段中断了,tcp协议会以相同顺序重新发送数据包以确保可靠性
dns服务(应用层)

提供域名和ip地址的双向解析服务,计算机仅能处理数字形式的ip地址,dns作为桥梁,让http请求可通过域名找到目标服务器的ip地址

url与uri

1)uri(统一资源标识符)—— 仅用来唯一标识一个网络资源,部分uri(如url)可直接访问,部分uri(如urn、相对uri)则无法单独定位资源

2)url(统一资源定位符)—— 包含协议与地址,可用于直接定位并访问资源,所有 URL 都是 URI,但 URI 不一定是 URL(例如https://rhien.cn/photo/123.png是完整的url路径(同时也是绝对url),可直接访问并获取资源,其中photo/123.png为相对uri,相对uri单独使用无法定位资源,需结合基础uri https://rhien.cn/才能使用)

第二章

1、http通信的核心模型

1)通信角色 —— http协议通信的两端必然是一端为客户端,另一端为服务端

2)核心交互规则 —— 请求必然由客户端发起,服务端仅在收到请求后才会回应

2、http请求与相应的报文结构

http通信的基本单位是http报文,分别为请求报文(客户端>服务端)和响应报文(服务端>客户端),整体由报文首行、空行、报文主体三部分组成

1)请求报文结构

GET /index.htm HTTP/1.1  // 请求行
Host: hackr.jp            // 首部字段
User-Agent: Firefox/13.0
Accept: text/html

// 空行(CR+LF)
name=ueno&age=37         // 报文主体(可选)

核心组成部分:

​ 请求行 —— 包含请求方法、请求 uri、http 协议版本

​ 首部字段 —— 分为请求首部、通用首部、实体首部,补充请求的附加信息、客户端属性、资源要求等

​ 空行 —— 固定分隔符,分隔报文首部与主体

​ 内容主体 —— post 等方法传输的主体数据

2)响应报文结构

HTTP/1.1 200 OK  // 状态行
Date: Tue, 10 Jul 2012 06:50:15 GMT  // 首部字段
Content-Length: 362
Content-Type: text/html

// 空行(CR+LF)
<html>...</html>        // 报文主体

核心组成部分:

​ 状态行 —— 包含http协议版本、状态码、原因短语、标识请求的处理结果

​ 首部字段 —— 分为响应首部、通用首部、实体首部、补充响应的附加信息、服务器属性、实体描述等

​ 空行 —— 固定分隔符,分隔报文首部与主体

​ 实体主体 —— 响应返回的内容资源(html、图片、json等)

3、http的无状态(stateless)特性

http协议本身不对请求和响应之间的通信状态保持进行持久化保存,每次请求都是完全独立的,协议不记录之前的请求和响应信息

这种简化协议的设计可以减少服务器cpu内存的资源消耗,可快速处理大量的并发请求,不过缺点就是无法满足需要保持用户状态的场景(如用户登录、购物车、多页面会话),现有的解决方案可采取cookie技术,通过在请求 / 响应报文中传递cookie信息,实现客户端与服务器之间的状态管理

4、http/1.1的核心请求方法

1)GET —— 获取资源(1.0/1.1)

请求 URI 指定的资源,服务器解析后返回资源内容,正常返回 200 OK

2)POST —— 传输实体主体(1.0/1.1)

用于向服务器提交数据,虽 GET 也可传输主体,但规范上 POST 的核心语义是提交实体,而非获取响应主体

3)PUT —— 传输文件(1.0/1.1)

向 URI 指定位置上传文件,本身无验证机制,存在安全风险,普通 Web 网站默认不开放,仅 REST 架构或带强验证的场景使用

4)HEAD —— 获取报文首部(1.0/1.1)

与 GET 逻辑一致,但服务器仅返回响应首部,不返回实体主体,用于确认资源有效性、更新时间等

5)DELETE —— 删除文件(1.0/1.1)

删除 URI 指定的资源,与 PUT 对应,无验证机制,默认不开放,仅特定场景使用

6)OPTIONS —— 询问支持的方法(1.1)

让服务器环回请求报文,确认请求经过的代理 / 中转路径,易引发 XST 跨站追踪攻击,实际很少使用

7)CONNECT —— 隧道协议连接代理(1.1)

要求与代理服务器建立网络隧道,通过 SSL/TLS 加密通信内容,实现加密数据的中转传输

5、持久连接(长连接)与管线化(http性能优化)

http/1.0 默认每次http请求都要经历「tcp 建立→请求→响应→tcp 断开」的完整流程,一个包含多图片的页面会产生大量 tcp 连接重复建立 / 断开,造成额外的网络开销和页面加载延迟

持久连接(长连接)

只要通信任意一端没有明确提出断开连接,就保持tcp连接状态,一次tcp连接可处理多次http请求或响应

http1.1默认开启持久连接,http1.0则需要手动开启(Connection: keep-alive)

启用持久连接后减少tcp连接重复建立/断开的开销,减轻服务器负载,缩短web页面的加载时间

管线化

持久连接(长连接)的升级版,无需等待上一个请求的响应返回,即可并行发送多个http的请求

比普通的持久连接性能更高,请求数量越多,性能提升越明显,初步解决了http请求的队头阻塞问题

cookie的状态管理

cookie是弥补http无状态特性的核心技术,实现客户端与服务端的会话状态管理

核心工作流程

1)服务器在响应报文中通过Set-Cookie首部字段,向客户端下发cookie信息(包含名称、值、有效期、域、路径、安全属性等)

2)客户端浏览器保存cookie,下次向同一服务器发起请求时,自动在请求首部的Cookie字段中携带已保存的cookie值

3)服务器接收请求中的cookie后,对比服务器端的记录,识别客户端身份与历史状态,实现会话管理

关键安全属性

1)domain/path —— 控制cookie的作用域,限制cookie的发送范围

2)secure —— 仅在https安全通信时才会发送cookie

3)HttpOnly —— 禁止JavaScript脚本读取cookie,防止xss跨站脚本攻击窃取cookie