《图解HTTP》学习笔记

文档

1、HTTP1.1九种请求方法

GET:请求指定的资源,服务端响应发回资源
POST:传输实体的主体,比如一些json格式的信息。和GET不一样就是,POST不是为了获取响应报文的主体内容
HEAD:获得报文首部,服务端不返回报文主体部分,用于确认URL有效性和资源更新时间
OPTIONS:询问支持的方法。项目时出现过,跨域时的复杂请求(除了简单请求外都是复杂请求。简单请求:1GET/POST/PUT,2首部字段只有几种允许的字段),浏览器就会用OPTIONS预检测请求,后端解决就判断如果是OPTIONS方法,就返回200状态码
PUT:传输文件,保存到URI指定位置
DELETE:删除指定资源
TRACE:追踪路径,首部加一个字段设置步数,每经过一个服务器就-1
CONNECT:要求和代理服务器通信时建立隧道,会使用到SSL和TLS(SSL和TLS差不多)

  • 等幂性:多次连续、重复的请求和只发一次请求得到的一样的结果
  • 不等幂性:多次连续、重复的请求和只发一次请求可能会影响服务器的资源,比如POST
    • 解决方法:重定向;进入该页面时服务器为客户端提供一个标志,并缓存起来,客户端每次在该页面POST请求时都带上此标志,服务器检查是否重复

2、报文格式

报文首部+空行(CR+LF)+报文主体
请求报文首部:请求行(协议版本,请求URI(就是参数),请求方法)+其他首部字段(connection,cookie,host)PS:可以没有报文主体
响应报文首部:状态行(协议版本,状态码,原因短语)+…(connection,set-cookie)

报文+实体:报文首部里有实体首部,实体是实际想要传输的信息,实体首部描述这些信息。实体组织成报文进行发送,实体主体包含在报文主体。通常实体主体等于报文主体,除非进行内容编码

重复首部字段,取第一个还是第二个取决于浏览器

首部字段

通用首部字段:请求报文和响应报文都会使用的

  • Connection:管理持久连接,控制不再转发给代理的首部字段
    • 值keep-alive:客户端发起,http1.1默认;服务器响应值Keep-Alive+字段Keep-alive(设置时间)
    • 值close:服务器发起,关闭连接
    • 值(不再转发的首部字段名):控制不再转发给代理的首部字段
  • Date:报文创建时间
  • Upgrade:换协议,需额外指定Connection:Upgrade;服务器返回101SwitchProtocols

请求首部字段:发送请求报文使用

  • Accept:通知服务器用户可处理的媒体类型及相对优先级
    • 值:文本text/html,图片image/gif,视频等,用逗号隔开
    • 优先级:0~1,1最大,默认1,用分号隔开
    • 格式:text/html;0.1,image/gif。后者比前者优先级高
  • Accept-Encoding/Language:接受的语言、内容编码等
    • 语言:zh、en
    • 内容编码:gzip
  • Host(唯一一个必须使用的请求首部):指定主机名
    • 使用情况:1个IP对应多个域名,请求到达服务器无法处理,需Host指定主机名;若服务器未设定多主机名,Host为空
  • Range:范围请求,206状态码响应并发送指定资源,Content-Range字段会显式响应实体范围,或200状态码响应并发送全部资源。(断点续传实现)
    • 值:例如,bytes=5001-10000
  • If-Range:和服务器文件的ETAG值(标识)比较,判断是否更新,搭配Range使用,一致则响应206和指定资源,不一致则响应200和ETAG字段。(断点续传时也可以使用If-Modified-Since判断文件是否更改)
  • User-agent:浏览器种类
  • If-Modified-Since:判断资源是否需要更新,值为时间。服务端可能响应304表示不需要更新或者200+字段Last-Modified表示可以更新
  • Authorization:认证信息,通常在接收到401后使用

响应首部字段:发送响应报文使用

  • Location:和3xx重定向配合使用,值为URI

实体首部字段:实体有关的信息

  • Allow:通知客户端支持的HTTP方法
  • Content-Encoding:选用的内容编码方式
  • Content-Language:选用的语言
  • Content-Length:实体主体部分的大小(字节),内容不为空时要使用,内容编码时为压缩后大小,chunked分块编码不需要
  • Content-Type:选用的媒体类型
  • Last-Modified:指明资源最终修改时间

其他

  • Cookie:客户端使用
  • Set-cookie:服务端使用
    • 值:HttpOnly,JS不能读取

3、状态码

1xx:信息性状态码,原因短语:接受的请求正在处理
2xx:成功状态码,原因短语:请求正常处理完毕
3xx:重定向状态码,原因短语:需要进行附加操作来完成请求
4xx:客户端错误状态码,原因短语:服务器无法处理请求
5xx:服务器错误状态吗,原因短语:服务器处理请求出错

100 Continue :请求者应当继续提出请求。 服务器返回此状态码表示已收到请求的第一部分,正在等待其余部分
101 Switching Protocols:在项目中遇到过,使用长连接webSocket时,前端发送使用长连接的请求,服务器会将HTTP升级为websocket后就响应这个状态码
200 OK:从客户端发来的请求在服务端被正确处理了
204 No Content:请求处理成功,但没有任何资源可以返回给客户端。使用场景:浏览器总是刷新看看有没有新信息
206 Partial Contene:表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求
301 Moved Permanently:永久重定向,表示请求的资源已被分配了新的URL,以后应该使用新的URL,不应该改变请求方法
302 Found:临时重定向,表示请求的资源以被分配了新的URL,这次要使用新的URL访问,不应该改变请求方法
303 See Other:同302,但应使用GET方法来请求
304 Not Modified:客户端执行了带条件的GET请求(比如客户端的缓存文件带有Last-Modified,请求中就会带上If-Modified-Since),如果没有资源更改就响应这个状态码
307 Temporary Redirect:同302
PS:303和307是因为浏览器使用302时不一定会遵守标准,所以HTTP1.1把将302细分成303和307两种情况
400 Bad Request:表示请求报文中存在语法错误
401 Unauthorized:表示①发送的请求需要带Authorization首部字段来认证或者②认证失败了
403 Fobidden:表示请求资源的访问被服务器拒绝了,比如访问权限问题(IP),如果不想说明信息可以用404
404 Not Found:表示服务器上无法找到请求的资源,比如路径错误
500 Internal Server Error:表示服务器遇到意外情况,无法完成请求
502 Bad Gateway:表示服务器作为网关或代理时,访问下一个服务器时收到了无效响应
503 Service Unavailable:表示服务器暂时处于超负载或正在进行停机维护,需要带上Retry-After首部字段说明下次访问时间,否则客户端可以当作是500

4、数据转发

代理:缓存代理,保留一些资源副本,接收到相同请求时就不用再请求服务器(有过期问题,需要定期向服务器确认);透明代理,完完全全就是一个转发
网关:网关和服务器之间通信使用的不是HTTP协议,提高安全性
隧道:建立一条通信线路,也是用SSL等加密手段,保证安全通信

5、HTTP协议

HTTP1.0:无连接,每次请求都要建立一次TCP连接
改善:1浏览器并行TCP连接,2HTTP1.1

HTTP1.1:持久连接keep-alive,建立一次TCP连接后进行多次请求和响应,任意一端没有明确提出断开连接,都保持TCP连接。减少TCP连接请求和释放的开销

HTTP是无状态
服务器不记得访问过的客户
优点:服务器不保存状态,减少内存和CPU的消耗,支持大量并发HTTP请求
缺点:比如一个页面需要登录,刷新页面后重新请求资源时,服务器就又要求客户端登录了
解决方法:使用Cookie。服务器发送的响应报文加一个set-Cookie的首部,之后客户端发送的请求报文首部都加上这个cookie,服务器会对cookie进行检查比对
Cookie安全问题:网站1(bad)偷偷地使用你网站2的Cookie登录网站2
解决方法:①浏览器的同源策略;②发送指定HttpOnly属性的Cookie,防止JS读取Cookie

HTTP优点:
1、 应用广泛,不属于一种语言,所以跨平台性比较好
2、 可靠性,基于TCP/IP
3、 简单灵活,可以发很多东西,不像FTP传文件,SMTP传邮件
4、 无状态,减轻服务器负担
HTTP缺点:
1、 明文传输,不安全
2、 不验证通信双方的身份,可能是伪装
3、 无法验证报文的完整性,可能被篡改
4、 无状态同时又是缺点,不能记录状态,需要另外使用cookie技术

6、HTTPS协议

解决HTTP缺点的方法:HTTPS加密
HTTPS=HTTP+加密+验证身份+完整性保护。HTTPS是在HTTP上套了一层SSL协议,这层SSL协议位于应用层HTTP和运输层TCP之间

共享密钥加密(对称加密)
就是用同一个密钥进行加密解密(最简单的对称加密就是字母对,a换b,b换z这样)
优点:效率高;缺点:不适合在网上传输

公开密钥加密(非对称加密)
有公开密钥和私有密钥。公开密钥全网都可以知道,客户端用于加密,私有密钥只有服务器有,用于解密客户端的报文。私钥加密公钥解密,公钥加密私钥解密
优点:安全性高;缺点:效率低

HTTPS用了混合加密机制,共享密钥加密和公开密钥加密,交换共享密钥时使用公开密钥加密,通信交换报文时使用共享密钥加密
为什么要这样?因为公开密钥加密解密更为复杂,会消耗更多的CPU和内存等资源。共享密钥就是担心交换时被截获,利用公开密钥加密传输后,通信直接使用共享密钥即可

数字签名:明文使用单向哈希得到摘要,用私钥加密摘要后得到的,解决完整性问题
解决完整性问题:服务器使用MD5单向哈希加密得到一个摘要,再用私钥进行加密(数字签名+报文+公钥),发送,客户端用公钥解密数字签名后得到摘要,也使用单向哈希对内容进行加密,对比两个摘要是否相同

解决验证身份问题:证书
CA数字证书认证机构:服务器向数字证书认证机构申请公开密钥,服务器把①公开密钥和②用CA私钥加密 服务器公开密钥的摘要 的数字签名作为公钥证书发给服务器。服务器把公钥证书发给客户端,客户端用CA公钥解密数字签名,查看和证书中的公开密钥是否相同

客户端证书:网银要求客户使用,给用户发放客户端证书并要求安装,用于客户端的身份证明(不是用户)

HTTPS通信流程:简单一点来说,就是①客户端发送SSL通信请求,内容包括版本信息、加密套件列表、压缩算法列表、随机数,②服务器返回协商结果,③服务器会发送公钥证书,④服务器发送一个结束报文,⑤客户端证书检验无误后,生成共享密钥,用服务器的公钥加密,发送,⑥服务器用私钥解密,得到共享密钥,之后都是用共享密钥进行通信

7、跨域

出现跨域的原因:浏览器的同源策略
同源策略:一种安全机制,举个例子就是可以防止网站1读取网站2的Cookie
解决跨域方法:①Nginx代理;②后端可以指定什么域可以访问

8、HTTP2.0

二进制分帧

  • 消息:一个请求或响应
  • 流:以消息为一个流
  • 帧:消息转换为二进制然后分帧,加上帧首部(标识流,长度等)

多路复用

一个持久连接上可以承载任意数量的双向数据流,多个帧可以乱序发送,根据帧首部进行组装

  • 管线化:Http1.1,可以在一个持久连接上连续发多个请求,但响应也需要按顺序接收
  • 线头阻塞:因为响应需要按顺序接收,当第一个请求的响应阻塞时会影响后续所有响应
  • 作用:
    • 同一时间发送多个请求不需要开多个连接也不怕线头阻塞,因为消息都是流式发送
    • 不过这也是解决应用层的线头阻塞,基于TCP,TCP的线头阻塞问题,HTTP还是会有

服务器推送

建立连接后,服务器可以主动推送它认为客户端需要的资源到客户端缓存

  • 作用:避免往返请求

header压缩

对header进行压缩

  • 实现:客户端服务器都使用首部表,记录为索引+字段名+值。发送时,不变发索引号,更新发索引+值,追加发字段名+值
  • 作用:降低开销,节省发送首部的网络流量

9、HTTP3.0

使用了QUIC(以后再总结),QUIC是基于UDP,在应用层实现可靠,有重传、拥塞控制等机制
在这里记录几个点:HTTP2.0解决了HTTP的队头阻塞,但TCP还是有队头阻塞;现在多用流量、WIFI,容易更换网络状态,TCP重连有开销,并且信号被暂时干扰也会被拥塞控制;TCP协议栈在操作系统内核中,更改不方便

posted @ 2020-11-04 10:37  肥斯大只仔  阅读(90)  评论(0编辑  收藏  举报