以下是我个人面试收集的问题和回答。部分细节还需要大家去自己拓展,不喜欢可以喷
后期我会抽空自行补充
url 解析:
一个完整的URL解析要分为以下几步:1.url解析 2.缓存检查 3. DNS解析 4. 建立TCP链接 5. 发送HTTP请求 服务器处理 6. 关闭TCP连接通道 7. 客户端渲染。
首先dns解析IP,建立tcp链接下载资源,构建dom树,当遇到link标签,会下载并执行解析css(不会阻止dom树的构建)当遇到script标签的是,dom树构建会暂停,下载并执行完js才会继续(defer(下载延迟执行),async(异步下载并执行)) ,然后再布局和绘制(layout,paint),最后在 render 。
五层网络:
物理,链路,网络,运输,应用(会话层,表示层,应用层)
数据传输单位: 比特, 帧 , 分组(数据报) , 分段
http 短链接:
HTTP连接的寿命通常都很短。这样做的好处是,可以极大的减轻服务端的压力
http KEEPALIVE
keep-alive机制:若开启后,在一次http请求中,服务器进行响应后,不再直接断开TCP连接,而是将TCP连接维持一段时间。在这段时间内,如果同一客户端再次向服务端发起http请求,便可以复用此TCP连接,向服务端发起请求,并重置timeout时间计数器,在接下来一段时间内还可以继续复用。这样无疑省略了反复创建和销毁TCP连接的损耗。
一个网页中,可能引入了几十个js、css文件,上百张图片,
如果每请求一个资源,就创建一个连接,然后关闭,代价实在太大了
keep-alive 是客户端和服务端的一个约定,如果开启 keep-alive,则服务端在返回 response 后不关闭 TCP 连接;
同样的,在接收完响应报文后,客户端也不关闭连接,发送下一个 HTTP 请求时会重用该连接
TCP KEEPALIVE
链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。
TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。
1.如果主机可达,对方就会响应ACK应答,就认为是存活的。
2.如果可达,但应用程序退出,对方就发RST应答,发送TCP撤消连接。
3.如果可达,但应用程序崩溃,对方就发FIN消息。
4.如果对方主机不响应ack, rst,继续发送直到超时,就撤消连接。这个时间就是默认的二个小时。
http 与 tcp 区别:
1、TCP连接往往就是我们广义理解上的长连接,因为它具备双端连续收发报文的能力;开启了keep-alive的HTTP连接,也是一种长连接,但是它由于协议本身的限制,服务端无法主动发起应用报文。
2、TCP中的keepalive是用来保鲜、保活的;HTTP中的keep-alive机制主要为了让支撑它的TCP连接活的的更久,所以通常又叫做:HTTP persistent connection(持久连接) 和 HTTP connection reuse(连接重用)。
在TCP中有一个Keep-alive的机制可以检测死连接,原理很简单,TCP会在空闲了一定时间后发送数据给对方:
get和post
1、GET请求一般用去请求获取数据,
POST一般作为发送数据到后台时使用
2、GET请求刷新浏览器或回退时没有影响
POST回退时会重新提交数据请求
3、GET请求也可传参到后台,但是其参数在浏览器的地址栏的url中可见,所以隐私性安全性较差,且参数长度也是有限制的
POST请求传递参数放在Request body中,不会在url中显示,比GET要安全,且参数长度无限制
4、GET请求只能进行url编码(application/x-www-form-urlencoded)
POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码.
- get对用户可见的,post 不可见
- get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。post 支持标准字符集
请求头-accept:
Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档。如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型,例如 Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。
http 与 https:
http超文本传输协议,信息是明文传输
http 用80端口 https 用 443端口 https 支持 SSL加密传输协议
状态码
301永久重定向 302临时重定向,304 是缓存与请求资源相同未修改
303 资源在别的地址
401 身份认证验证 403 禁止访问 405 不允许的请求方法
501 服务端不支持的请求方法 502 是网关无响应 504 网关超时
503 服务器错误
区别:301重定向是页面永久性转移,表示为资源或页面永久性地转移到了另一个位置,搜索引擎在抓取新内容的同时也将旧的网址替换成
重定向之后的网址;
302是页面暂时性转移,示资源或页面暂时转移到另一个位置 ,搜索引擎会抓取新的内容而保存旧的网址并认为新的网址只是暂时的。
cookie,session,token
由于http的无状态性,为了使某个域名下的所有网页能够共享某些数据,session和cookie出现了
首先,客户端会发送一个http请求到服务器端。
服务器端接受客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie头部。
该头部包含了sessionId。Set-Cookie格式如下,具体请看Cookie详解
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
在客户端发起的第二次请求,假如服务器给了set-Cookie,浏览器会自动在请求头中添加cookie
服务器接收请求,分解cookie,验证信息,核对成功后返回response给客户端
token
用户登录,成功后服务器返回Token给客户端。
客户端收到数据后保存在客户端
客户端再次访问服务器,将token放入headers中
服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
token 也称作令牌,由uid+time+sign[+固定参数]
token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据
**存放**
token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于[数据库]中
ipv6
报文头部包含:
版本号 表示协议版本.值为6
流量等级 主要用于QoS
流标签 用来标识同一个流里面的报文
载荷长度 表明该IPv6包头部后包含的字节数,包含扩展头部
下一报头
跳数限制 该字段类似于IPv4中的[TTL]。每次转发跳数减一,该字段达到0时包将会被丢弃
源地址
目的地址
全双工,半双工
全双工
全双工(full-duplex)的系统允许二台设备间同时进行双向数据传输。一般的电话、手机就是全双工的系统,因为在讲话时同时也可以听到对方的声音。
半双工
半双工(half-duplex)的系统允许二台设备之间的双向数据传输,但不能同时进行。因此同一时间只允许一设备传送资料,若另一设备要传送资料,需等原来传送资料的设备传送完成后再处理。
局域网技术
令牌环网
光纤分布式数据接口FDDI(Fiber Distributed Data Interface)
广域网技术
综合业务数字网(ISDN)就是一种采用电路交换技术的广域网技术。
ATM,帧中继,SMDS以及X.25等都是采用包交换技术的广域网技术。
实现Web端即时通讯的方法:实
现即时通讯主要有四种方式,它们分别是轮询、长轮询(comet)、长连接(SSE)、WebSocket
短轮询的基本思路就是浏览器每隔一段时间向浏览器发送http请求,服务器端在收到请求后,不论是否有数据更新,都直接进行响应
缺点是显而易见的,这种方式由于需要不断的建立http连接,严重浪费了服务器端和客户端的资源
长轮询:
当服务器收到客户端发来的请求后,服务器端不会直接进行响应,而是先将这个请求挂起,然后判断服务器端数据是否有更新。
如果有更新,则进行响应,如果一直没有数据,则到达一定的时间限制(服务器端设置)才返回
明显减少了很多不必要的http请求次数,相比之下节约了资源。长轮询的缺点在于,连接挂起也会导致资源的浪费
长连接:
SSE最大的特点就是不需要客户端发送请求,可以实现只要服务器端数据有更新,就可以马上发送到客户端。
SSE的优势很明显,它不需要建立或保持大量的客户端发往服务器端的请求,节约了很多资源,提升应用性能。
并且后面会介绍道,SSE的实现非常简单,并且不需要依赖其他插件
webSocket:
该协议可以实现服务器与客户端之间全双工通信。简单来说,首先需要在客户端和服务器端建立起一个连接,这部分需要http。
连接一旦建立,客户端和服务器端就处于平等的地位,可以相互发送数据,不存在请求和响应的区别.保持链接不断开
WebSocket的优点是实现了双向通信
目前http协议已经发展到2.0阶段,支持长链接,断点续传,cache 缓存策略,多路复用,服务器推送等。
https相对于http更安全,增加了证书SSL加密,端口是433。
客户端SYN=1,Seq = x,服务端接受到后,服务端就知道了,有一个客户端要链接我,然后服务器就会开启一个TCP socket的端口,然后返回数据给前端也是SYN=1,SEQ=Y,ACK = x+1,客户端接受到后,在发一个seq,和ACK+1.主要是为了防止开启无用的链接,或者网络延迟丢包,服务器无法确定到底客户端有没有收到消息
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
为何需要长链接?
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
网友评论