计网面试总结(4.9)

前端面试终极复习题及答案

计算机网络

OSI七层模型、五层模型、四层模型

在这里插入图片描述

介绍一下TCP

TCP协议是一个传输层协议,特点是:1、面向连接(传输前要建立连接,传输完成断开连接);2、一对一(端点为socket套接字,即IP地址:端口);3、可靠传输(不重复、不丢失、按序到达);4、全双工(可同时双向通信);5、面向字节流。

TCP报文中有哪些内容?

TCP报文包括首部和数据部分。首部中包括了:源端口、目标端口、序号seq、确认号ack、数据偏移、ACK、PSH、FIN、SYN、窗口等内容。

TCP是怎么实现可靠传输的?

A向B传输一个数据的同时开始计时,B接收到后向A发送确认收到的消息。如果超出A预设的时间还未收到B传来的确认消息,则重传该数据。为了提高信道利用率,采用连续ARQ和累计确认的方式。TCP采用滑动窗口来传输数据。TCP两端都有一个发送窗口和一个接收窗口。接收窗口表示自己目前能接受的信息量,而发送窗口则由对方的接收窗口和确认号来构造。构造好发送窗口后,A就开始向B发送数据,并且在收到B的确认消息之前,发送过的消息还会保留在发送窗口内,以便丢失后重传。当收到B的确认消息后,确认的消息即无需再保留,窗口后移。

TCP缓存

TCP两端都有发送缓存和接收缓存。发送缓存:存放发送应用程序传送给发送方TCP准备发送的数据和发送了但未收到确认的数据;接收缓存:存放未被接收应用程序接收的数据和未按序到达的数据。

TCP的流量控制和拥塞控制

流量控制:A向B发送数据时必须考虑B的接收能力,即A根据B的接收窗口大小来确定自己的发送窗口大小。存在的问题:当B的接收窗口变为0,又增大时,A无法获取到这一变化,故而一直不发送数据。解决办法:发送一个探测报文段,然后B即会在发送确认消息时顺带发送自己的接收窗口大小。
拥塞控制:当网络资源需求量大于网络资源量时,就发生了网络拥塞。拥塞的征兆:定时器超时、3次重复ACK解决办法:慢开始、拥塞控制、快恢复、快重传。

TCP三次握手的过程及原因

三次握手用于建立TCP连接。第一次握手:A向B发送报文,报头中SYN=1(表示A要与B建立连接),seq=x(随机序号)。第二次握手:B向A发送的报文中,ack=x+1(确认号,表示同意A与B建立连接),seq=y(随机序号),SYN=1(表示B要与A建立连接),ACK=1(确认位)。第三次握手:A向B发送报文,ack=y+1(确认号,表示同意B与A建立连接),ACK=1(确认位)。
为什么要三次握手呢?按照谢希仁版《计算机网络》的解释,如果A向B发送的建立连接请求在网络中长时间滞留,该请求已失效,然后B却认为这是有效的,同意建立连接,并向A发送报文,而此时A不会理会B的请求,如此就会产生资源浪费。我的理解是,TCP连接是全双工的,所以A要与B建立连接,B也要与A建立连接,这两个连接都建立起来,才算是一个真正的TCP连接建立起来了。如果只有两次握手,那么只有A向B建立了连接,而B没有向A建立连接,故而不是完整的。

TCP四次挥手的过程及原因

四次挥手用于断开TCP连接。第一次挥手:当A向B传输完数据,想要断开连接时,A向B发送报文,其中FIN=1(表示A要与B断开连接),seq=u。第二次挥手:B向A发送报文,其中ACK=1(同意A与B断开连接),ack=u+1(确认号)。第三次挥手:当B也向A传输完数据时,B向A发送报文,其中FIN=1(表示B要与A断开连接),ACK=1,ack=u+1,seq=w。第四次挥手:A向B发送报文,其中ACK=1,ack=w+1。

HTTP报文由哪些部分组成?

HTTP分为请求报文(客户端)和响应报文(服务器)。请求报文包括:请求头、首部信息;响应报文包括响应头、首部信息、响应体。
请求头中包括请求方式、请求URL和HTTP版本;响应头中包括HTTP版本、状态码和状态简要说明。首部信息由一些键值对组成,给出了一些信息,诸如Date(通用首部,给出该报文发送时间信息)Accept(请求首部,给出客户端能接收的文档类型)Content-Type(实体首部,给出文档的类型)

HTTP首部分类?

通用首部(date)、通用缓存首部(cache-control);请求首部、accept首部、条件请求首部、安全请求首部、代理请求首部;响应首部:协商首部、安全响应首部;实体首部、内容首部、实体缓存首部

HTTP有哪些方法?

GET,用于向服务器请求信息。

HEAD,与GET类似,但是响应报文中没有实体。可以用来获取资源的部分信息,检测文档新鲜度等。
PUT,向服务器写入文档。
POST,向服务器传输信息,输入数据(如表单信息)。
TRACE。
DELETE,删除服务器中的资源。
OPTIONS,查看服务器所支持的请求方法。

GET和POST有哪些区别?

GET的功能是从服务器获取数据,POST的功能是向服务器写入数据。
GET将请求放在请求头中,而POST将请求放在实体中。
GET传输数据量有限制(不能大于2KB),POST传输数据较大。
GET不安全,POST较为安全。
GET请求参数会被保留在浏览器的历史记录中,而POST不会。

HTTP状态码

1xx:需进一步操作
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误

举几个状态码的例子

100 continue:请继续下一步操作,POST发送请求时,先发送header,服务器返回100状态码,然后POST再发送实体信息。
200 OK:成功。
301:永久重定向。
302:临时重定向。
301与302区别:302在下次发送请求时还会使用原来的URL。
304 NOT MODIFIED:未修改。
403 FORBIDDEN:访问被拒绝(无权访问)。
404 NOT FOUND:未找到资源。
500 :服务器错误

HTTP缓存

服务器响应时会在响应首部中包含Expires(绝对过期时间),Cache-Control: max-age=10(相对过期时间)、Last-Modified(上次更新时间)、Etag(可理解为资源的ID)。资源过期后,客户端再次请求时,会带上If-Modified-Since:上次更新时间 和 If-None-Match:资源标识。无更新时,服务器返回304,客户端继续使用本地缓存;更新后返回200。
强缓存和协商缓存:说白了在过期前是强缓存,过期后是协商缓存。强缓存相关的响应头:expires、cache-control:max-age;协商缓存相关的请求头和响应头:last-modified&if-modified-since、etag&if-none-match

HTTP安全

HTTP存在的安全问题:HTTP最大的问题是不安全:

  • HTTP是明文传输的,这就导致可能被他人获取传输的内容;
  • HTTP不能对对方的身份进行校验,所以也就存在被第三方冒充的风险;
  • HTTP不能对对方传来的数据进行完整性检验,所以存在被第三方劫持并替换内容的风险。
    而HTTPS的出现就是为了解决HTTP不安全的问题。针对以上三个问题,HTTP分别采取了三个办法:
  • 使用对称加密与非对称加密相结合的方式,对传输内容进行加密
  • 使用数字证书的方式,对对方的身份进行验证
  • 使用数字签名的方式,对对方传来的数据进行完整性验证,以防内容被第三方篡改、替换
    对称加密:加密、解密密钥相同的加密方式,缺点是不如非对称安全。
    非对称加密:所有人都可以拿到加密密钥(公钥),但是只有服务器自己有解密密钥(私钥),缺点是速度慢。
    目前的流行做法:使用非对称加密建立起一条安全通道,通过这条通道来交换临时的对称密钥,然后用对称密钥对后续数据进行加密。
    数字签名:A向B发送数据时会附带由摘要和私钥生成的数字签名,到达B后,B会验证该数字签名,如果对不上,说明发送者不是A,或者数据在传输中途被篡改。
    数字证书:由权威机构办法,可以用来验证服务器身份。
    HTTPS建立安全传输:在TCP三次握手之后,还要进行一次SSL握手:客户端发送可供选择的密码并请求证书;服务端发送选中的密码和证书;客户端发送保密信息并生成密钥;互相告知,开始加密。

跨域

什么是跨域
当一个网页去请求另一个网页的资源,并且他们的url的方案、域名、端口中任一不同,就是跨域。
为什么会出现跨域问题
主要是因为同源策略。同源策略会阻止一个“源”下的JavaScript程序请求另一“源”下的资源,这个举动是处于安全考虑。
解决方案
JSONP:原理:script标签内的跨域是不受同源策略限制的。过程:客户端动态插入script标签,执行请求;服务端返回数据和函数拼接成的字符串;客户端接受到后自动执行函数。缺点:只能执行GET请求;动态插入的脚本可能被注入恶意代码。
代理:原理:服务器之间请求数据不会受同源策略限制。过程:浏览器将请求发送给代理,代理向真正的服务器请求到数据后返回给浏览器。
CORS:对于简单请求和非复杂请求处理方式不同。简单请求是:方式为head,get,post;头信息不超过Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只限三个值)。对于简单请求,直接在头信息中加入Origin字段,用来说明该请求来自哪个源,服务器根据这个值决定是否同意该请求。如果不同意,响应中没有相应字段,xhr的onerror会捕获该错误,但是无法根据状态码判断,因为状态码可能是200。Access-Control-Allow-Origin: http://api.bob.com该字段为请求头中的Origin的值或*(全部)
Access-Control-Allow-Credentials: true 服务器允许携带cookie,默认为true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
非简单请求会使用Options方法进行预检。预检请求头中包括三个关键字段:Origin,Access-Control-Request-Methods和Access-Control-Request-headers。然后服务器响应,如果不同意该请求,会返回正常的响应报文,但是其中不包括cors相关的报头,从而触发xhr的onerror。如果同意,报文中中会包括头信息:Access-Control-Allow-Methods、Headers、Credentials、Max-Age。通过预检之后,之后的请求都跟简单请求一样。

XSS和CSRF攻击和防范

xss是跨站脚本攻击,分为反射型(非持久型)、存储型(持久型)、基于DOM型。防范方法:cookie设置HttpOnly,对于用户提交的内容进行过滤。
csrf是跨站请求伪造,借助用户的cookie,向服务器发起请求。防范方法:验证码、token、请求域名检查。

Cookie、LocalStorage 与 SessionStorage分别是什么?它们之间有什么区别?

Cookie是服务器保存在浏览器的一小段信息,浏览器在向服务器发送请求时会附带cookie。cookie应用场景:对话管理:保存登陆状态、购物车等信息;个性化;追踪。Cookie包括:键、值、到期时间、所属域名、生效路径。
Cookie的生成和发送:服务器向浏览器发送HTTP回应时,在头信息中放置Set-Cookie字段;浏览器向服务器发送HTTP请求时会携带cookie信息,在请求头中放置Cookie字段。
Cookie属性:Expires:失效的绝对时间;Max-Age:失效的相对时间;Domain:指定浏览器发送请求时,哪些域名要携带该cookie;Path:指定浏览器发送请求时,哪些路径要携带该Cookie;Secure:只有在HTTPS协议下才能发送该cookie;HttpOnly:不允许JavaScript捕获该cookie。
Storage接口用于脚本在浏览器中保存数据,保存的数据以键值对方式存在。与cookie的区别在于:存储空间的大小,Cookie只有4KB的空间,而Storage视浏览器而定,大概在2~10MB。与Cookie一样受同源策略限制,跨域操作会报错。LocalStorage和SessionStorage区别在于数据保留时间:SessionStorage用于浏览器的一次会话,会话结束后数据就会被清空;而LocalStorage保存的数据长期存在,下次访问网页,网页即可直接读取其中的数据。
Storage接口的属性和方法
Storage.Length:返回Storage保存的数据项个数。
Storage.setItem(‘key’,‘value’),
Storage.getItem(‘key’),
Srorage.removeItem(‘key’),
Storage. Clear(),
Storage. Key(Index)
Storage事件

window.addEventListener('storage', onStorageChange);

onStorageChange函数接收一个event实例对象作为参数,该对象是SrorageEvent的实例,有几个特有的只读属性:key、newValue、oldValue、storageArea、url。事件的特点:不在当前页面触发,而是同一域名下的其他页面触发,所以可以作为页面之间通信的一种手段。

session、token和cookie

cookie原理见上一条。sesion是放在服务器端的、用来验证客户端身份的信息。服务器返回响应时,会发送特殊的cookie给客户端,并在服务器端创建一个独有的session。当客户端之后再发起请求时,服务器会根据客户端发送的cookie,进行session检查,以验证客户端的身份。session与cookie的区别在于session存储在服务器端,cookie存储在客户端,所以session更加安全,存储容量更大,但是会影响服务器性能。所以通常的做法是重要信息存储在session,其他信息存储在cookie。
token:服务器利用特定的内容、客户端信息和时间戳生成一段信息发送给客户端,当客户端再次发送请求时携带该信息,服务器根据客户端信息再次生成token,与原先token对比。

Ajax

Ajax :JavaScript发起HTTP通信,称为Ajax。Ajax步骤:创建XMLHTTPRequest实例;发起HTTP请求;接收服务器传回的数据;更新网页数据。

JavaScript

V8引擎的垃圾回收机制

引用计数,标记清除

闭包

闭包是指一个函数中引用了另一个函数中的变量。实现闭包的方式:在A函数中定义一个函数B,一个变量C,并且B中引用了C,就产生了闭包。闭包的作用:抽象讲,可以延长变量的声明周期,可以让外部操作函数内的变量。具体来看,可以利用闭包来实现模块化编程。缺点:如果不及时清除闭包,可能产生内存泄漏。

let和const

特点:1、块级作用域;2、没有变量提升;3、暂时性死区;4、不允许重复声明。
const:声明一个常量。但是对于复杂数据类型来说,const声明的变量只是保存一个指针,故其中的数据还是可变的。
块级作用域的作用:匿名函数自调用变得没有必要了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值