图解http读书笔记
以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化、服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也就找了这本《图解HTTP》来学习一些基础,对于这本书来说,每页都有一些很生动的配图,阅读起来不会像理论书籍那么的枯燥,配图都画的很有意思,值得一看,下面是我的一些读书笔记,也不算是笔记吧,只是摘出了我觉得的重点。
第一章 了解web及网络基础
HTTP的基础知识 超文本传输协议
http诞生→发展,各版本的区别
*网络基础 TCP/IP
TCP/IP协议族,HTTP协议是属于它内部的一个子集
TCP/IP协议族按层次分为:
应用层:FTP、DNS、HTTP等
传输层:TCP、UDP
网络层:IP 用来处理网络上流动的数据包
数据链路层:连接网络的硬件
分层的好处:更前面模块化的意义相同,每个分层之需要处理自己的工作相应该层面的变化,让设计变得更简单;
TCP协议:
将大块数据分割成以报文段为单位的数据包进行管理,使用三次握手的策略确认数据最终是否送达到对方;
三次握手:发送端首先发送一个带有SYN标志的数据包给接收端,接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后发送端再回传一个带ACK标志的数据包,代表握手结束。
域名解析的DNS服务:属于应用层的协议,提供域名到IP地址之间的解析服务;
第二章 简单的HTTP协议
请求报文格式:由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
响应报文格式:由协议版本、状态码、用以解释状态码的原因短语,可选响应首部字段以及实体主体构成。
HTTP是不保持状态的协议(无状态协议):对发送过的请求或响应不做持久化处理。不保留之前一切的请求或响应报文信息;
使用cookie技术可以实现期望的保持状态功能;
HTTP方法:
GET:获取资源
POST:传输实体主体
PUT:传输文件(不带验证机制,存在安全性问题,一般不适用)
HEAD:获得报文首部
DELETE:删除文件和PUT一样存在安全问题
OPTIONS:询问支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议连接代理
持久连接节省通信量: 一个页面需要请求许多的资源,如果每个请求都需要TCP连接建立和端口会产生大量的通信开销;
解决方式:持久连接(HTTP keep-alive):只要任意一端没有明确提出断开连接,则保持TCP连接状态;
好处:减少TCP连接的重复建立和断开所造成的开销,减轻服务器的负载,提高页面显示速度
http1.0所有的连接默认都是持久连接
http1.0所有的连接默认都是持久连接
管线化:类似于多线程,无需等待响应亦可直接发送下一个请求,同时并行发送多个请求;
第三章:HTTP报文内的HTTP信息
报文结构:报文首部 + 空行 + 报文主体
通过编码提升传输速率:
1、压缩传输内容编码:服务端压缩 → 客户端解码(gzip、compress、deflate、identity)
2、分割发送的分块传输编码
3、获取部分内容的范围请求 请求头部 Range: bytes = 5000-10000 指定资源的byte范围
第四章:返回结果的HTTP状态码
类别 | 原因短语 | |
1xx | informational(信息性状态码) | 接收的请求正在处理 |
2xx | success(成功状态码 ) | 请求正常处理完毕 |
200 OK | 请求被正常处理了 | |
204 No Content | 请求已成功处理,但返回的响应报文不含实体的主体部分 | |
206 Partial Content | 客户端使用了范围请求,服务端成功执行了部分GET请求 | |
3xx | redirection(重定向状态码) | 需要进行附加操作以完成请求 |
301 Moved Permanently | 永久重定向,请求的资源已被分配了新的URI,以后应使用新的URI | |
302 Found | 临时重定向,请求的资源已被分配了新的URI,希望(本次)使用新URI访问 | |
303 See Other | 由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源(与302相比,明确应使用GET方法) | |
304 Not Modified | 客户端方式附带条件请求,服务端运行请求访问资源,但因发生请求未满足条件的情况,直接返回304(服务端资源未改变,可使用客户端未过期的缓存) | |
307 Temporary Redirect | 临时重定向,与302相同,307遵照浏览器标准,不会从POST变成GET | |
4xx | client error(客户端错误状态码) | 服务端无法处理请求 |
400 Bad Request | 请求报文中存在语法错误 | |
401 Unauthorized | 发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息,若之前已进行1次请求,则表示用户认证失败 | |
403 Forbidden | 对请求资源的访问被服务器拒绝了 | |
404 Not Found | 服务器上无法找到请求的资源,也可以在服务器端拒绝请求且不说明理由时使用 | |
5xx | server error(服务端错误状态码) | 服务端处理请求出错 |
500 Internal Server Error | 服务器端在执行请求时发生了错误 | |
503 Service Unavailable | 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求 |
第五章:与HTTP协作的web服务器
用单台虚拟主机实现多个域名:虚拟主机可以寄存多个不同主机名和域名的web网站,因此在发送HTTP请求时,必须在Host首部内完整制定主机名或域名的URI。
通信数据转发的应用程序:代理、网关、隧道;
代理:中间人,对请求和响应转发;不改变请求URI,每次转发会追加写入Via首部信息
网关:接受请求,转发通信数据,如果自己拥有资源就能像源服务器一样对请求进行处理。
隧道:建立一条与其他服务器的通信线路,使用SSL等加密手段进行通信。隧道目的是确保客户端与服务端进行安全的通信
资源的缓存:减少对源服务器的访问,节省通信流量和通信时间;
缓存的有效期限
第6章 HTTP报文首部
分为 请求报文 和 相应报文
请求报文:请求行、请求首部字段、通用首部字段、实体首部字段
响应报文:状态行、响应首部字段、通用首部字段、实体首部字段
首部字段的结构: 字段名:字段值
4种http首部字段类型:
通用首部字段、实体首部字段(请求报文和响应报文都会使用的首部)
请求首部字段
响应首部字段
非http/1.1 首部字段:
47种,常用的: Cookie、Set-Cookie和Content-Disposition等
HTTP首部字段 分为两种类型:
端到端首部 End-to-end Header
该类型的首部会转发给请求或响应对应的最终接受目标,且必须保存在由缓存生产的响应中,另外规定他必须被转发;
逐跳首部 Hop-by-hop Header
该类型的首部只对单次转发有效,会因通过缓存或代理而不再转发;HTTP/1.1和之后版本中,如果使用该类型的首部,需要提供Connection首部字段
属于逐跳首部的有: Connection、Keep-Alive 、Proxy-Authenticate、 Proxy-Authorization、Trailer、TE、Transfer-Encoding、 Upgrade
不属于以上首部的,都为端到端首部类型;
通用首部字段:
1、Cache-control:操作缓存的工作机制;
指令参数可选多个,用 , 分割;
public
private
no-cache
no-store
s-maxage
max-age
min-fresh
max-stale
only-if-cached
must-revalidate
proxy-revalidate
no-transform
扩展: 通过cache-extension标记(token),可以扩展Cache-Control首部字段内的指令
2、Connection:用于控制不再转发给代理的首部字段和管理持久连接;
Connection: 不再转发的首部字段名;
Connection:close 断开连接
3、Date:表明创建HTTP报名的日期和时间
多种格式
4、Pragma:HTTP/1.1之前版本的遗留字段,用于向后兼容;
例如:无法保证中间服务器使用的HTTP协议版本,所以在采用Cache-Control:no-cache;时需要加上Pragma:no-cache;来进行兼容处理;
5、Trailer:用于实现说明在报文主体后记录了哪些首部字段,可应用于HTTP/1.1版本分块传输编码时;
6、Transfer-Encoding:规定了传输报文主体时采用的编码方式;HTTP/1.1的传输编码方式仅对分块传输编码有效;
7、Upgrade:用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议;
Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间,so使用首部字段Upgrade时,还需要额外制定Connertion:Upgrade;
8、Via:追踪客户端与服务器直接的请求和响应报文的传输路径。报文经过代理或网关时,就会在Via中附加该服务器的信息,然后再进行转发; 经常会和TRACE方法一起使用;
9、Warning:告知用户一些与缓存相关的问题的警告;
格式: Warning [警告码] [警告的主机:端口号] ”[警告内容]“ ([日期时间])
110
111
112
113
199
214
299