前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

八股

原创
作者头像
橘子又加强了么
修改2023-10-11 13:32:44
3160
修改2023-10-11 13:32:44
举报
文章被收录于专栏:小姚的后端记录

八股

浏览器输入网址到看到结果的全过程

==首先是解析url,然后进行缓存判断,判断请求的资源在不在缓存中,如果在缓存中且没有失效,就直接使用,否则就要向服务器发起请求。然后进行DNS解析,为了获得输入的url的ip地址。当获取到ip地址后,进行数据传输还需要使用ARP协议获取MAC地址,然后进行TCP连接,TCP3次握手,然后进行HTTPS握手,当页面请求发送到服务器端后,服务器返回一个HTML文件给客户端,然后浏览器渲染网页页面。==

(1)解析URL: 首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。

(2)缓存判断: 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。

(3)DNS解析: 下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。

(4)获取MAC地址: 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。

(5)TCP三次握手: 下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向服务器端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。

(6)HTTPS握手: 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。

(7)返回数据: 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。

(8)页面渲染: 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。

(9)TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。

DNS执行过程

==先看浏览器缓存中有没有ip地址,然后请求本地DNS服务器,本地DNS服务器查看自己的缓存中有没有,如果没有,本地DNS服务器向根域名服务器请求,根域名服务器会返回所查询的顶级域名服务器的地址,然后本地DNS服务器向顶级域名服务器发送请求,顶级域名服务器查询自己的缓存,如果有记录就返回结果给本地DNS服务器,如果没有就返回下一级权威域名服务器地址给本地DNS服务器。然后本地DNS服务器向权威域名服务器发起请求,权威域名服务器返回对应的结果,本地DNS服务器将返回结果返回给浏览器==

  • 首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步
  • 将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
  • 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
  • 本地DNS服务器向顶级域名服务器发送请求,接受请求的服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回相关的下一级的权威域名服务器的地址
  • 本地DNS服务器向权威域名服务器发送请求,域名服务器返回对应的结果
  • 本地DNS服务器将返回结果保存在缓存中,便于下次使用
  • 本地DNS服务器将返回结果返回给浏览器

OSI七层模型介绍,各层作用

物理层(Physical Layer):

主要功能:处理物理媒介传输数据的细节。

作用:负责在物理媒介上传输原始比特流,包括电压、电流、光信号等。它定义了物理连接的特性,如电缆类型、传输速率和信号编码。

数据链路层(Data Link Layer):

主要功能:在直接连接的两个设备之间提供可靠的数据传输。

作用:将物理层提供的比特流分组成数据帧,并负责数据的错误检测和纠正。它还管理访问共享介质的方式,通常使用MAC地址来唯一标识设备。

网络层(Network Layer):

主要功能:实现数据包的路由和转发,为数据在不同网络之间的传输提供路径。

作用:负责逻辑寻址、数据包的路由选择和跨网络的数据传输。IP协议是网络层的代表。

传输层(Transport Layer):

主要功能:为端到端通信提供可靠的数据传输。

作用:负责数据的分段、错误检测和纠正,以及流量控制和拥塞控制。TCP(传输控制协议)和UDP(用户数据报协议)是传输层的代表。

会话层(Session Layer):

主要功能:建立、管理和终止会话(通信会话)。

作用:负责建立应用程序之间的会话,处理会话过程中的同步和控制。通常用于实现不同应用程序之间的数据交互。

表示层(Presentation Layer)

主要功能:数据格式转换、数据加密和解密。

作用:负责数据的编码、压缩、解码和解压缩,以确保数据在不同系统之间的兼容性。它还可以提供数据的安全性和加密。

应用层(Application Layer):

主要功能:为用户应用程序提供网络服务。

作用:这是用户与网络互动的层,提供各种应用和服务,如电子邮件、文件传输、远程登录、网页浏览等。应用层协议定义了应用程序之间的通信规则和数据格式。

OSI七层模型的优势在于将网络通信分解为更小的部分,使不同的协议和技术能够更容易地集成和协同工作。然而,在实际网络中,通常使用更简化的模型,如TCP/IP模型,它将OSI模型的七层合并为四个更大的层次。这种模型更符合实际应用,但OSI模型仍然是学习网络基础知识的有用框架。

TCP三次握手四次挥手

三次握手

==首先是客户端向服务器发送一个SYN标志位为1,初始序号seq=x的数据包,服务器收到之后,进行确认,同样然后发送一个SYN标志位为1,ACK标志位为1,确认号ack为x+1,初始序号为seq=y的数据包,然后客户端收到服务器的响应之后,向服务器发送一个ACK标志为1,ack确认号为y+1,同时序列号为x+1的数据包,此时可以携带数据。这样三次握手就完成了。==

四次挥手:

==客户端首先发送一个FIN标志位为1的数据包给服务器,表示自己要结束连接了,然后进入fin_wait_1状态,然后服务端返回ACK标志位的数据包,确认收到了对方的关闭请求,然后进入closewait状态。这是服务器还可以向客户端发送数据。当服务器也要结束连接的时候,它也向客户端发送一个FIN标志位为1的数据包,表示自己数据发送完了,要结束连接,然后进入lsat_ack状态,然后客户端接收到后发送一个ACK标志位的数据包,确认收到了请求,然后服务器进入time wait状态,等待两倍的报文段寿命,然后关闭链接。同时客户端也从fin wait 1状态变为time wait状态,等待一段时间后,关闭连接。==

第一次握手(SYN):

客户端向服务器发送一个特殊的TCP数据包,其中包含SYN(同步)标志位,以请求建立连接。

此时,客户端选择一个随机的序列号(Client ISN),用于标识客户端发送的数据包。

  • 同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号

第二次握手(SYN-ACK):

服务器接收到客户端的请求后,确认并同样发送一个带有SYN标志位的数据包,以及ACK(确认)标志位,表示接收到了客户端的请求。

服务器也会选择一个随机的序列号(Server ISN),用于标识服务器发送的数据包。

此时,服务器会为客户端分配资源,并准备接收客户端发送的数据。

  • 确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y

第三次握手(ACK):

客户端接收到服务器的响应后,向服务器发送一个带有ACK标志位的数据包,表示确认了服务器的响应。同时,客户端还会将之前选择的序列号加1,作为客户端数据包的序列号。

服务器接收到这个确认后,也将客户端的序列号加1,表示已准备好接收客户端的数据。

  • 确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号

至此,TCP三次握手完成,连接建立成功。此后,客户端和服务器之间可以开始进行双向通信。三次握手的目的是确保双方都已准备好通信,同时在连接建立之前进行双方的序列号同步,以确保数据包按顺序传递且不会被重复接收。如果在握手过程中有任何一方未能收到确认,它将重新发送请求,直到连接建立成功或达到最大尝试次数。这样可以提高连接的可靠性和稳定性。

为什么不能是两次握手:

如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源

四次挥手

第一次挥手(FIN):

客户端或服务器中的一方(通常是客户端)决定不再向对方发送数据,并发送一个带有FIN(结束)标志位的TCP数据包,以表示它的数据发送完毕。

这一方的数据发送完成后,进入FIN_WAIT_1状态,等待对方的确认。

第二次挥手(ACK):

接收到第一次挥手的一方接着发送一个ACK(确认)标志位的数据包,以确认收到了对方的结束请求。

在这个阶段,接收到第一次挥手的一方仍可以向对方发送数据,进入CLOSE_WAIT状态。

第三次挥手(FIN):

当接收到第一次挥手的一方确定不再向对方发送数据时,它也会发送一个带有FIN标志位的数据包,以表示它的数据发送完毕。

然后,它进入LAST_ACK状态,等待对方的确认。

第四次挥手(ACK):

最后,接收到第三次挥手的一方发送一个ACK标志位的数据包,以确认收到了对方的结束请求。

接收到第四次挥手的一方进入TIME_WAIT状态,等待一段时间(通常为2倍的最大报文段寿命,以确保所有可能的数据包都已传递完毕),然后关闭连接。

同时,发送第一次挥手的一方从FIN_WAIT_1状态进入TIME_WAIT状态,也等待一段时间后关闭连接。

TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代表不能再向对方发送数据,连接处于的是半释放的状态。

最后一次挥手中,客户端会等待一段时间再关闭的原因,是为了防止发送给服务器的确认报文段丢失或者出错,从而导致服务器 端不能正常关闭

http,https区别

安全性:

HTTP:HTTP是不安全的协议,传输的数据是明文的,容易受到窃听和中间人攻击的威胁。这意味着在HTTP连接上传输的敏感信息(如用户名和密码、信用卡号)可能会被恶意用户截获。

HTTPS:HTTPS通过使用SSL/TLS协议对数据进行加密,以确保传输的数据是加密的。这使得数据更难以被窃听和篡改,提供了更高的安全性。HTTPS通常用于安全交易、登录和敏感数据传输的场景。

加密方式:

HTTP:HTTP不提供数据加密机制,数据以明文形式传输。

HTTPS:HTTPS使用SSL/TLS加密协议来对数据进行加密和解密。这种加密可以使用不同的加密算法,包括RSA、AES等,以确保数据的隐私和完整性。

端口号:

HTTP:HTTP默认使用端口80进行通信。

HTTPS:HTTPS默认使用端口443进行通信。当您在浏览器中访问一个HTTPS网站时,浏览器会自动连接到443端口。

证书认证:

HTTP:HTTP不涉及服务器身份验证,因此不提供任何方式来验证您连接的服务器是否是您预期的服务器。

HTTPS:HTTPS使用数字证书来验证服务器的身份。这些证书由受信任的证书颁发机构(CA)签发,可以确保您连接的服务器是合法的,从而防止中间人攻击。

性能:

HTTP:由于不涉及加密和证书验证等额外的过程,HTTP通常比HTTPS更快,因此在某些场景下,如静态内容传输,HTTP可能更适合。

HTTPS:HTTPS的数据加密和证书验证会增加一些处理开销,可能导致轻微的性能损失。但是,随着硬件和协议优化的进步,这种性能差距在很大程度上被减小。

HTTP和HTTPS之间的主要区别在于安全性和数据加密。HTTPS用于需要保护敏感信息的情况,例如在线支付、登录和个人信息传输。而HTTP通常用于不涉及敏感数据的一般数据传输。在选择使用哪种协议时,需要根据应用程序的需求和安全性要求做出权衡。

cookie和session

存储位置:

Cookie:Cookie是存储在客户端(用户浏览器)的小型文本文件。每次请求都会将Cookie发送到服务器,从而在客户端和服务器之间传递数据。

Session:Session是存储在服务器端的数据对象。每个会话都有一个唯一的标识符(通常是一个会话ID),该标识符存储在Cookie中或通过URL重写传递给客户端,以便将来的请求可以与正确的会话关联。

数据类型:

Cookie:Cookie只能存储文本数据,通常用于存储小量的用户信息,如用户ID、首选语言或会话令牌。

Session:Session可以存储各种数据类型,包括对象和复杂数据结构。因此,它更适合存储较大或复杂的数据,如购物车内容或用户登录状态。

存储容量:

Cookie:每个Cookie通常限制在4KB左右的存储容量。因此,Cookie适用于小量数据。

Session:服务器上的Session对象通常可以存储更大的数据,取决于服务器的配置。这使得它适合存储大量或复杂的数据。

安全性:

Cookie:Cookie存储在客户端,因此可能受到一些安全风险,如Cookie被窃取或篡改。可以通过设置Cookie的属性来增加安全性,如将Cookie标记为HTTP Only,以防止客户端脚本访问它。

Session:Session存储在服务器上,因此通常更安全。但是,仍然需要注意会话劫持和会话固定等攻击。

生命周期:

Cookie:Cookie可以具有不同的生命周期,可以在浏览器会话期间保持,也可以在过期之前持久保存。这由设置Cookie时的属性决定。

Session:Session通常在客户端关闭时结束(会话结束)。但是,也可以配置为在一段时间内保持活动状态,即使客户端关闭。

服务器负担:

Cookie:由于每次请求都会带有Cookie数据,因此它可能会增加服务器的负载,尤其是在大量并发请求的情况下。

Session:Session数据存储在服务器上,客户端只包含一个标识符。因此,Session对服务器的负载影响较小。

综上所述,Cookie和Session都有各自的用途和优势。Cookie适用于小型文本数据和客户端状态管理,而Session适用于存储更大、更复杂的数据和服务器端状态管理。选择哪种机制取决于应用程序的需求和安全性考虑。通常,在Web应用程序中,Cookie和Session经常一起使用,以实现不同层次的状态管理

进程和线程区别

从本质上说,进程和线程都是 CPU 工作时间片的一个描述:

进程描述了 CPU 在运行指令及加载和保存上下文所需的时间,放在应用上来说就代表了一个程序。

线程是进程中的更小单位,描述了执行一段指令所需的时间。

一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。

进程和线程之间的关系

出错:进程中的任意一线程执行出错,都会导致整个进程的崩溃

通信:线程之间共享同一进程中的数据,而进程通信需要借助 进程间通信

资源:进程是资源分配的最小单位,线程是CPU调度的最小单位。

调度:进程切换比线程切换的开销要大。线程是CPU调度的基本单位,线程的切换不会引起进程切换,但某个进程中的线程切换到另一个进程中的线程时,会引起进程切换

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 八股
    • 浏览器输入网址到看到结果的全过程
      • DNS执行过程
        • OSI七层模型介绍,各层作用
          • TCP三次握手四次挥手
            • http,https区别
              • cookie和session
                • 进程和线程区别
                相关产品与服务
                多因子身份认证
                多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档