美文网首页
知识点整理之HTTP

知识点整理之HTTP

作者: 酷酷的凯先生 | 来源:发表于2020-11-10 17:32 被阅读0次

.http与https的区别

  1. https协议需要到ca申请证书,一般免费证书较少,需要付费
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
  3. http默认80端口,https默认443端口
  4. http是无状态连接;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,安全性更高
  5. 对称加密,非对称加密
    对称加密:一般小于256bit,密钥越大,加密越强,但是加密与解密的时间越长;加密与解密用的是同样的密钥;缺点:密钥的管理和分配
    非对称加密:最常用的非对称加密算法是RSA算法;通过一堆密钥:公钥和私钥,私钥由一方安全保管,公钥可以发送给任何请求他的人,只有私钥才能解密,而且不需要将私钥通过网络发送出去,大大提高网络安全性

.一个 tcp 连接能发几个 http 请求?

如果是 HTTP 1.0 版本协议,一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个 TCP 发送一个 HTTP 请求,但是有一种情况可以将一条 TCP 连接保持在活跃状态,那就是通过 Connection 和 Keep-Alive 首部,在请求头带上 Connection: Keep-Alive,并且可以通过 Keep-Alive 通用首部中指定的,用逗号分隔的选项调节 keep-alive 的行为,如果客户端和服务端都支持,那么其实也可以发送多条,不过此方式也有限制,可以关注《HTTP 权威指南》4.5.5 节对于 Keep-Alive 连接的限制和规则。

而如果是 HTTP 1.1 版本协议,支持了长连接,因此只要 TCP 连接不断开,便可以一直发送 HTTP 请求,持续不断,没有上限; 同样,如果是 HTTP 2.0 版本协议,支持多用复用,一个 TCP 连接是可以并发多个 HTTP 请求的,同样也是支持长连接,因此只要不断开 TCP 的连接,HTTP 请求数也是可以没有上限地持续发送。

.常用的HTTP方法有哪些?

GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。

.GET 请求和 POST 请求的区别

  1. GET请求在浏览器回退和刷新时是无害的,而POST请求会告知用户数据会被重新提交;
  2. GET请求可以收藏为书签,POST请求不可以收藏为书签;
  3. GET请求可以被缓存,POST请求不可以被缓存,除非在响应头中包含合适的Cache-Control/Expires字段,但是不建议缓存POST请求,其不满足幂等性,每次调用都会对服务器资源造成影响;
  4. GET请求一般不具有请求体,因此只能进行url编码,而POST请求支持多种编码方式。
  5. GET请求的参数可以被保留在浏览器的历史中,POST请求不会被保留;
  6. GET请求因为是向URL添加数据,不同的浏览器厂商,代理服务器,web服务器都可能会有自己的长度限制,而POST请求无长度限制;
  7. GET请求只允许ASCII字符,POST请求无限制,支持二进制数据;
  8. GET请求的安全性较差,数据被暴露在浏览器的URL中,所以不能用来传递敏感信息,POST请求的安全性较好,数据不会暴露在URL中;
  9. GET请求具有幂等性(多次请求不会对资源造成影响),POST请求不幂等;
  10. GET请求一般不具有请求体,请求中一般不包含100-continue 协议,所以只会发一次请求,而POST请求在发送数据到服务端之前允许双方"握手",客户端先发送Expect:100-continue消息,询问服务端是否愿意接收数据,接收到服务端正确的100-continue应答后才会将请求体发送给服务端,服务端再响应200返回数据。

1、HTTP 报文层面: GET 将请求信息放在 URL, 请求信息和url之间以问号隔开,请求信息的格式为键值对。POST 放在报文体中,想获取请求信息,必须解析报文,因此安全性交get方式要高一些。虽然 POST 放在报文体,但通过抓包依然是可以很轻松的获取到信息的,所以从安全性上来讲,两者并没有太多的区别,HTTP 也并不是安全的,具体要解决传输过程中的安全问题,还要靠 HTTPS. GET 有长度限制,POST 则无。

2、数据库层面: GET 符合幂等性和安全性,POST 不符合。幂等性的定义就是对数据库的一次操作、多次操作,获得的结果是一致的;安全性则是对数据库的操作没有改变数据库的数据。GET 请求是用来做查询操作的,因此不会改变数据库中原有的数据,而 POST 请求则是提交数据,因此会改变数据库中的数据,其次,POST 请求方式每次获得的结果都有可能不一样,因为 POST 请求是作用在上一级的 URL 上的,则每一次请求都会添加一份新资源,这也是 POST 和 PUT 的最大区别。PUT 是幂等的。

3、其他层面: GET 可以被缓存、被存储,而 POST 不行。GET 请求会保存在浏览器的浏览记录中,以 GET 请求的 URL 可以保存为浏览器书签,而 POST 不具备这些功能。Get表达的是密等的,安全的,因此绝大部分get的请求,通常超过90%都直接被cdn缓存了,这能大大减少web服务器的负担,而post是非密等的,有副作用的操作,所以必须交友web服务器处理。

.HTTPS工作原理

  1. 首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
  2. 客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
  3. 消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
  4. 发送给服务端,此时只有服务端(RSA私钥)能解密。
  5. 解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。

.一次完整的HTTP请求所经历的7个步骤

  1. 建立TCP连接
  2. Web浏览器向Web服务器发送请求行
  3. Web浏览器发送请求头
  4. Web服务器应答
  5. Web服务器发送应答头
  6. Web服务器向浏览器发送数据
  7. Web服务器关闭TCP连接

.常见的HTTP相应状态码

200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙

.HTTP优化方案

TCP复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
内容缓存:将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
压缩:将文本数据进行压缩,减少带宽
SSL加速(SSL Acceleration):使用SSL协议对HTTP协议进行加密,在通道内加密并加速
TCP缓冲:通过采用TCP缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。

.浏览器输入一个地址。到页面展示中间经历了哪些东西?

  1. 浏览器输入url,先解析 url 地址是否合法,抽出域名字段
  2. 游览器检查是否有缓存(浏览器缓存-系统缓存-路由器缓存)。如果有,直接显示,否则跳到第三步。
  3. 在发送 http 请求前,需要域名解析(DNS解析),解析获取对应过的 ip 地址。
  4. 浏览器向服务器发起TCP/IP连接三次握手(Three-way Handshake)
    建立一个 TCP 连接时,需要客户端和服务器总共发送3个包
    (1). 客户端发送一个 TCP 的 SYN 标志位置1的包到服务器,并进入SYN_SENT状态,等待服务器确认。
    (2). 服务器收到 SYN 包,必须确认客户的SYN(ack=x+1),同时自己也发送一个 SYN 包(syn=y),即SYN+ACK包,此时服务器进入 SYN_RECV 状态
    (3). 客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=y+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP连接成功)状态,完成三次握手
  5. 握手成功后,浏览器向服务器发送 http 请求,对请求包装成请求报文
    http请求包含请求头,或请求体两部分
    请求头中包含我们希望对请求文件的操作的信息
    请求体中包含传递给后台的参数。
  6. 服务器收到处理的请求开始做负载平衡,跨域等,文件处理完毕,生成响应数据包并返回
    响应也包含两部分,响应头和相应体,响应体就是我们所请求的文件
  7. 经过网络传输,文件被下载到本地客户端,浏览器收到 http 响应,客户端开始加载
  8. 浏览器解析响应,如果响应可以缓存,则存入缓存
  9. 浏览器发送请求获取嵌入在HTML中的资源(html,css,JavaScript,图片,音乐等)
    获取到服务器相应之后,浏览器会根据相应的 content-type 字段对响应字符串进行解析。能够解析并成功解析就显示,能够解析但解析错误就报错,不能解析就下载。
    (1). 解析html文件是自上而下,先是头部后是body
    (2). 当解析到头部css外部链接时,同步去下载,如果遇到外部js链接也是下载【不过js链接不建议放在头部,因为耽误页面第一展现时间】
    (3). 接着解析 body 部分,边解析边开始生成对应的 DOM 树,同时等待 css 文件下载
    (4). 一旦 css 文件下载完毕,那么就同步去用已经生成的 DOM 节点 + CSS 去生成渲染树
    (5). css 文件加载不会阻塞 html 文件的解析,但会阻塞 DOM 的渲染,,也会阻塞后面 js 语句的执行
    (6). 在下载 js 时会阻塞 html 的解析和渲染,又分几种情况:
      1)没有 defer 和async 标签的 script 会立即加载并执行
      2)有 async 标签的 js,js 的加载执行和 html 的解析和渲染并行
      3)有 defer 标签的 js,js 的加载和 htm l的解析和渲染并行
  10. 渲染树一旦有结构模型了,接着就会同步去计算渲染树节点的布局位置
  11. 一旦计算出来渲染的坐标后,又同步去开始渲染
  12. 进行过程中如果遇到图片则跳过去渲染下面内容,等待图片下载成功后会返回来在渲染原来图片的位置
  13. 如果渲染过程中出现 js 代码调整 DOM 树机构的情况,也会再次重新来过,从修改 DOM 那步开始
  14. 最终所有节点和资源都会渲染完成
  15. 页面全部渲染结束。
  16. 断开连接:TCP 四次挥手
    为什么连接的时候是三次握手,关闭的时候却是四次握手?
    因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

.了解v8引擎吗,一段js代码如何执行的

在执行一段代码时,JS 引擎会首先创建一个执行栈

然后JS引擎会创建一个全局执行上下文,并push到执行栈中, 这个过程JS引擎会为这段代码中所有变量分配内存并赋一个初始值(undefined),在创建完成后,JS引擎会进入执行阶段,这个过程JS引擎会逐行的执行代码,即为之前分配好内存的变量逐个赋值(真实值)。

如果这段代码中存在function的声明和调用,那么JS引擎会创建一个函数执行上下文,并push到执行栈中,其创建和执行过程跟全局执行上下文一样。但有特殊情况,即当函数中存在对其它函数的调用时,JS引擎会在父函数执行的过程中,将子函数的全局执行上下文push到执行栈,这也是为什么子函数能够访问到父函数内所声明的变量。

还有一种特殊情况是,在子函数执行的过程中,父函数已经return了,这种情况下,JS引擎会将父函数的上下文从执行栈中移除,与此同时,JS引擎会为还在执行的子函数上下文创建一个闭包,这个闭包里保存了父函数内声明的变量及其赋值,子函数仍然能够在其上下文中访问并使用这边变量/常量。当子函数执行完毕,JS引擎才会将子函数的上下文及闭包一并从执行栈中移除。

最后,JS引擎是单线程的,那么它是如何处理高并发的呢?即当代码中存在异步调用时JS是如何执行的。比如setTimeout或fetch请求都是non-blocking的,当异步调用代码触发时,JS引擎会将需要异步执行的代码移出调用栈,直到等待到返回结果,JS引擎会立即将与之对应的回调函数push进任务队列中等待被调用,当调用(执行)栈中已经没有需要被执行的代码时,JS引擎会立刻将任务队列中的回调函数逐个push进调用栈并执行。这个过程我们也称之为事件循环。

相关文章

网友评论

      本文标题:知识点整理之HTTP

      本文链接:https://www.haomeiwen.com/subject/egxnrktx.html