MHLEVELFORONEANDONLY✊
这篇主要是http协议的学习笔记,内容总结自极客时间陶辉。有内容不全的章节会在日后的维护中补齐,欢迎收藏❤️😈
1.ABNF(元语言)(扩充巴科斯-瑙尔范式)操作符
-
空白字符:用来分隔定义中的各个元素
- method SP request-target SP HTTP-version CRLF
-
选择 / :表示多个规则都是可供选择的规则
- Start-line = request-line / status-line
-
值范围 %c##-##:
- OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"与 OCTAL = %x30-37 等价
-
序列组合() : 将规则组合起来,视为单个元素
-
不定量重复 m*n:
-
*元素表示零个或更多元素: *(header-field CRLF)
-
1*元素表示一个或更多元素,2 * 4元素表示两个至四个元素
-
-
可选序列[]:
- [message-body]
2.ABNF(扩充巴科斯-瑙尔范式)核心规则
拓展:详细了解ABNF规则
三、OSI概念模型
-
应用层(应用层解决的是业务问题)
-
表示层(负责将网络中的消息转换成应用层可以读取的消息)
-
会话层(这是完全概念化的一层,帮助理解session这个概念,负责建立连接,握手,会话,关闭。TCP层和表示层都有延伸的会话层)
-
传输层(解决进程与进程之间的通讯,比如说报文到了一个主机上,那么这个报文应该由哪一个进程来处理是由传输层来决定。这一层还有TCP协议,它保证了报文的可达性,流量的控制)
-
网络层(他的作用是在广域网中把报文从一个主机上发送到另一个主机上,广域网就是我们所说的因特网)
-
数据链路层(它是在局域网中,使用mac地址链接到相应的交换机或者路由器就可以把报文转到另一个主机上,它只可以工作在以太网这样的局域网上)
-
物理层(可以理解成网线等等这样的一些设备)
osi概念模型
-
OSI只是概念模型,实际上在因特网中的实现是叫做TCP/IP模型
了解7层模型和5层模型的区别以及他们的优缺点
四、web架构的七大关键属性
HTTP协议应当在以下属性中取得可接受的均衡
-
性能:影响高可用的关键因素
-
网络性能
-
Throughput吞吐量:小于等于带宽
-
Overhead开销:首次开销,每次开销
-
-
用户感知到的性能
-
Latency 延迟:发起请求到接收到响应的时间
-
Completion 完成时间:完成一个应用动作所花费的时间
-
-
网络效率
- 重用缓存,较少交互次数,数据传输距离更近,COD
-
-
可伸缩性:支持部署可以互相交互的大量组件
-
简单性:易理解,易实现,易验证
-
可见性:对两个组件的交互进行监控或者仲裁的能力,如缓存,分层设计等
-
可移植性:在不同环境下运行的能力
-
可靠性:出现部分故障时,对整体的影响程度
-
可修改性:对系统作出修改的难易程度,由可进化性,可定制性,可扩展性,可配置性,可重用性构成
五、五种分布式web架构风格(探讨REST架构是怎样从这五类架构风格的具体架构中推演出来的)(REST架构是HTTP协议设计所遵循的架构)
-
数据流风格 Data-flow(例如协议的分层)
-
管道与过滤器Pipe And Filter , PF
-
统一接口的管道与过滤器 , UPF
-
-
复制风格 Replication
-
复制仓库 Replicated Repository , RR(例如:MySQL的冷热备份)
- 多个进程提供相同的服务,通过反向代理对外提供集中服务
-
缓存 $
- RR的变体,通过复制请求的结果,为后续请求复用
-
-
分层风格Hierarchical
-
客户端服务器 , CS
-
分层系统 , LS
-
分层客户端服务器 , LCS
-
无状态,客户端服务器 , CSS
-
缓存,无状态,客户端服务器 , C$SS
-
分层,缓存,无状态,客户端服务器 LC$SS
-
等等...
-
-
移动代码风格 Mobile Code
-
虚拟机
-
远程求值
-
按需代码
-
移动代理
-
-
点对点风格 Peer-to-Peer
六、http中的请求行
-
格式
-
常见方法(RFC7231)
-
GET:主要的获取信息的方法,大量的性能优化都是正对该方法,幂等方法(调用一次和调用多次获得的结果是完全一致的,幂等方法对于分布式系统中的事务设计是非常有意义的)
-
HEAD:类似GET方法,但服务器不发送BODY,用以获取HEAD元数据,幂等方法
-
POST:常用语提交HTML FORM表单,新增资源等
-
PUT:更新资源,带条件时是幂等方法
-
DELETE:删除资源,幂等方法
-
CONNECT:建立tunnel隧道
-
OPTIONS:显示服务器对访问资源支持的方法,幂等方法
-
TRACE:回显服务器收到的请求,用于定位问题,有安全风险
-
-
用于文档管理的WEBDAV方法
-
PROPFIND:从web资源中检索以XML格式存储的属性,它也被重载,以允许一个检索远程系统的集合构建(也叫目录层次结构)
-
PROPPATCH:在单个原子性动作中更改和删除资源的多个属性
-
MKCOL:创建集合和目录
-
COPY:将资源从一个URI复制到另一个URI
-
MOVE:将资源从一个URI移动到另一个URI
-
LOCK:锁定一个资源,WebDAV支持共享锁和互斥锁
-
UNLOCK:解除资源的锁定
-
七、http响应码
-
响应码分类:1XX
请求已接收到,需要进一步处理才能完成,HTTP1.0不支持
-
100 Continue:上传大文件前使用
- 由客户端发起请求中携带Expect: 100-Continue 头部触发
-
101 Switch Protocols: 协议升级使用
- 有客户端发起请求中携带Upgrade:头部触发,如升级websocket或者http/2.0
-
102 Processing: WebDAV 请求中可能包含许多设计文件操作的子请求,需要很长时间才能完成请求,该代码表示服务器已经收到并正在处理请求,但无响应可用。这样可以防止客户端超时,并假设请求丢失。
- 响应码分类:2XX
成功处理请求
-
200 OK:成功返回响应
-
201 Created:有新资源在服务器端被成功创建
-
202 Aceept:服务器接受并开始处理请求,但请求未处理完成这样一个模糊的概念是有意如此设计,可以覆盖更多的场景,例如异步,需要长时间处理的任务
-
203 Non-Authoritative Information:当代服务器修改了origin server的原始响应包体时(例如更换了HTML中元素的值),代理服务器可以通过修改200为203的方式告知客户端这一事实,方便客户端为这一行为作出相应的处理,203响应可以被缓存
-
204 No Content:成功执行了请求且不携带响应包体,同时指明客户端不需要更新当前的页面的视图
-
205 Reset Content:成功执行了请求且不携带响应的包体,同志指明了客户端需要更新当前页面的视图
-
206 Partial Content:使用range协议时返回部分响应内容时的响应码
-
207 Multi-Status:RFC4918,在WEBDAV协议中以XML返回多个资源的状态
-
208 Already Reported: RFC5842,为避免相同集合下资源在207响应码下重复上报,使用208可以使用父集合的响应码
- 响应码分类:3XX
重定向使用Location指向的资源或者缓存中的资源。在RFC2068中规定客户端重定向的次数不应该超过5次,以防止出现死循环
-
300 Multiple Choices: 资源有多种表述,通过300返回给客户端后其自行选择访问哪一种表述。由于缺乏明确的细节,300很少使用
-
301 Moved Permanently: 资源永久性的重定向到另一个URI中
-
302 Found: 资源临时重定向到另一个URI中
-
303 See Other: 重定向到其他资源,常用于POST/PUT等方法的响应中
-
304 Not Modified: 当客户端拥有可能过期的 缓存是,会携带缓存的标识etag,时间等信息询问服务器缓存是否仍可复用,而304是告诉客户端可以复用缓存
-
307 Temporary Redirect: 类似302,明确重定向请求方法,必须与原请求方法相同,不得改变
-
308 Permanent Redirect:类似301,但明确重定向后请求方法必须与原请求方法相同,不得改变
- 响应码分类4XX
客户端出现错误
-
400 Bad Request:服务器认为客户端出现了错误,但不能明确判断为以下哪种错误时使用次错误码,例如HTTP请求格式错误
-
401 Unauthorized:用户认证信息缺失或者不正确,导致服务器无法正确处理请求
-
407 Proxy Authentication Required:对需要经由代理的请求,认证信息未通过代理服务器的验证
-
403 Forbidden: 服务器理解请求的含义,但是没有权限执行次请求
-
404 Not found: 服务器没有找到对应的资源
-
410 Gone:服务器没有找到对应的资源,且明确的知道该位置永久找不到该资源
-
405 Method Not Allowed: 服务器不支持请求行中method方法
-
406 Not Acceptable: 对客户端指定的资源表述不存在(例如语言或者编码有要求),服务器返回表述列表供客户端选择
-
408 Request Timeout: 服务器接受请求超时
-
409 Conflict: 资源冲突,例如上传文件时目标位置已经存在版本更新的资源
-
411 Length Required: 如果请求含有包体且未携带Content-Length头部,且不属于chunk类请求时,返回411
-
412 Precondition Failed:复用缓存时传递的if-Unmodified-Since或if-None-Metch头部不满足
-
413 Payload Too Large/Request Entity Too Large:请求的包体超出服务器能处理的最大长度
-
414 URI Too Long: 请求的URI超出服务器能接收的最大长度
-
415 Unsupported Media Type: 上传的文件类型不被服务器支持
-
416 Range Not Satisfiable:无法提供Range请求中指定的那段包体
-
417 Expectation Failed:对于Expect请求头部期待的情况无法满足时的响应码
-
421 Misdirected Requst: 服务器认为这个请求不该发给他,因为他没有能力处理
-
426 Upgrade Required:服务器拒绝基于当前HTTP协议提供服务,通过Upgrade头部告知客户端升级协议才能继续处理
-
428 Percondition Required:用户请求中缺失条件类头部,例如if-Match
-
429 Too Many Request: 客户端发送请求速率过快
-
431 Requesu Header Fields Too Large: 请求的HEADER头部大小超过限制
-
451 Unavailable For Legal Reasons:由于法律原因资源不可访问
- 响应码分类5XX
服务器端出现错误
-
500 Internal Server Error:服务器内部错误,且不属于以下错误的类型
-
501 Not Imolemented: 服务器不支持实现请求所需要的功能
-
502 Bad Gateway: 代理服务器无法获取到合法响应
-
503 Service Unavailable: 服务器资源尚未准备好处理当前请求
-
504 Gateway Timeout: 代理服务器无法及时的从上游获得响应
-
505 HTTP Version Not Support:请求使用的HTTP协议版本不支持
-
507 Insufficient Storage: 服务器没有足够的空间处理请求
-
508 Loop Detected: 访问资源时检测到循环
-
511 Network Authentication Required: 代理服务器发现客户端需要进行身份验证才能获得网络访问权限
-
八、HTTP连接的常见流程
在浏览器中输入域名之后会发生什么
-
浏览器解析出主机名
-
浏览器查询这个主机名的IP地址(dns)
-
浏览器获取到端口号(80)
-
浏览器发起对在步骤2中获得的ip地址中对应的在步骤3中获得的对应端口号的连接
-
浏览器想服务器发送一条HTTP GET报文
-
浏览器从服务器中读取HTTP响应报文
-
浏览器关闭连接
九、短连接与长连接
HTTP链接的常见流程-
Connection头部
-
Keep-Alive:长链接(HTTP/1.1默认支持长链接)
-
Close: 端链接
-
十、请求与响应的上下文
-
请求和响应中常见的上下文头部
-
内容协商:
- 在HTTP协议中,内容协商是这样一种机制,通过为同一URI指向的资源提供不同的展现形式,可以使用hu y
-
内容协商与资源表述中常见的协商要素
-
质量因子:内容的质量,可接受类型的优先级
-
媒体资源的MIME类型及质量因子
-
十一、HTTP包体:承载的消息内容
-
两种传输HTTP包体的方式
-
发送HTTP消息时已能够确定包体的全部长度
-
优点:接收端处理更简单
-
-
发送HTTP消息时不能确定包体的全部长度
-
使用Trancefer-Encoding头部指明使用Chunk传输方式
- 含有Trancefer-Encoding头部后 Content-Length头部应被忽略
-
-
优点
-
基于长连接持续推送动态内容
-
压缩体积较大的包体时,不必完全压缩完(计算出头部)再发送,可以边发送边压缩
-
传递必须在包体传输完才能计算出的Trailer头部
-
十二、断点续传和多线程下载是如何做到的
- Range规范
十三、Cookie的格式和约束
-
Cookie是保存在客户端,由服务器生成,浏览器维护,表示应用状态的HTTP头部
-
存放在内存或者磁盘中
-
服务器生成Cookie在响应中通过Set-Cookie头部告知客户端(允许多个Set-Cookie头部传递多个值)
-
客户端得到Cookie后,后续请求都会自动将Cookie头部携带至请求中
-
-
Cookie与Set-Cookie头部的定义
-
Cookie头部可以存放多个name/value名值对
-
Set-Cookie头部一次只能传递一个name/value名值对,响应中可以含多个头部
-
-
Cookie使用的限制
-
RFC规范对浏览器使用Cookie的要求
-
每条Cookie的长度(包括name,value以及描述的属性等总长度)至少要达到4kb
-
每个域名下至少支持50个Cookie
-
至少要支持3000个Cookie
-
-
代理服务器传递Cookie时会有限制
-
十四、浏览器的通源策略(这是一种阻止跨域访问)(另外可以了解ajax跨域请求,及其二者的区别)
-
为什么使用浏览器的通源策略?
- 同一个浏览器发出的请求未必都是用户自愿发出的请求
-
没有同源策略下的Cookie只能保证用户请求来自统一浏览器,不能确保是用户自愿发出的
- 站点b的脚本可以随意修改站点a的DOM结构
-
同源策略需要在可用性和安全性上寻找一个平衡点
-
跨站请求伪造攻击
十五、通过CORS实现跨域访问
-
浏览器通源策略下的跨域访问解决方案(这种方案能够保证安全性)
-
如果站点A允许站点B的脚本访问其资源,必须在HTTP响应中显示的告知浏览器:站点B是允许的
-
访问站点A的请求,浏览器应告知该请求来自站点B
-
站点A的响应中,应明确哪些跨域请求是被允许的
-
-
-
策略1:何为简单请求
-
策略2:简单请求以外的其他请求
-
简单请求的跨域访问
-
请求中携带Origin头部告知来自那个域
-
响应中携带Access-Control-Allow-Origin头部表示允许哪些域
-
浏览器放行
-
-
复杂请求的跨域访问
-
预检请求
-
预检请求头部
-
Access-Control-Request-Method
-
Access-Control-Request-Headers
-
-
预检请求响应
-
-
十六、条件请求的作用
-
强验证器与弱验证器的概念
-
更新丢失的问题:乐观锁
-
更新丢失的问题:乐观锁解决首次上传
十七、缓存的工作原理
-
HTTP缓存:为当前请求复用前请求的响应
-
目标:减少时延;降低带宽消耗
-
可选而又必要
-
-
过期的共享缓存--代理服务器
十八、缓存新鲜度的四种计算方式
网友评论