参考:
https://juejin.cn/post/6844903590058786824
https://space.bilibili.com/327247876
https://blog.csdn.net/qq_38128179
https://www.bilibili.com/video/BV18f4y1H7Zu
https://blog.csdn.net/weixin_45070175/article/details/118559272
https://www.jianshu.com/p/26879146d865

文章目录

  • 一、计网
    • 1.ajax,fetch,axios是什么,优缺点?
    • 2.跨域方式有哪些?特点是什么?
    • 3.TCP三次握手四次挥手,握手哪次最容易被攻击?
    • 4.HTTP报文结构,头有哪些字段?
    • 5.TCP/IP五层模型?网络OSI七层模型有哪些?TCP是哪一层,这层还有什么协议?
    • 6.http1.0和http1.1和http2的区别,http3?
    • 7.GET和POST区别?
    • 8.http和https有什么区别?https实现原理?(SSL/TLS)
    • 9.localStorge,SessionStorage,cookie,session,token都是什么?
    • 10.什么是JWT?(Json Web Token)
    • 11.indexDB和localStorage区别?
    • 12.http缓存有哪些?
    • 13.TCP和UDP有什么区别?
    • 14.TCP如何保证可靠传输的?
    • 15.从浏览器输入url后都经历了什么?浏览器渲染页面的流程?
    • 16.回流reflow和重绘repaint?
    • 17.CDN缓存是什么?
    • 18.DNS是什么?
    • 19.xss和csrf是什么,如何防范?(前端安全)
  • 二、操作系统
    • 1.进程和线程的区别
    • 2.进程间通信的方式
    • 3.死锁
    • 4.页置换算法
    • 5.浏览器的多进程

一、计网

1.ajax,fetch,axios是什么,优缺点?

1)ajax
ajax指异步的javascript和XML,是一个技术统称,特点就是局部刷新页面、不需要重载整个页面。ajax通过js操作浏览器提供的XMLHttpRequest构造函数表示网页请求,以此来进行网络通信。
ajax内部有这么几个需要注意点函数和参数:

open(请求方法,url,是否异步):定义请求
send(请求体):发送请求
readyState:相当于客户端的状态码
readyState属性值的变化会触发**onreadystatechange()**回调函数,因此使用onreadystatechange监视readyState属性的变化。
0:未调用open方法
1:调用了open方法,未调用send方法
2:发送了请求还未收到响应
3:收到部分响应
4:响应都接收完毕

function ajax(url){//1.由于js自身没有网络沟通能力,因此需要创建浏览器提供的XMLHttpRequestlet xhr = new XMLHttpRequest();//2.接着定义请求,用open()方法填写请求类型,URL和是否异步xhr.open('get',url,true);//3.用onreadystatechange()监控readyState属性值变化xhr.onreadystatechange = () =>{if(xhr.readyState===4){//如果readyState等于4就表示收到所有响应了if(xhr.status===200){//收到所有响应不代表成功接收文件,可能文件不存在了,因此要判断状态码console.info("响应结果",xhr.response);}}}//4.用send()方法发送请求xhr.send(null);
}

2)fetch
fetch是基于es6提出的promise的发送网络请求的API,因为使用了promise,因此链式调用,不会产生回调地狱。

fetch默认发送请求方法是GET方法:

function fetchmethod(url){fetch(url).then(response=>{//收到服务器传来的响应if(response.ok){//如果响应状态为ok成功,则将响应转换为js可以操作的json对象response.json();}throw new Error("错误提示");//失败则抛出异常}).then(data => console.log(data));//得到想要的信息
}

fetch如果发送POST请求,就需要设置第二个参数(一个配置对象):

function fetchmethod(url){fetch(url,{method:'POST',//请求体提交前要转换成服务器能识别的格式,把js对象转为jsonbody: JSON.stringify({key:value}),headers:{//定义http请求头部的类型,让服务器能够更好识别内容'Content-Type':'application/json'}}).then(response=>{if(response.ok){response.json();}throw new Error("错误提示");}).then(data => console.log(data));
}

3)axios
axios是随着vue的兴起而广泛使用的一个封装库,它支持promise API,同时也是对XHR的封装。

axios({method:'GET',url:'xxx'
})
.then(res=>console.log(res))
.catch(error=>console.log(error));

4)总结
ajax

  1. 针对 mvc 编程,随着react,vue等前端mvvm框架的兴起,jquery早已不复当年之勇
  2. 很多情况下我们只需要使用ajax,但是却需要引入整个jquery,这非常的不合理
  3. 回调地狱

fetch
而fetch也有一定的问题

  1. 浏览器支持性比较差。
  2. 当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ), 仅当网络故障时或请求被阻止时,才会标记为 reject。

axios

  1. axios体积比较小,而且也是基于promise的封装xhr的库
  2. 自动转化为json数据类型
  3. 解决回调地狱问题
  4. 浏览器兼容性良好

2.跨域方式有哪些?特点是什么?

跨域:指浏览器不能执行其他网站的脚本。是由浏览器的同源策略造成,是浏览器的安全限制。(同源指:同协议、同域名、同端口号)

1)设置document.domain解决无法读取非同源网页的cookie问题
使用 document.domain 只能跨子域,需要主域相同才能使用(例如http:// www.example.com/a.html和http:// example.com/b.html)
关于子域和主域:此处
document.domain = 'example.com'
通过 document.domain 设置主域,就可以访问并操作子域的 window 对象了,从而达到跨域的目的。具有相同document.domain的页面,就相当于是处在同域名的服务器上,如果协议和端口号也是一致,那它们之间就可以跨域访问数据。

2)JSONP
JSONP是服务器与客户端跨源通信的常用方法。最大的特点就是简单,兼容性好。但是只支持get请求,不支持post请求。
核心思想就是网页通过添加一个script元素,向服务器请求JSON数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。
优缺点:此处

(1)原生实现

<script src="http://test.com/data.php?callback=dosomething"></script>
// 向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字// 处理服务器返回回调函数的数据
<script type="text/javascript">function dosomething(res){// 处理获得的数据console.log(res.data)}
</script>

(2)ajax

$.ajax({url: 'http://www.test.com:8080/login',type: 'get',dataType: 'jsonp',  // 请求方式为jsonpjsonpCallback: "handleCallback",    // 自定义回调函数名data: {}
});

(3)Vue.js

this.$http.jsonp('http://www.domain2.com:8080/login', {params: {},jsonp: 'handleCallback'
}).then((res) => {console.log(res);
})

3)CORS
CORS是跨域资源分享的缩写,​ CORS需要浏览器和服务器同时支持,目前基本上浏览器都支持。
浏览器将CORS请求分成两类:简单请求和非简单请求。

(1)简单请求
满足请求方法是HEAD、POST、GET,请求头只有Accept、AcceptLanguage、ContentType、ContentLanguage、Last-Event-Id的是简单请求。
服务器端设置Access-Control-Allow-Origin:允许请求的域
如果想传cookie,前端需要设置xhr.withCredentials = true,服务器端设置Access-Control-Allow-Credentials

(2)非简单请求
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE。
浏览器先发送一个header头为option的请求进行预检。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
预检请求包含3个关键字段:
Origin:表示请求来自哪个源
Access-Control-Request-Method:用来列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Request-Header:指定浏览器CORS请求会额外发送的头信息字段

服务器收到"预检"请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。
在服务器返回的响应中,关键的是Access-Control-Allow-Origin字段,表示可以请求数据的源。通过预检后,浏览器接下来的每次请求就类似于简单请求了。

4)nginx代理跨域
nginx模拟一个虚拟服务器,因为服务器与服务器之间是不存在跨域的。
nginx的实际原理就是配置一个代理路径替换实际的访问路径,使得浏览器认为访问的资源都是属于相同协议,域名和端口的,而实际访问的并不是代理路径,而是通过代理路径找到实际路径进行访问,所以,不妨将nginx看作是给浏览器的一种障眼法。
发送数据时 ,客户端->nginx->服务端
返回数据时,服务端->nginx->客户端

3.TCP三次握手四次挥手,握手哪次最容易被攻击?

4.HTTP报文结构,头有哪些字段?

超文本传输协议。默认HTTP的端口号为80,HTTPS的端口号为443。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

1)请求报文
一个HTTP请求由请求行、请求头、空行和请求数据(请求体)四部分组成。

(1)请求行:请求方法 + 请求url + HTTP协议版本(POST /user.html HTTP1.1)

  • 请求方法共8种:(前3种HTTP1.0,后5种HTTP1.1新增)

    • GET:获取资源。传递参数长度受限制,且参数直接放在 url 中,因此GET请求不适合用来传递私密数据,也不太适合拿来传递大量数据。
    • POST:传输数据。传递的数据封装在HTTP请求数据(请求体)中,以名称/值的形式出现,可以传输大量数据,对数据量没有限制,也不会显示在url中。
    • HEAD:获得报文首部。和GET相似,不过服务端收到HEAD请求时只返回响应头,不发送响应内容(响应体)。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
    • OPTIONS:询问支持的方法。用于获取服务器所支持的方法。若请求成功,会在HTTP响应头中包含一个名为"Allow"的头,值是所支持的方法,如"GET"、“POST”
    • PUT:传输文件。把一个资源存放在指定位置上。与POST相似,但PUT通常指定了资源的存放位置,而POST则没有。PUT自身不带验证机制,存在安全性问题。
    • DELETE:删除文件。与PUT相反,请求url删除指定资源,同时也不带验证机制。
    • TRACE:追踪路径。回显服务器收到的请求,主要用于测试或诊断。
    • CONNECT:要求与代理服务器通信时建立隧道。使用SSL把通信内容加密后再传输。

(2)请求头
请求头部由关键字/值对组成,每行一对。

  • User-Agent : 产生请求的浏览器类型
  • Accept : 客户端希望接受的数据类型(Accept:text/xml(application/json))
  • Content-Type:客户端发送的实体数据的数据类型(Content-Type:text/html(application/json))
  • Host : 请求的主机名
  • Connection:keep-alive 表示数据传输完仍与服务器保持连接
  • Cache-Control: 是否使用缓存(Cache-Control: no-cache)

(3)空行:请求头之后是一个空行,通知服务器以下不再有请求头
(4)请求体:GET没有请求数据,POST有。与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length

2)响应报文
一个HTTP响应由**状态行、响应头(消息报头)、空行和响应正文(响应体)**四部分组成。

(1)状态行:协议版本 + 状态码 + 原因短语 (HTTP/1.1 200 OK)

  • 状态码共5类:

    • 1xx:这类响应是临时响应。表示请求已被接收,需要继续处理。

      • 100:(继续)客户端应当继续提出请求,服务器已经收到一部分,正在等待其余部分
      • 101:(切换协议)客户端要求服务器切换协议,服务器已确认并准备切换
    • 2xx:代表请求已经成功被服务器接收、理解并接受。
      • 200:(成功)服务器已经成功处理请求,返回所需资源
    • 3xx:这类状态码表明客户端需要进行后续操作才能完成请求。通常表示需要重定向,后续请求地址在本次相应的Location域中指明。
      • 301:(永久移动)请求的网页已经永久移动到新位置,服务器返回此响应时会自动将请求者转到新位置
      • 302:(临时移动)网页位置暂时不可访问,但请求者未来请求应继续使用原来位置,通常是访问某网站资源时需要权限
      • 304:(未修改)自从上次请求后,请求的资源未更改,告诉请求者可以去本地缓存拿取资源
    • 4xx:表示客户端错误,请求语法有错误或请求无法实现等。
      • 403:(禁止)服务器拒绝请求,通常是跨域问题
      • 404:(未找到)请求错误,服务器找不到请求的网页
    • 5xx:表示服务器错误,服务器未能实现请求或者服务器出现错误。
      • 500:(服务器内部错误)服务器遇到错误,无法完成请求
      • 502:(错误网关)服务器作为网关或者代理,从上游服务器收到错误响应
      • 503:(服务不可用)服务器暂时无法使用,有可能是超载或停机

(2)响应头

  • Allow:服务器同意的有效动作(Allow: GET, HEAD)
  • Cache-Control:表示是否可以缓存这个对象及缓存有效时间(Cache-Control: max-age=3600)
  • Access-Control-Allow-Origin:指定哪些网站可以跨域 (Access-Control-Allow-Origin: *)
  • Last-Modified:请求的对象的最后修改日期(Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT)
  • ETag:资源对应的唯一字符串

5.TCP/IP五层模型?网络OSI七层模型有哪些?TCP是哪一层,这层还有什么协议?

TCP/IP五层模型:物理层,数据链路层,网络层,传输层,应用层
OSI七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP属于传输层,这层还有UDP。

6.http1.0和http1.1和http2的区别,http3?

HTTP1.0 vs HTTP1.1:

  • 长连接:1.0中需要使用keep-alive告知服务器建立长连接。而1.1默认开启长连接keep-alive,在一个TCP连接上可以传送多个请求和响应,减少了建立和关闭连接的资源消耗。
  • host域:1.0中默认每台服务器绑定唯一一个ip地址,且请求不传递主机名。而1.1中请求和响应都支持host域,且请求消息如果不携带host字段会报400语法错误。
  • 节约带宽:1.0中如果客户端只需要资源的某一部分,但服务器只能全部发来,浪费带宽。而1.1中支持只发送响应头,而不携带响应主体。
  • 缓存处理:1.0中主要使用if-notified-since,expire作为缓存的判断,而1.1中引入了更多缓存策略,如etag,if-match,if-none-match。

HTTP2.0 vsHTTP1.1:

  • 多路复用:2.0可以通过一个tcp连接同时并发处理多个请求。
  • 服务器推送:网页请求多种资源,如html、css、js、图片等,1.1需要每一个都进行明确请求,服务器再一一响应。而2.0引入了服务器推送,允许服务器在客户端明确请求之前就将资源推送给它,这样客户端可以直接从本地加载,不用通过网络。
  • 头部压缩:1.1中消息主体会经过压缩传输,而行和头却直接以纯文本传输。2.0中使用HPACK算法对头部进行了压缩。

HTTP3:增加了QUIC协议,基于udp完成连接的

7.GET和POST区别?

  1. 缓存:get请求的数据是可以缓存的;post请求的数据不可以缓存。
  2. 传参:get传参通过url传递;post传参放在body内。
  3. 数据长度:get传递数据长度受URL大小限制,最大长度是2048个字符;post没有长度限制。
  4. 安全性:是相对的。post相对get更安全一些,因为参数不会在url中显示,也不会保存在浏览器历史中。但是都是明文传输的,都会被访问到,想要做到安全,需要使用https。
  5. 数据类型的限制:get数据只允许ASCII编码;post支持多种编码。
  6. 后退按钮,刷新:get后退没有影响;post后退数据会被重新提交。
  7. 历史:get的参数会保留在浏览器历史中;post不会。

8.http和https有什么区别?https实现原理?(SSL/TLS)

区别:

  1. 端口:http端口是80;https是443
  2. 传输协议:http协议是明文传输;https是经过SSL加密后的传输协议
  3. 安全性:https使用了TLS/SSL加密,比http更加安全
  4. 证书:https需要申请ca证书

https实现原理:

  1. 客户端向服务器发送随机值1和客户端支持的加密算法,并连接到443端口
  2. 服务器收到后,会返回随机值2和一个协商好的加密算法
  3. 随后服务端会再次发送一个CA证书,这个证书实际上就是一个包含了信息的公钥
  4. 客户端收到证书后,会验证CA证书是否有效。如果验证失败则提示连接不安全。
  5. 如果验证成功,客户端会生成一个预主密钥,并且使用随机值1、2和预主密钥组装成会话密钥,再使用服务端发来的公钥对其进行加密发送给服务端。(这个过程是非对称加密)
  6. 服务端收到以后使用私钥解密,随后就能获得会话密钥。
  7. 为了验证服务端是否收到会话密钥,客户端会再向服务端发起一条使用会话密钥加密的信息。
  8. 服务端收到后使用会话密钥解密,再返回一个会话密钥加密的信息,再双方收到后SSL的建立完成。(这个过程是对称加密)
  9. 之后就可以进行TCP三次握手连接…

9.localStorge,SessionStorage,cookie,session,token都是什么?

webStorage与cookie具体见如下链接:
https://blog.csdn.net/Y_ooo/article/details/124016849

下面介绍一下cookie,session,token
1)cookie
cookie是一种存储在浏览器的数据,目的是为了弥补http无状态的不足。客户端请求服务器,如果夫区其需要记录该用户的状态,就向客户端发送一个cookie,客户端会保存下这个cookie,等再次请求该网站时,会把cookie跟随请求一同提交过去,服务器会检查cookie并验证。
但是cookie有许多缺陷:容量缺陷(4kb),性能缺陷(无论用不用到,发送请求都会携带cookie),安全缺陷(容易被非法用户获取,尤其设置了http-only:false,xss攻击)

2)session
于是出现session的概念,session 存储在服务器。服务器给浏览器设置cookie,并且把随机会话标识sessionID加入到cookie中,并把会话结束时间设置为cookie的有效期,浏览器拿到cookie后进行保存。
但是出现了一个问题:服务器需要保存所有人的sessionID,这对服务器来说是一个巨大的开销。有时候可以使用session sticky、session复制、session集中存储,但无法完全解决问题。

3)token
如何服务器能既不存储这些sessionID,又能够验证客户端发来的sessionID是自己生成的呢?于是想到,服务器给客户端发送一个令牌token,里面包含了数据和使用密钥以及加密算法对数据做的签名,因为坏人不知道密钥,因此伪造不了token。等客户端再次请求服务端的时候把token一并带去,服务端使用加密算法和密钥对数据再进行一次签名,和token中的签名作比较就可以直到是否是该用户。这样可以使服务器无状态化验证。
注意:token中的数据是明文保存的(会使用Base64进行编码),因此不要在其中保存密码等敏感信息

10.什么是JWT?(Json Web Token)

JWT是token的一种具体实现方式,是将信息保存到一个Json字符串中,这个特殊的Json对象分为三部分:头部(header),负载(payload),签名(signature),三部分之间用.号分隔。

1)头部
头部承载两部分信息:

  1. 声明类型:"typ": "JWT"
  2. 声明加密的算法,默认HMAC SHA256算法:"alg": "HS256"

2)负载
负载就是存放有效信息的地方,由两部分组成:
3. 标准中注册的声明数据(建议但不强制):jwt签发者、jwt接收者、签发时间…
4. 自定义数据:存放想放在token中的key-value
这两部分都使用Base64编码。

3)签名
对上面两部分数据签名:通过服务端保存的密钥使用header里的加密算法Base64编码后的header和payload进行加密。
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

JWT每部分的作用:
当服务端收到客户端发来的JWT后:

  • header和payload可以使用Base64解码出原文,从header里获取加密算法payload中获取有效数据
  • signature由于使用了不可逆的加密算法,因此无法解析出原文,它的作用是校验token有没有被篡改

11.indexDB和localStorage区别?

  1. indexDB是一个运行在浏览器上的非关系型数据库,保存的数据比localStorage大得多。
  2. 且indexDB是异步操作,而localStroage是同步的。异步是为了防止大量数据的读写,拖慢网页的表现。而且indexDB支持事务。

12.http缓存有哪些?

http缓存分为强制缓存和协商缓存

什么是http缓存:当客户端请求服务器资源时会先查看浏览器缓存,如果浏览器有要请求资源的副本,则可以直接从中取出。常见的http缓存只能缓存GET请求的资源。http缓存都是从第二次请求开始的。

1)强制缓存

  1. 服务端在响应头中设置缓存的有效时间Cache-Control中的max-age属性或设置缓存的到期时间Expires
  2. 若缓存未失效,则客户端直接从浏览器缓存中读取资源。
  3. 若缓存已失效或缓存中没有所请求的资源,则向服务端请求资源。

与强制缓存相关的请求响应头:
Expires
响应头,是HTTP/1.0控制网页缓存的字段,代表服务器返回该请求结果缓存的到期时间。但如果当双方时区不同或双方有一方时间不准确,那么强制缓存会直接失效。因此现在很少使用。

Cache-Control(优先级高)
请求/响应头,在HTTP/1.1中,Cache-Control是重要的规则。
下面是它的一些属性:

  • max-age=xxx:缓存内容将在xxx秒后失效
  • public:所有内容都将被缓存(客户端和代理服务器都可缓存)
  • private:所有内容都只能被客户端缓存(Cache-Control的默认取值)
  • no-cache:客户端缓存内容,但是是否使用缓存则需要通过协商缓存来验证决定
  • no-store:所有内容都不会被缓存,既不用强制缓存也不用协商缓存

2)协商缓存
当浏览器加载资源时,没有命中强制缓存,这时候去请求服务器。请求服务器的时候会带着两个参数:If-None-Match(也就是响应头中的Etag),If-Modified-Since(也就是响应头中的Last-Modified),通过参数验证缓存是否失效是否是最新资源。若未失效是最新资源则服务器会给客户端返回304状态码,客户端可直接从浏览器缓存中拿数据;若失效或不是最新资源,则返回200状态码和最新资源和新的资源标识符

Etag要优先于Last-Modified:因为有时候编辑了文件,但文件内容并没有修改,或者是周期性地变化文件内容,这个时候用Last-Modified识别会让服务器重复发送资源。但是etag避免了这个问题,他是文件的唯一标识。但是last-modified仅仅记录了时间点,性能比etag高,etag记录的是哈希值,因此各有各的好处。

13.TCP和UDP有什么区别?

区别:

  1. 连接:TCP面向连接;UDP无连接。
  2. 可靠性:TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,但是不保证可靠交付。
  3. 服务对象:TCP连接只能点到点;UDP支持1-1,n-1,1-n,n-n交互通信。
  4. 首部开销:TCP首部开销大,占20字节;UDP首部开销小,只占8字节。(源端口号、目的端口号、数据长度、校验和)
  5. 拥塞控制、流量控制:TCP有拥塞控制和流量控制保证数据传输安全;UDP没有,网络拥塞时不会影响源主机发送效率。
  6. 面向:TCP面向字节流:面向字节流是以字节为单位发送数据,且一个数据包可以以字节大小拆分成多个数据包,TCP可以先将数据存放在缓存中等待数据到达一定大小再发送,也可以直接发送;UDP面向数据报文:UDP每次都需要发送固定长度的数据包,如果长度过长需要应用层协议主动将其进行裁剪。

应用场景:
TCP:要求通信数据完整性和准确性较高。如:文件传输、邮件发送与接收等。
UDP:对通信实时性要求高,对数据完整性要求相对较低。如:网络电话、网络视频,实时游戏等。
有时UDP比TCP更有优势:网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低。TCP内部为了实现可靠性,使用了复杂的算法和握手机制,难以修改,而且一旦发生丢包,TCP会将后续的包缓存起来,等待前面的包重传成功后再继续发送,延迟会越来越大。

14.TCP如何保证可靠传输的?

七点:校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制。

1)校验和
把每个数据段都当成一个16位的整数,将这些整数相加然后取反,得到校验和。发送方发送数据之前先计算校验和,接收方收到后使用同样的方法计算校验和,发送方发来的进行比较。

2)序列号
TCP传输时将每个字节的数据都进行了编号,序列号不仅仅有应答作用,还可以根据序列号对数据进行排序,并且去掉重复的数据。

3)确认应答
每次服务端接收到数据后,都会对客户端进行确认应答(ACK报文)以及确认序列号,说明数据已经到达,可以继续从哪开始发送下一个请求。

4)超时重传
由于确认应答机制,发送方每次发送数据都会等待接收方传来ACK报文,以此判断传输是否成功。如果迟迟没有收到接收方发来的ACK报文,那么就对刚刚发送的数据重发。

5)连接管理
指TCP连接断开需要进行三次握手四次挥手,这样的连接机制也保证了可靠传输。

6)流量控制
(发送端与接收端速度不匹配)
一个问题:如果发送方的发送速率太快,导致接收方的接收缓冲区被填满,这时候再继续传输数据就会造成大量的丢包,进而引起超时重传等一系列问题。
这时候TCP的流量控制机制可以解决这个问题,它会根据接收端的处理能力来决定发送端的发送速度。具体就是接收端将自己的接收缓存区大小放入TCP首部的窗口大小字段中,通过ACK报文发送给发送端。

具体实现:
滑动窗口:发送窗口,接收窗口
类似于一个窗口一样的东西,指的是一次批量的发送多少数据,用来告诉发送端可以发送数据的大小。

发送方的发送缓存内的数据有以下四类:

  • 已发送,已收到ACK
  • 已发送,未收到ACK(发送窗口)
  • 未发送,但允许发送(发送窗口)
  • 未发送,但不允许发送

接收方的接收缓存内的数据有以下三类:

  • 已接收
  • 未接收,但准备接收(接收窗口)
  • 未接收,不准备接收

7)拥塞控制
(由于网络自身拥塞,导致发送方速度被遏制)
为了避免在网络拥堵的情况下,发送方的发送速率过快导致拥堵加剧,因此采用拥塞控制方法控制发送方速度。

具体实现:
拥塞控制算法:慢开始、拥塞避免 & 快重传、快恢复

慢开始、拥塞避免:

  1. TCP的发送方会通过是否丢包(超时)来感知网络的拥塞程度。
  2. 发送方维护一个cwnd 拥塞窗口,其值取决于网络的拥塞程度,并且动态变化。(发送速率v=拥塞窗口cwnd/一次通信往返时间rtt)
  3. 首先维护一个慢开始阈值 ssthresh,拥塞窗口cwnd=1
  4. 当cwnd < ssthresh,使用慢开始算法,拥塞窗口cwnd成倍增加
    当cwnd >= ssthresh,使用拥塞避免算法,拥塞窗口逐次+1
  5. 拥塞窗口不断增大,一定最终会到达网络拥塞状态,发生超时。
  6. 此时慢开始阈值=当前拥塞窗口/2拥塞窗口置为1
  7. 继续使用慢开始,拥塞控制算法。

快重传、快恢复:
为了改进TCP性能引入。因为有时个别报文段在网络中丢失并不是因为网络发生拥塞,这个时候使用慢开始把拥塞窗口置为1,降低了传输效率。因此不等超时重传计时器超时再进行重传。

  1. 当接收方收到有序数据后,立刻发送确认报文。
  2. 若发生丢失,那么接收方就会重复确认最近接收到的有序的那个报文。
  3. 当发送方收到多余的3个连续的重复确认后,触发快重传机制,将丢失的报文段立刻重传。
  4. 此时阈值=当前拥塞窗口/2拥塞窗口=阈值 (省去慢开始过程),这个过程叫做快恢复
  5. 然后采用拥塞避免算法。

15.从浏览器输入url后都经历了什么?浏览器渲染页面的流程?

网络通信 & 页面渲染

1)网络通信:

  1. 在浏览器地址栏输入url域名
  2. 应用层DNS将域名解析为IP地址
  3. 浏览器向服务器发起tcp连接,三次握手建立连接
  4. 连接成功后,浏览器向服务器发送http请求,请求数据
  5. 服务器收到请求,将数据返回至浏览器

2)页面渲染

  1. 浏览器收到响应后,自上而下加载解析html以构建DOM树
  2. 解析html的过程中遇到外部引入的css,就向服务器请求CSS资源,并解析以构建CSSOM树,但此时不会影响DOM树的构建
  3. 解析html的过程中如果遇到script标签,就暂停构建DOM,将控制权转移给JS引擎,等js运行完毕后,浏览器再回到中断的地方恢复DOM构建。(JS文件也会导致CSSOM阻塞DOM构建:刚刚说过,本身CSSOM是不会阻塞DOM的构建,但是因为js可以更改样式,也就是可以更改CSSOM,而不完整的CSSOM是无法使用的,如果js想访问CSSOM并改变它的话,就要拿到完整的CSSOM。在这种情况下,浏览器会先下载和构建CSSOM,然后再执行js,最后再继续构建DOM)
  4. 将DOM和CSSOM树合并成渲染树render tree(渲染树里指挥包括需要显示的节点和样式,meta,display:none等节点就不会在里面显示)
  5. 进行布局layout和绘制paint

16.回流reflow和重绘repaint?

回流一定会引起重绘,但重绘不一定会引起回流。

1)回流
页面的布局发生变化时,浏览器需要重新计算各个节点的位置大小信息,这个过程就会发生回流。页面至少会进行一次回流,页面第一次加载的时候。
以下行为会引起回流:

  • 网页初始化时
  • DOM操作(元素增加、删除、移动)
  • 内容变化,包括表单域内文本改变
  • css属性改变(width,height,margin,padding…)
  • 激活css伪类
  • js获取layout属性值(offset,scroll,getComputedStyle…),因为浏览器需要通过回流计算最新值

2)重绘
指一个元素的外观发生了改变,背景颜色,文字颜色,边框颜色等,引起浏览器对页面一部分的重画,但是不引起页面布局的改变。

性能影响:
回流比重绘的代价更高。有时候仅仅回流单一的一个元素,它的父元素以及任何跟随它的元素也会产生回流。现代浏览器也对频繁的回流或重绘操作进行了优化:浏览器会维护一个队列,把会引起回流或重绘的操作放入队列,当到时间阈值或任务数量阈值后,就会清空队列进行一次批处理,这样就把多次回流重绘变成一次。

如何避免:

CSS:

  • 避免使用table布局(浏览器使用流式布局,对渲染树render tree的计算通常只需要遍历一次即可,但是table及其内部元素除外,他们需要多次计算)
  • 避免设置多层内联样式

JavaScript:

  • 避免频繁操作DOM,对于大量插入DOM的操作,可以使用文档片段documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。
  • 避免频繁操作样式,最好将样式列表定义为class,再一次性更改class属性。
  • 对于具有复杂动画的元素使用绝对定位,使它脱离文档流,避免引起父元素及后续其他元素的回流。

17.CDN缓存是什么?

CDN内容分发网络,原理就是采用更多的缓存服务器,布放在用户访问相对集中的网络。当用户访问网站时,使用全局负载技术,将用户的访问指向最近的缓存服务器上,由缓存服务器响应用户请求。CDN是部分内容的缓存,智能程度会比镜像服务器更高。

CDN流程

  1. 客户端在地址栏输入url后
  2. 本地DNS系统将域名解析权交给CDN专用DNS服务器
  3. CDN专用DNS服务器,会将CDN全局负载均衡设备的IP地址返回给客户端
  4. 客户端向CDN全局负载均衡设备发起请求
  5. CDN全局负载均衡设备根据用户IP地址以及用户请求的url,选择一台用户所属区域的缓存服务器
  6. CDN全局负载均衡设备会将这台缓存服务器的IP地址告诉客户端,客户端向其发送请求。
  7. 如果缓存服务器有用户想要的内容则响应,如果没有则向网站的源服务器请求内容。
  8. 源服务器将内容给缓存服务器,缓存服务器再发给用户,并根据用户自定义的缓存策略,判断是否要将内容缓存到服务器上

优点:

  • 加速网站的访问,物理距离缩短
  • 内容进行分发后,源服务器ip地址被隐藏,收到攻击概率会下降,而且也减少了源站的负载

18.DNS是什么?

DNS即域名系统,DNS的作用是将主机名转换成IP地址。

  • 一个由分层DNS服务器实现的分布式数据库:整个DNS系统由分布在全球各地的很多台DNS服务器组成,每台服务器都保存了部分的数据,这些数据可以让我们最终查到主机名对应的IP
  • 一个使得主机能够查询分布式数据库的应用层协议

DNS原理:
域名是一个拥有四个层级的层级结构:
www.baidu.com.root :主机名(三级域名).次级域名.顶级域名.根域名
DNS服务器有三种:根DNS服务器,顶级域DNS服务器,次级域DNS服务器。本地DNS服务器从根域名开始向下分级查询,依次访问根DNS服务器、顶级域DNS服务器、次级域DNS服务器,最终找到IP地址。

1)递归查询:主机向本地DNS服务器发出的查询,就是递归查询。
2)迭代查询:后续的三个查询都是迭代查询,请求都是由本地DNS服务器发出,所有响应都是直接返回给本地DNS服务器。

19.xss和csrf是什么,如何防范?(前端安全)

1)xss跨站脚本攻击
不需要任何的登录验证行为,他会通过合法的操作向你的页面注入脚本。大部分的xss漏洞都是由于没有处理好用户的输入,导致恶意脚本在浏览器中执行,从而实现盗取用户信息等操作。通常是为了获取用户的cookie。

反射型xss
又称非持久型xss。攻击者往往通过邮件等形式将包含xss代码的链接发送给用户,当用户点击时,服务器接受请求并处理,然后xss代码随着响应回传给用户,浏览器解析执行代码,触发xss漏洞。这个过程像反射一样。

存储型xss
又称持久型xss。攻击者在论坛、留言板等地方发帖,在其中嵌入xss攻击代码,帖子被目标服务器存储在数据库中。当其他用户进行正常访问时,数据库内容被读取,触发xss代码。这种攻击形式有更强的隐蔽性。

DOM型xss
与上面两者不同的是,DOM型xss不需要服务器的参与,触发xss靠浏览器的DOM解析,完全是客户端的事情。就是通过js代码来增添修改节点的值。

防御
xss漏洞是因为对用户提交的数据没有进行严格的过滤,因此防御策略就是对输入进行过滤,对输出进行编码

  1. xss Filter:只接受规定长度或内容的提交

    • 表单数据指定值类型:年龄只能是int
    • 过滤特殊html标签:<script>
    • 过滤js事件:onclick,onerror等
  2. html实体编码、转义:对用户输入的数据进行html实体编码,把字符转换成转义字符。
    • 空格的实体编号&nbsp
    • < 的实体编号&lt
    • 的实体编号&gt

    • / 转成/
    • \ 转成\
  3. 将cookie设置为http only,这样脚本就无法访问cookie,避免利用js的document.cookie获取。

2)csrf跨站点请求伪造
攻击者盗用了你的身份,以你的名义发送恶意请求,而对服务器来说这个请求是完全合法的,因此攻击者就可以达到想要的效果。
具体场景如下:用户访问受信任网站A,网站A产生cookie给浏览器;在用户未退出网站A之前,再访问恶意网站B,恶意网站B收到请求后返回给用户一些攻击代码,并发出请求要求访问网站A;浏览器收到攻击代码后,根据B的请求,用户就会在不知情的情况下携带cookie信息向网站A发出请求,但是网站A并不知道是B发的请求而认为是用户,所以会正常处理,这时恶意代码就会被执行。

防御

  1. 验证http头的Referer字段
    根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。

  2. 在请求地址或http头中添加token并验证
    CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

二、操作系统

1.进程和线程的区别

1)进程
OS资源分配的基本单位。是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是应用程序运行的载体。同时进程也是线程的容器。进程一般由程序、数据集合和进程控制块(PCB)三部分组成。

  • 程序用于描述进程要完成的功能,是控制进程执行的指令集
  • 数据集合是程序在执行时所需要的数据和工作区
  • 程序控制块(PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志

2)线程
OS调度和执行的最小单位,有时被称为轻量级进程。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
优点:

  1. 易于调用
  2. 提高并发性。进程可创建多个线程来执行同一程序的不同部分。
  3. 开销小。创建线程比创建进程要快,所需开销很少。在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

3)总结
根本区别:进程是OS资源分配的基本单位,而线程是OS调度和执行的最小单位
资源开销:同一个进程中的线程共享资源,线程之间切换的开销小,而进程切换开销大
依赖关系:线程依赖于进程执行,每个独立的进程有程序的入口和出口,线程必须在这里面执行

2.进程间通信的方式

  • 管道和命名管道:半双工通信,只能单向传输,管道可用于具有亲缘关系的父子进程间的通信,命名管道还允许无亲缘关系进程间的通信。
  • 信号:信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。
  • 消息队列:消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限的进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息。
  • 共享内存:最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
  • 信号量:进程之间及同一种进程的不同线程之间的同步和互斥手段
  • 套接字:这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

3.死锁

多个进程之间运行过程中因为争夺资源而造成的一种僵局

1)产生死锁的条件:(缺一不可)

  • 互斥:就是一个资源只能有一个进程占有,不可以被两个或者多个进程占有
  • 不可抢占:进程已经获得的资源在未使用完之前,不可以被抢占,只能在使用完之后自己释放
  • 请求和保持:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放自己已经占有的资源
  • 循环等待:发生死锁时,必定会形成一个进程资源的循环等待链。进程集合{p1,p2,p3}中,p1请求p2占有的资源,p2请求p3占有的资源,p3请求p1占有的资源。

2)预防死锁的办法

  • 资源一次性分配,不会有请求了(破坏请求)
  • 没有资源的进程才可以请求资源(破坏保持)
  • 可以剥夺资源(破坏不可抢占)

4.页置换算法

在程序运行的时候,若访问的页面不在内存而需要将其调入,但内存已无空闲空间的时候,从内存调出一页程序进入磁盘的对换区。

1)FIFO先进先出算法:置换出最早进入队列的页
2)OPT最优算法:一般用来评价其他算法,将将来最远用到的页置换出去
3)LRU最近最少使用算法:将最近最长时间未访问过的页置换出去

5.浏览器的多进程

前端面试计网、HTTP协议,操作系统(自留,持续更新)相关推荐

  1. 前端(js/css/html)那些小的知识点,持续更新......

    前端(js/css/html)那些小的知识点,持续更新...... 1.行内元素与块级元素有哪些及区别? 块级元素和行内元素的区别是,块级元素会占一行显示,而行内元素可以在一行并排显示.通过样式控制, ...

  2. 沉睡者 - 网赚创业VIP项目课程-持续更新中...

    沉睡者 - 网赚创业VIP项目课程-持续更新中... 不管在线下还是线上,都尽量只做有积累可持续的项目,否则就容易进入到一个找项目做项目死项目之后,不断重复找项目,不断重复做苦力没有发展的死循环. 在 ...

  3. Android面试计网面经大全【持续更新中。。。】

    前言 本篇文章为本人面试以及空闲时间整理的计网面试常见问题.供本人复习之用.分享给大家.大家可以评论补充哦! 因为面试常见问题一般都是网络层,传输层以及应用层.所以我就按自上而下的顺序,来分享 最后一 ...

  4. 计网 - HTTP 协议_强制缓存和协商缓存的区别

    文章目录 Pre 请求响应和长连接 HTTP 2.0 的多路复用 HTTP 方法和 RestFul 架构 HTTP 方法 缓存 强制缓存 协商缓存 总结 Pre 超文本传输协议(HyperText T ...

  5. 计网 - IPv4 协议:路由和寻址的区别是什么?

    文章目录 Pre 什么是 IP 协议? IP 协议的工作原理 分片(Fragmentation) 增加协议头(IP Header) "鱼和熊掌"不能兼得--延迟.吞吐量.丢包率 延 ...

  6. 【前端面试】04 HTTP协议

    本文笔记基于「千古壹号」的GitHub项目:https://github.com/qianguyihao/web 文章目录 1.考点 2.解决方法 2.1 主要特点 2.2 报文的组成部分 2.3 方 ...

  7. 计网 | PGP协议实验(邮件加密解密)

    一.实验目的 1.了解加密工具 PGP 的原理 2.熟悉 PGP 简单配置方法 二.实验环境 安装 PGP 加密软件:主机操作系统为 Windows 三.实验原理 PGP 加解密邮件的原理是什么? 公 ...

  8. 计网常用协议全称及对应端口号

    FTP(文件传输协议) 全称:File Tranfer Protocol 端口号:21(用于链接) 20(用于传输数据) SMTP(简单邮件传输协议) 全称:Simple Mail Transfer ...

  9. 计网--- ARP 协议

    ARP 协议 一. ARP 协议 ①. ARP协议介绍 ②. ARP分组的格式 ③. ARP 的工作原理 一. ARP 协议 ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题. ...

最新文章

  1. Arthritis Rheumatology:张烜+王军发表系统性红斑狼疮患者的肠道菌群变化
  2. My blog please navigate to http://hi.baidu.com/248828412
  3. 将功补过 树形动态规划
  4. 基于mini2440的看门狗(裸机)
  5. 在Centos上编译安装nginx
  6. Qt学习笔记-基于QGraphicsScene的填词游戏
  7. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
  8. opc服务器的时间怎么修改,OPC服务器是否允许在其逻辑中使用源时间戳?(Is OPC server allowed to use source timestamp in its logic?)...
  9. Touch Panel 调试技巧 01
  10. python怎么设置为中文-python如何设置中文界面
  11. uniAPP上架iOS商店踩到的坑(记录)
  12. 炼数成金《数据分析与SAS》课程
  13. 推荐几款视频声音变声软件给大家
  14. 大律法(OTSU法)
  15. function Function函数
  16. ljmp指令_51单片机主要汇编指令集
  17. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
  18. 在 Windows 中打开蓝牙设备
  19. 中科软测试面试题2019_中科软笔试题和面试题
  20. 一个程序员靠一段Java代码,在几小时之内就赚了500美元

热门文章

  1. 经典蓝牙Sniff Mode
  2. Flutter Clip剪裁组件
  3. 剑指offer第二版——面试题9(java)
  4. 如何配置网页端联系客服对话框
  5. 回家吃饭Android客户端整理后总结
  6. (16)打鸡儿教你Vue.js
  7. codefrces 1203 E. Boxers(贪心)
  8. day43_crud
  9. drupal7 模块介绍
  10. 网址包括HTML吗,html,http不是网址?我才发现URL才是真正的网址