TCP/IP模型和OSI模型?
TCP/IP:应用层、传输层、网络层、网络接口层
OSI:应用层、表示层、会话层、传输层、网络层、数字链路层、物理层
从输入url到页面展示发生了什么?
当你在浏览器中输入一个URL并按下回车键时,以下是发生的一系列步骤:
-
解析URL:浏览器首先解析URL,确定协议(如HTTP或HTTPS)、域名、端口(如果指定)和路径。
-
DNS查询:浏览器需要将域名解析为IP地址。这通常通过DNS(域名系统)完成。如果浏览器缓存中已有该域名的IP地址,则直接使用,否则向DNS服务器发起查询。
-
建立连接:一旦获得IP地址,浏览器尝试与服务器建立TCP连接。这通常涉及三次握手过程。
-
发送HTTP请求:连接建立后,浏览器发送一个HTTP或HTTPS请求到服务器。这个请求包括请求方法(如GET或POST)、请求的资源路径、HTTP版本和其他HTTP头信息。
-
服务器处理请求:服务器接收到请求后,根据请求的资源路径找到相应的资源,并处理请求。如果是动态内容,服务器可能需要执行一些脚本或程序来生成响应内容。
-
发送响应:服务器将处理结果作为HTTP响应发送回浏览器。响应包括状态码(如200表示成功)、响应头信息和响应体(即请求的资源内容)。
-
浏览器渲染页面:
- 解析HTML:浏览器开始解析HTML文档,构建DOM(文档对象模型)树。
- CSS样式应用:浏览器解析CSS并将样式应用到DOM元素上,构建CSSOM(CSS对象模型)。
- 构建渲染树:结合DOM和CSSOM,浏览器构建渲染树。
- 布局:浏览器计算渲染树中每个节点的几何信息,即它们在页面上的位置和尺寸。
- 绘制:浏览器将渲染树中的节点绘制到屏幕上。
-
加载资源:浏览器可能会请求页面中的其他资源,如图片、JavaScript文件、CSS文件等,并重复上述过程。
-
执行JavaScript:如果页面包含JavaScript,浏览器会解析并执行脚本。这可能会修改DOM或CSSOM,从而触发重新渲染。
-
页面交互:页面加载完成后,用户可以与页面交互,浏览器会相应地更新页面。
HTTP请求报文和响应报文是怎样的?
HTTP请求报文:
-
请求行:包含请求方法、请求的资源URI(统一资源标识符)、HTTP版本。
- 格式:
Method /uri HTTP/1.1
- 格式:
-
请求头:包含一系列的键值对,提供关于请求的附加信息,如用户代理、接受的媒体类型等。
- 示例:
Host: www.example.com、User-Agent: Mozilla/5.0、Accept: text/html
- 示例:
-
空行:请求头和请求体之间的空行,表示请求头的结束。
-
请求体(可选):对于某些请求方法(如POST或PUT),请求体包含要发送给服务器的数据。
HTTP响应报文:
-
状态行:包含HTTP版本、状态码和状态消息。
- 格式:
HTTP/1.1 200 OK
- 格式:
-
响应头:类似于请求头,包含关于响应的附加信息,如内容类型、内容长度等。
- 示例:
Content-Type: text/html; charset=UTF-8、Content-Length: 1234
- 示例:
-
空行:响应头和响应体之间的空行,表示响应头的结束。
-
响应体:服务器返回的数据,可以是HTML文档、图片、JSON数据等。
HTTP的请求方式有哪些?
GET、POST、DELETE、PUT、HEAD
GET请求和POST请求的区别?
安全性:
GET请求的参数通过URL传递,暴露在浏览器地址栏中,因此不适合传递敏感信息。
POST请求的参数包含在请求体中,不会显示在浏览器地址栏,相对更安全。
数据大小限制:
GET请求由于参数包含在URL中,受到URL长度限制,因此不适合传输大量数据。
POST请求的数据包含在请求体中,可以传输更大的数据量。
幂等性:
GET请求是幂等的,意味着多次执行相同的GET请求,资源的状态不会改变。
POST请求不是幂等的,多次执行相同的POST请求可能会产生不同的结果,例如多次提交表单数据。
缓存:
GET请求可以被浏览器缓存,这意味着相同的GET请求可能会从缓存中读取数据,而不是每次都从服务器获取。
POST请求默认不会被缓存,每次提交都需要与服务器交互。
书签和历史记录:
GET请求可以被保存为书签或作为历史记录,因为其参数包含在URL中。
POST请求不能被保存为书签或作为历史记录,因为其参数不在URL中。
用途:
GET请求通常用于请求数据,例如获取网页或查询信息。
POST请求通常用于提交数据,例如表单提交或上传文件。
编码类型:
GET请求的参数通常使用URL编码,对特殊字符进行编码。
POST请求的参数可以是表单数据(application/x-www-form-urlencoded)、JSON(application/json)、XML(application/xml)等格式。
网络请求方式:
GET请求通常用于简单的数据检索,对服务器的负载较小。
POST请求用于数据提交和更新,可能会引起服务器状态变化,对服务器的负载可能较大。
HTTP请求中常见的状态码?
| 类型 | 常见状态码 | 具体说明 | |
|---|---|---|---|
| 1xx(信息性状态码) | 100 | 继续.客户端应继续其请求。 | |
| 101 | 切换协议。服务器根据客户端的请求切换到不同的协议。 | ||
| 2xx(成功状态码) | 200 | 请求成功。一般用于GET和POST请求。 | |
| 201 | 已创建。成功请求并创建了新的资源 | ||
| 202 | 已接受。服务器已接受请求,但尚未处理完成。 | ||
| 204 | 无内容。服务器成功处理了请求,但没有返回任何内容。 | ||
| 3xx(重定向状态码) | 300 | 多种选择。请求的资源有多个选项。 | |
| 301 | 永久移动。资源已被永久移动到新的URL。 | ||
| 302 | 找到。资源临时移动到另一个URL。 | ||
| 303 | 查看其他。建议客户端使用GET方法获取指定的资源。 | ||
| 304 | 未修改。如果资源未改变,则用于重定向GET请求。 | ||
| 307 | 临时重定向。资源临时移动到另一个URL,请求方法不变。 | ||
| 308 | 永久重定向。资源已被永久移动到另一个URL,请求方法不变。 | ||
| 4xx(客户端错误状态码) | 400 | 错误请求。请求有语法错误或请求无法处理。 | |
| 404 | 未找到。请求的资源不存在。 | ||
| 5xx(服务器错误状态码) | 503 | 服务不可用。服务器暂时无法处理请求 |
什么是强缓存和协商缓存?
强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少服务器的负载和提高网页的加载速度。以下是它们的定义和区别:
强缓存(HTTP 1.0/1.1中的Expires和Cache-Control)
强缓存是一种HTTP缓存策略,浏览器在没有与服务器通信的情况下,可以直接从本地缓存中读取数据。如果资源在强缓存期内,浏览器不会发送请求到服务器,即使资源的URL发生了变化。
协商缓存(HTTP 1.1中的ETag和Last-Modified)
协商缓存是一种需要与服务器通信的HTTP缓存策略。当资源的缓存过期后,浏览器会发送请求到服务器,询问资源是否被修改过。如果资源未被修改,服务器会返回304状态码,告诉浏览器使用本地缓存的资源。
区别:
- 无需通信:强缓存不需要与服务器通信,直接使用本地缓存的资源。
- 需要通信:协商缓存需要与服务器通信,以确定资源是否被修改。
- 过期时间:强缓存依赖于过期时间或最大年龄,协商缓存依赖于资源的版本或最后修改时间。
- 适用场景:强缓存适用于不经常变化的资源,协商缓存适用于可能会更新的资源。
HTTP1.0和HTTP1.1的区别?
| HTTP/1.0 | HTTP/1.1 | |
|---|---|---|
| 持久连接 | 默认情况下,每个TCP连接只发送一个请求和响应。发送数据后,连接就关闭了。可以通过Connection: keep-alive头部来启用持久连接。 | 默认启用持久连接(也称为连接复用),一个TCP连接可以被用来发送多个HTTP请求和响应,减少了连接建立和关闭的开销。 |
| 管道化 | / | 支持请求管道化,即在第一个请求响应到达之前,就可以发送多个请求。这可以减少连接建立的时间,提高效率。 |
| 缓存处理 | 使用Pragma头部来处理缓存,功能有限 | 引入了新的Cache-Control头部,提供了更丰富的缓存控制指令,如no-cache、no-store、max-age等。 |
| 分块传输编码 | 不支持分块传输编码 | 支持分块传输编码,允许服务器分批次发送响应体,客户端可以逐步接收和处理数据,适用于大数据量的传输。 |
| Host头部 | 没有Host头部 | 增加了Host头部 |
| 范围请求 | / | 支持范围请求,允许客户端请求资源的一部分 |
HTTP1.1和HTTP2.0的区别?
| HTTP/1.1 | HTTP/2.0 |
|---|---|
| 使用文本格式传输数据 | 用二进制格式 |
| 存在队头阻塞问题,即在一个TCP连接中,请求和响应需要排队等待,前一个请求的完成是发送下一个请求的前提。 | 通过多路复用技术,允许在单个TCP连接上并行传输多个请求和响应,从而减少了延迟,提高了连接的利用率. |
| 不支持头部压缩 | 支持头部压缩 |
| 服务器只能响应客户端明确请求的资源 | 许服务器主动推送资源到客户端,这有助于提前加载资源,减少页面加载时间 |
| 主要使用明文传输,安全性较差 | 认使用TLS加密传输数据,提高了安全性 |
HTTP3.0?
它基于QUIC协议,运行在UDP之上。
特点:减少连接建立时间;解决队头阻塞问题;连接迁移;改进的拥塞控制;安全性;多路复用;抗拥塞控制;0-RTT连接建立。
HTTP和HTTPS的区别?
它们之间的主要区别在于安全性和数据传输的方式:
-
安全性:
- HTTP:是明文传输协议,在传输过程中,数据未经加密,可能会被截获和篡改。
- HTTPS:在HTTP的基础上加入了SSL/TLS协议,提供了数据加密、完整性校验和身份验证,确保数据传输的安全性。
-
端口:
- HTTP:默认使用80端口。
- HTTPS:默认使用443端口。
-
连接建立:
- HTTP:使用TCP三次握手建立连接,之后就可以开始数据传输。
- HTTPS:除了TCP三次握手,还需要进行SSL/TLS握手过程,包括密钥交换、证书验证等,以建立加密的通信链路。
-
性能:
- HTTP:由于没有加密和解密的步骤,通常性能较高。
- HTTPS:由于加密和解密的处理,可能会消耗更多的计算资源,导致性能略低于HTTP。
-
用途:
- HTTP:适用于一般性的网页浏览,如浏览新闻、查看公开信息等。
- HTTPS:适用于需要保护用户隐私和数据安全的场合,如网上银行、在线支付、登录认证等。
-
浏览器显示:
- HTTP:浏览器地址栏显示普通的“http://”。
- HTTPS:浏览器地址栏显示“https://”,并可能伴有锁形图标,表示连接是安全的。
-
搜索引擎优化( SEO ) :
- 使用HTTPS的网站可能会获得搜索引擎的优先排名,因为搜索引擎倾向于推广安全的网络环境。
-
证书需求:
- HTTP:不需要证书。
- HTTPS:需要从证书颁发机构(CA)获取SSL证书,并部署在服务器上。
-
成本:
- HTTP:通常免费。
- HTTPS:可能需要支付证书费用,尽管有许多免费证书颁发机构提供基础的HTTPS证书。
HTTPS的工作原理?
HTTPS(安全超文本传输协议)的工作原理基于HTTP协议,并增加了SSL/TLS协议来提供安全性。以下是HTTPS建立安全通信的基本步骤:
- 客户端请求: 用户在浏览器中输入一个以
https://开头的URL,客户端(通常是浏览器)向服务器请求建立安全连接。 - 服务器响应: 服务器接收到客户端的请求后,会响应其公钥证书,该证书包含了服务器的公钥以及由受信任的证书颁发机构(CA)签发的证书签名。
- 证书验证: 客户端接收到服务器的证书后,首先验证证书的有效性,包括证书是否过期、证书颁发机构是否受信任等。
- 密钥 交换: 如果证书验证通过,客户端会生成一个随机的对称加密密钥(会话密钥),并使用服务器的公钥对这个会话密钥进行加密,然后将其发送给服务器。
- 服务器解密 密钥: 服务器使用自己的私钥解密客户端发来的加密信息,得到会话密钥。
- 加密通信: 客户端和服务器现在都拥有相同的会话密钥,可以使用对称加密算法对数据进行加密和解密,确保数据在传输过程中的安全性。
- 数据传输: 使用会话密钥,客户端和服务器开始加密数据传输。浏览器发送的请求和服务器响应的数据都会被加密,以防止数据在传输过程中被截获。
- 完整性校验: HTTPS还提供了消息完整性校验,确保数据在传输过程中未被篡改。
- 结束加密通信: 当通信结束时,会话密钥将被销毁,以保证安全性。
- 前向保密: 如果使用了适当的密钥交换算法(如DHE或ECDHE),即使服务器的私钥被泄露,之前的通信记录也无法被解密,这称为前向保密。
TCP和UDP的区别?
| TCP | 面向连接 | 提供可靠的服务 | 面向字节流 | 连接是点到点的 | 首部开销20字节 |
|---|---|---|---|---|---|
| UDP | 无连接 | 不可靠 | 面向报文 | 支持一对一,一对多,多对多通信 | 首部开销8字节 |
TCP连接如何确保可靠性?
- 信道可靠(三次握手、四次挥手)
- 数据正确(分区编号、校验和、超时重传)
- 传输控制(拥塞控制、差错控制、滑动窗口)
UDP怎么实现可靠传输?
UDP(用户数据报协议)本身是一种无连接的协议,并不提供数据传输的可靠性保证。但是可以借助一些方法实现可靠传输,如:
- 序列号和确认机制——分配序列号,并要求接收方发送ACK应答。
- 超时重传——设置定时器。
- 有序接收——接收方按照序列号将数据包排序。
- 流量控制和拥塞控制——利用滑动窗口。
- 校验和——利用UDP首部的校验和字段。
- 应用层协议——使用应用层协议如RUDP、RTP、UDT等。
- QUIC协议
三次握手的过程,为什么是三次?
三次握手:
- 客户端发送SYN报文,携带客户端的初始序列号,告诉服务端:客户端希望建立连接,同时客户端进入SYN_SENT状态。
- 服务端回应SYN-ACK报文,确认服务端收到连接请求,并申请和客户端建立连接。
- 客户端回应ACK报文,确认客户端收到服务端的请求,且双方进入established状态,准备数据传输。
为什么是三次握手的原因:
- 防止已失效的连接请求报文突然传到服务端导致打开错误连接。
- 确保双方都准备好发送和接收数据(排除两次握手的情况)。
- 计算数据包的往返时间RTT。
- 避免浪费资源(没必要更多次握手)。
四次挥手的过程,为什么是四次?
四次挥手:(假设客户端主动要求断开连接)
- 客户端发送FIN报文,申请和服务端断开连接。
- 服务端回应ACK报文,此时服务端仍可能在发送数据。
- 服务端发送FIN报文,表示数据已经发送完,请求和客户端断开连接。
- 客户端回应ACK报文,再等2MSL(最大报文生存时间得两倍),确保服务端接收到ACK报文,自此双方断开通信连接。
为什么是四次挥手的原因?
- 确保数据传输完成,服务端可能还有数据没发送完,所以服务端先回应客户端的FIN报文,待数据发送完再发FIN报文,请求断开连接。
- 双向连接,TCP连接是双向的,每个方向都需要单独关闭。
- 避免资源泄漏,确保双方都有机会发送剩余的数据和确认关闭。
HTTP中Keep-Alive是什么?TCP中的Keep-Alive和它是一个东西吗?
HTTP Keep-Alive,也称为HTTP持久连接或连接复用,是一种HTTP头扩展,它允许客户端和服务器在完成一个HTTP请求和响应后,保持底层的TCP连接打开,以便重用它来发送和接收后续的HTTP请求和响应。这样做可以减少每次通信需要建立和关闭连接的开销。
TCP Keep-Alive是TCP协议的一个特性,用于检测一个处于长时间静默状态的连接是否仍然有效。如果一个连接在指定的时间内没有任何数据传输,TCP Keep-Alive会定期发送探测包,以检查连接的另一端是否仍然可达。
区别:
- 目的:HTTP Keep-Alive用于重用TCP连接进行多个HTTP请求和响应的传输,而TCP Keep-Alive用于检测并关闭长时间无活动的连接。
- 层面:HTTP Keep-Alive是应用层协议HTTP的一部分,TCP Keep-Alive是传输层协议TCP的特性。
- 控制方式:HTTP Keep-Alive通过HTTP头字段控制,TCP Keep-Alive通过操作系统或网络配置参数控制。
DNS查询过程?
DNS查询的本质:将域名转换为IP地址。
递归查询(本地缓存,本地域名服务器、根域名服务器、顶级域名服务器,权威域名服务器),将查找到的结果缓存,并返回。
CDN是什么?
CDN(内容分发网络)是一种分布式网络服务,它通过将内容缓存到离用户更近的服务器上,使用户能够更快地访问这些内容。CDN的目的是提高内容访问速度、降低源服务器负载、节省带宽成本,并提供更好的用户体验。
CDN关键技术:内容存储和分发技术。
Cookie和Session是什么?有什么区别?
Cookie和Session都是客户端与服务器之间保持状态的方式,它们在Web应用中用来识别用户和维持用户状态。
区别:
| 存储位置 | 存储大小 | 生命周期 | 安全性 | 使用方式 | 传输方式 | |
|---|---|---|---|---|---|---|
| Cookie | 客户端 | 大小受限,4KB | 可设置长期有效 | 不安全(易被访问和篡改) | 用于不需要安全性保证的简单数据存储 | 在每个请求中自动发送 |
| Session | 服务端 | 理论上无限制 | 会话结束失效 | 相对更安全 | 用于需要服务器端数据支持的场景 | 通过Cookie或URL传递Session ID |