.http与https的区别
- https协议需要到ca申请证书,一般免费证书较少,需要付费
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
- http默认80端口,https默认443端口
- http是无状态连接;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,安全性更高
- 对称加密,非对称加密
对称加密:
一般小于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 请求的区别
- GET请求在浏览器回退和刷新时是无害的,而POST请求会告知用户数据会被重新提交;
- GET请求可以收藏为书签,POST请求不可以收藏为书签;
- GET请求可以被缓存,POST请求不可以被缓存,除非在响应头中包含合适的Cache-Control/Expires字段,但是不建议缓存POST请求,其不满足幂等性,每次调用都会对服务器资源造成影响;
- GET请求一般不具有请求体,因此只能进行url编码,而POST请求支持多种编码方式。
- GET请求的参数可以被保留在浏览器的历史中,POST请求不会被保留;
- GET请求因为是向URL添加数据,不同的浏览器厂商,代理服务器,web服务器都可能会有自己的长度限制,而POST请求无长度限制;
- GET请求只允许ASCII字符,POST请求无限制,支持二进制数据;
- GET请求的安全性较差,数据被暴露在浏览器的URL中,所以不能用来传递敏感信息,POST请求的安全性较好,数据不会暴露在URL中;
- GET请求具有幂等性(多次请求不会对资源造成影响),POST请求不幂等;
- 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工作原理
- 首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
- 客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
- 消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
- 发送给服务端,此时只有服务端(RSA私钥)能解密。
- 解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
.一次完整的HTTP请求所经历的7个步骤
- 建立TCP连接
- Web浏览器向Web服务器发送请求行
- Web浏览器发送请求头
- Web服务器应答
- Web服务器发送应答头
- Web服务器向浏览器发送数据
- 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缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。
.浏览器输入一个地址。到页面展示中间经历了哪些东西?
- 浏览器输入url,先解析 url 地址是否合法,抽出域名字段
- 游览器检查是否有缓存(浏览器缓存-系统缓存-路由器缓存)。如果有,直接显示,否则跳到第三步。
- 在发送
http
请求前,需要域名解析(DNS解析),解析获取对应过的ip
地址。 - 浏览器向服务器发起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连接成功)状态,完成三次握手 - 握手成功后,浏览器向服务器发送
http
请求,对请求包装成请求报文
http请求包含请求头,或请求体两部分
请求头中包含我们希望对请求文件的操作的信息
请求体中包含传递给后台的参数。 - 服务器收到处理的请求开始做负载平衡,跨域等,文件处理完毕,生成响应数据包并返回
响应也包含两部分,响应头和相应体,响应体就是我们所请求的文件 - 经过网络传输,文件被下载到本地客户端,浏览器收到
http
响应,客户端开始加载 - 浏览器解析响应,如果响应可以缓存,则存入缓存
- 浏览器发送请求获取嵌入在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的解析和渲染并行 - 渲染树一旦有结构模型了,接着就会同步去计算渲染树节点的布局位置
- 一旦计算出来渲染的坐标后,又同步去开始渲染
- 进行过程中如果遇到图片则跳过去渲染下面内容,等待图片下载成功后会返回来在渲染原来图片的位置
- 如果渲染过程中出现 js 代码调整 DOM 树机构的情况,也会再次重新来过,从修改 DOM 那步开始
- 最终所有节点和资源都会渲染完成
- 页面全部渲染结束。
- 断开连接: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进调用栈并执行。这个过程我们也称之为事件循环。
网友评论