==首先是解析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 状态。
==先看浏览器缓存中有没有ip地址,然后请求本地DNS服务器,本地DNS服务器查看自己的缓存中有没有,如果没有,本地DNS服务器向根域名服务器请求,根域名服务器会返回所查询的顶级域名服务器的地址,然后本地DNS服务器向顶级域名服务器发送请求,顶级域名服务器查询自己的缓存,如果有记录就返回结果给本地DNS服务器,如果没有就返回下一级权威域名服务器地址给本地DNS服务器。然后本地DNS服务器向权威域名服务器发起请求,权威域名服务器返回对应的结果,本地DNS服务器将返回结果返回给浏览器==
物理层(Physical Layer):
主要功能:处理物理媒介传输数据的细节。
作用:负责在物理媒介上传输原始比特流,包括电压、电流、光信号等。它定义了物理连接的特性,如电缆类型、传输速率和信号编码。
数据链路层(Data Link Layer):
主要功能:在直接连接的两个设备之间提供可靠的数据传输。
作用:将物理层提供的比特流分组成数据帧,并负责数据的错误检测和纠正。它还管理访问共享介质的方式,通常使用MAC地址来唯一标识设备。
网络层(Network Layer):
主要功能:实现数据包的路由和转发,为数据在不同网络之间的传输提供路径。
作用:负责逻辑寻址、数据包的路由选择和跨网络的数据传输。IP协议是网络层的代表。
传输层(Transport Layer):
主要功能:为端到端通信提供可靠的数据传输。
作用:负责数据的分段、错误检测和纠正,以及流量控制和拥塞控制。TCP(传输控制协议)和UDP(用户数据报协议)是传输层的代表。
会话层(Session Layer):
主要功能:建立、管理和终止会话(通信会话)。
作用:负责建立应用程序之间的会话,处理会话过程中的同步和控制。通常用于实现不同应用程序之间的数据交互。
表示层(Presentation Layer):
主要功能:数据格式转换、数据加密和解密。
作用:负责数据的编码、压缩、解码和解压缩,以确保数据在不同系统之间的兼容性。它还可以提供数据的安全性和加密。
应用层(Application Layer):
主要功能:为用户应用程序提供网络服务。
作用:这是用户与网络互动的层,提供各种应用和服务,如电子邮件、文件传输、远程登录、网页浏览等。应用层协议定义了应用程序之间的通信规则和数据格式。
OSI七层模型的优势在于将网络通信分解为更小的部分,使不同的协议和技术能够更容易地集成和协同工作。然而,在实际网络中,通常使用更简化的模型,如TCP/IP模型,它将OSI模型的七层合并为四个更大的层次。这种模型更符合实际应用,但OSI模型仍然是学习网络基础知识的有用框架。
三次握手:
==首先是客户端向服务器发送一个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-ACK):
服务器接收到客户端的请求后,确认并同样发送一个带有SYN标志位的数据包,以及ACK(确认)标志位,表示接收到了客户端的请求。
服务器也会选择一个随机的序列号(Server ISN),用于标识服务器发送的数据包。
此时,服务器会为客户端分配资源,并准备接收客户端发送的数据。
第三次握手(ACK):
客户端接收到服务器的响应后,向服务器发送一个带有ACK标志位的数据包,表示确认了服务器的响应。同时,客户端还会将之前选择的序列号加1,作为客户端数据包的序列号。
服务器接收到这个确认后,也将客户端的序列号加1,表示已准备好接收客户端的数据。
至此,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: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: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 删除。