八股文不用背-http和https

171 阅读8分钟

http的请求方式

  • get:获取数据
  • post:修改数据
  • put:新增数据
  • delete:删除数据
  • options:查询接口能使用那些请求方式

get和post的使用场景

http的常见请求头和响应头

请求头

  • host
  • user-Agency
  • method
  • accept-encoding
  • accept-charset
  • cookie
  • content-type
  • cache-control

响应头

  • date
  • content-type
  • cache-control

content-type的种类

  • text
  • json
  • form-data
  • de

http1.0和http1.1的区别

  • http1.0发起一次请求就会建立一次tcp/ip连接,请求结束后,连接断开;而http1.1会保持tcp/ip链接。
  • http1.0请求资源是会拿到整个资源的(比如视频),然后整个返回给客户端,这样会浪费宽带;而http1.1则能获取资源的指定字节范围,比如获取视频资源的第a字节到第b字节的内容,响应码是206。
  • httt1.0的浏览器缓存只有cache-control、expires,而http1.1有If-modify-since/last-modify和eTag/if-no-matched等
  • http1.0的响应头没有host字段,所以没法用域名系统;http1.1有

队头阻塞

问题:http1.1可以保持tcp/ip链接,所以可以使用通道,在一个tcp/ip连接中发起多个请求,但是由于http1.0和http1.1是一发一收,所以得等第一个请求接受到响应了才能发起第二个请求,当第一个请求阻塞就会发生队头阻塞。
解决方案:浏览器对于同一个 域名最多建立6个tcp/ip链接,那我们同时建立多个tcp/ip请求;域名分片,有多个二级域名指向同一个域名,然后浏览器发起多个请求请求二级域名

http1.1和http2.0的区别

  • http2.0将一个请求或者响应,都封装成帧,然后在tcp/ip连接里建立流(一个http请求建立一个流),流中能无序传输多个分片帧。每个流有自己的编号。
  • http2.0是彻底的二进制,包括请求头和请求体,分别被封装成了头信息帧和数据帧,然后拆分成片段帧,每个分片帧都有帧号,server端能将分片帧合并,从而获取请求头和请求体。所以多个请求/响应能在一个tcp/ip连接中全部发送出去。从而避免了队头阻塞问题。
  • http2.0有头部压缩,即第一次请求的请求头中携带全量的数据,之后的请求只需要携带变更的请求头数据即可
  • http2.0服务器可以主动推送东西,减少请求发起

http和https的区别

http:超文本传输协议 https:超文本安全传输协议

  • http是明文传输,不安全;https是加密传输,较为安全
  • https需要数字签名,需要钱
  • https需要一层https握手,所以耗时
  • http是80端口;https是443端口

在浏览器输入https://www.google.com发生了什么

  1. 解析出请求协议、请求host、端口
  2. 缓存判断
  3. dns解析
  4. tcp三次握手
  5. https握手
  6. 发送数据
  7. 获取响应
  8. tcp四次挥手
  9. 解析html
  10. 渲染在浏览器

keep-alive

用于连接是否要保活的标识

  • 短连接:http1.0时不传入keep-alive,所以每次http请求都会建立tcp/ip连接,请求完成就关闭
  • 长连接:http1.1默认content-type:keep-alive,保持tcp/ip连接存活,然后通过content-type:close主动关闭连接

当有多张图片时,http表现如何

  • http1.x下,tcp/ip连接最多有6个连接,而每个连接中的http请求必须得同步发送,所以一定时间内请求发起数少
  • http2.x下,可以在一个tcp/ip连接中同时发起多个请求,所以效果好

URL有哪些组成部分

比如:https://www.baicu.com/index.html#a=1?b:1

  • 协议
  • 万维网前缀
  • host
  • 路径path
  • 入参(?)
  • 锚点(#)

请求头中关于缓存的字段

强缓存

  • expires
  • cache-control
    协商缓存
  • if-modify-since/last-modify
  • etag/if-no-match

https协议

http协议是tcp/ip五层网络协议,而https需要在tcp/ip连接建立之前,先进行ssl认证。 背景:http是明文、无身份认证的传输协议,这会有以下的问题

  • 中间人能窃听请求/响应
  • 中间人能新增/修改请求/响应
  • 浏览器是不知道某个http响应是不是真正的服务器返回的(有可能是中间人插入在client/server中间)。

方法:

  • 通过给传输的内容hash,生成hash值,内容任何的修改都会导致新hash与旧hash的不一致。这种方式会被中间人修改内容以及hash从而来修改内容,所以我们需要给内容和hash加密
  • 通过对称加密的方式(client/server公用一个秘钥来加解密),这样就能加密传输内容。这种方式需要先传输公用的秘钥(比如client->server随机数A,server->client随机数B,两个随机数作为入参,双方使用同一个加解密函数作为公用的秘钥),如果被窃取了两个随机数,那就gg
  • https通过非对称加密的方式,server将公钥传输给client,然后在对称加密的两个随机数AB基础上,client使用公钥加密随机数C(中间人无法解密这个随机数C),传输给server,之后双方使用随机数ABC+加解密函数作为对称加密的私钥,这样私钥就不会被破解了。(因为非对称加密耗时,所以只作为对称加密的秘钥的加密方式)\

数字签名

我们解决了传输信息的窃听、修改问题了,但是有另一个问题出现了。
背景:
中间人不窃听、不修改,就单纯的插在中间:client-中间人-server,中间人提供给client自己的公钥、然后拿server的公钥,这样就能获取client的请求,以及server的响应。
方法:
让server的公钥被公信化,比如有一个权威机构认证的公钥。bilibili网站把自己的公钥给到权威机构去认证,获取公证,公证+公钥=数字签名,然后bilibili把数字签名给浏览器,浏览器验证公证就认为这个公钥是来自bilibili的,而不是中间人的。这种方式实现了身份认证e。

所以https握手过程

  1. client发起一个请求,带有随机数A、允许的加密方式、以及所有内容的hash值
  2. server将自己的公钥+权威认证=数字证书+随机数B、以及所有内容的hash值发送给client
  3. client生成一个随机数C,生成hash,用数字证书中的公钥加密所有内容,发送给server
  4. client/server使用这随机数ABC+加密方法作为两者公用的秘钥进行数据交互

响应状态码

2xx

  • 200:成功
  • 204:not content 响应体中无内容
  • 206:partial content 部分内容,比如该响应只返回某视频资源的0字节-2000字节内容

3xx:大部分和重定向有关

  • 301:永久重定向
  • 302:临时重定向
  • 304:not modified 协商缓存后,server让client直接用本地缓存

4xx:client的问题

  • 400:bad request,一般是传参格式错误、url错误
  • 401:服务器认证失败
  • 403:禁止访问
  • 404:没找到
  • 405:请求方式不允许

5xx:server的问题

  • 500:服务器内部错误
  • 503:服务器超载

DNS是什么

domain name server 域名服务:ip不好记,域名好记door了!但是ip层传输得用ip,所以我们得有域名服务器将域名和ip做一一映射

DNS解析过程

  • 浏览器缓存 => 本地域名服务器(host文件)=> 顶级域名服务器 => 权威域名服务器

网络模型

Tcp/ip 五层网络模型

  1. 应用层(http、https、ftp等)
  2. 传输层(tcp、udp)
  3. 网络层(ip)
  4. 链路层
  5. 物理层

Tcp的拥塞控制

  • 慢启动
  • 拥塞避免
  • 快速恢复
  • 流量控制

tcp的三握四挥

前后端实时通信的方式

tcp、http都是可以一直保持着的链接、只要后端不主动关闭,那么链接就会一直保持的(不考虑重连保活)

  • 轮询:前端每隔一定时间就向后端请求数据,无论是否有新的数据。
  • 长轮询:前端发一个请求给后端,后端将该连接保持着,等有新数据才返回,然后关闭连接。
  • 长连接:比如iframe方式:后端接受请求后,将连接一直保持着,维护它,并且不关闭。
  • websocket
  • sse

各方式的优缺点:

  • 优点:写起来简单;缺点:频繁发起请求
  • 优点:避免了多次无意义的请求;缺点:是http,所以请求头带了很多信息,而且维持这个连接也需要资源
  • 优点:同上;缺点:同上+后端维护连接难度增加
  • 优化:很好;缺点:无法断线重连,兼容性问题
  • 优点:很好;缺点:无