最近逛掘金发现好像蛮少在写一些比较偏僻但是感觉蛮有用的网络小知识,所以打算趁着最近的时间赶紧撸出一个文章,当然有些可能写的不是很好,还望海涵。
HTTP报文状态
- 1XX:信息,服务器收到请求,需要请求者继续执行操作(100,这个是post方法中客户端会先发送请求头,然后等待服务器返回100状态才会发送请求体)
- 2XX:成功操作被成功接收并处理。200状态就是我们常说的成功。
- 3XX:重定向,需要进一步的操作完成请求。简单说就是跳转其他页面的状态。304重定向,简单说就是要去服务器取资源还是缓存那里取资源、302服务器内部的跳转
- 4XX:客户端错误,有语法错误和无法完成请求。如404网页不存在、403服务拒绝请求(一般是没有权限)
- 5XX:服务器错误,服务器在处理请求的过程中发生错误。500服务器发生不可预测的错误、503服务器当前不能处理客户端请求(应用程序池或者程序标识出错了或者程序池队列已经满了)
报文格式
HTTP请求中一般有响应报文、请求报文、常规报文这三种,下面说说报文中常见的字段。
Accept
这个字段储存在请求头中,表示客户端可以接收返回资源的类型,q代表权重,默认是1,如果是0代表是不接收这个类型的资源。一般里面的字段是分号来断开来的。
- Accept-language:浏览器支持的语言
- Accept-Encoding:可以接收的资源编码格式 gzip\deflate\br
Content-type
服务器告诉客户端会返回资源的类型和编码,这个是储存在响应头里面
- Content-language 返回资源的语言类型
- Content-Encoding 返回资源的编码格式gzip 优化传输内容的大小
- Content-length: 内容的长度,在get请求中,请求头是没有这个字段的,post在请求中返回的是fromdata中传输的内容的长度,简单说就是你在数据传输中的内容的长度
Cache-control
在HTTP/1.0是用Pragma这个字段来设置缓存,常见的设置有Pragma:no-cache-xxxx.com指示浏览器忽略资源缓存副本,每次访问需要到服务器获取响应报文。在HTTP/1.1后就用Cache-control来指定缓存相关的。
- No-cacche:指示浏览器忽略缓存副本,强制到服务器获取资源
- no-store 强制缓存在任何情况下不要保留副本
- Max-age= 31536000 指示缓存副本的有效时长,从请求时间开始到过期时间的秒数(HTTP/1.0是用Expire启用缓存和定义缓存的时间)
- Public: 表明响应可以被任何对象缓存
- Private: 表明响应只能被单个用户缓存,不能作为共享缓存 即代理服务器不能缓存它
Referrer
这个字段是记录访客是通过什么途径进入这个网站的,显示的是一个域名,可以防止资源盗链。
- 机制:客户端拉取资源时会判断该请求的referer是否是通过自己域名,如果不是就拦截,否则就允许其拉去资源。
- 设置方法:在meta中的name指定referer 然后再content 中写referer的值加上
- Referrer policy:no-referrer-when-downgrade 仅当协议降级时不发送referrer信息。这个是大部分浏览器的默认设置。比如https的页面进入到http页面的时候
浏览器缓存机制
缓存优点
- 减少网络带宽的消耗
- 降低服务器的压力
- 减少网络延迟
缓存过程
浏览器请求后判断是否有缓存,有点话看缓存时间是否过期,没过期就直接从缓存拿,这时候发现浏览器的状态旁边有个from disk cache显示,如果过期了或者没有设置缓存时间,就发送if-none-match(先判断这个字段和Etag是否一样,然后根据这个找到资源的位置)和if-modified(如果找到资源后就判断资源是否变化)给服务端校验,如果没有修改就返回304给客户端,让客户端去缓存拿资源。
304状态码
客户端第一次去服务器请求资源时,服务器会在响应头返回资源的定位Etag(该资源的唯一标识)和最后一次修改的时间last-modified给客户端,客户端将资源和这两个字段用if-none-match(Etag)和if-modified-since保存,下次再请求服务器的时候,客户端会在请求头以缓存储存的两个字段发送给服务器,服务器校验这两个字段是否和Etag和last-modified相同,相同返回304状态给客户端。
HTTP版本
HTTP/0.9
- 仅支持get请求方式
- 仅允许请求访问html格式的资源
HTTP/1.0
- 增加post和head请求方式
- 支持多种数据格式的请求与访问
- 支持cache缓存功能
- 新增状态码、多字符集支持、内容编码等
- 早期不支持keep-alive长连接 只支持串行连接
- 后期增加connection:keep-alive字段,开始支持长连接
HTTP/1.1
- 增加持久连接
- 增加管道机制
- 增加put/patch/option/delete等请求方式
- 增加host字段
- 增加100状态码,支持只发送头信息
- 增加身份认证机制
- 支持传送内容的一部分和文件断点续传
- 新增24个错误状态码
HTTP/2.0
-
增加双工模式: 客户端同时发送多个请求,服务端同时处理多个请求
-
服务器推送: 服务器会把客户端需要的资源一起推送到客户端,合适加载静态资源 服务器主动推送
-
头信息压缩机制:每次请求都会带上所有信息发送到服务端,HTTP协议不带状态,就是将这些信息压缩发送给客户端
-
二进制协议:头信息与数据体使用二进制进行传输
-
多工:先发送已经处理好的部分,再响应其他请求,最后再解决没有处理好的部分