计算机网络高频面试题

119 阅读17分钟

TCP/IP模型和OSI模型?

TCP/IP:应用层、传输层、网络层、网络接口层

OSI:应用层、表示层、会话层、传输层、网络层、数字链路层、物理层

从输入url到页面展示发生了什么?

当你在浏览器中输入一个URL并按下回车键时,以下是发生的一系列步骤:

  1. 解析URL:浏览器首先解析URL,确定协议(如HTTP或HTTPS)、域名、端口(如果指定)和路径。

  2. DNS查询:浏览器需要将域名解析为IP地址。这通常通过DNS(域名系统)完成。如果浏览器缓存中已有该域名的IP地址,则直接使用,否则向DNS服务器发起查询。

  3. 建立连接:一旦获得IP地址,浏览器尝试与服务器建立TCP连接。这通常涉及三次握手过程。

  4. 发送HTTP请求:连接建立后,浏览器发送一个HTTP或HTTPS请求到服务器。这个请求包括请求方法(如GET或POST)、请求的资源路径、HTTP版本和其他HTTP头信息。

  5. 服务器处理请求:服务器接收到请求后,根据请求的资源路径找到相应的资源,并处理请求。如果是动态内容,服务器可能需要执行一些脚本或程序来生成响应内容。

  6. 发送响应:服务器将处理结果作为HTTP响应发送回浏览器。响应包括状态码(如200表示成功)、响应头信息和响应体(即请求的资源内容)。

  7. 浏览器渲染页面:

    1.    解析HTML:浏览器开始解析HTML文档,构建DOM(文档对象模型)树。
    2.    CSS样式应用:浏览器解析CSS并将样式应用到DOM元素上,构建CSSOM(CSS对象模型)。
    3.    构建渲染树:结合DOM和CSSOM,浏览器构建渲染树。
    4.    布局:浏览器计算渲染树中每个节点的几何信息,即它们在页面上的位置和尺寸。
    5.    绘制:浏览器将渲染树中的节点绘制到屏幕上。
  8. 加载资源:浏览器可能会请求页面中的其他资源,如图片、JavaScript文件、CSS文件等,并重复上述过程。

  9. 执行JavaScript:如果页面包含JavaScript,浏览器会解析并执行脚本。这可能会修改DOM或CSSOM,从而触发重新渲染。

  10. 页面交互:页面加载完成后,用户可以与页面交互,浏览器会相应地更新页面。

HTTP请求报文和响应报文是怎样的?

HTTP请求报文:

  1. 请求行:包含请求方法、请求的资源URI(统一资源标识符)、HTTP版本。

    1. 格式:Method /uri HTTP/1.1
  2. 请求头:包含一系列的键值对,提供关于请求的附加信息,如用户代理、接受的媒体类型等。

    1. 示例:Host: www.example.comUser-Agent: Mozilla/5.0Accept: text/html
  3. 空行:请求头和请求体之间的空行,表示请求头的结束。

  4. 请求体(可选):对于某些请求方法(如POST或PUT),请求体包含要发送给服务器的数据。

HTTP响应报文:

  1. 状态行:包含HTTP版本、状态码和状态消息。

    1. 格式:HTTP/1.1 200 OK
  2. 响应头:类似于请求头,包含关于响应的附加信息,如内容类型、内容长度等。

    1. 示例:Content-Type: text/html; charset=UTF-8Content-Length: 1234
  3. 空行:响应头和响应体之间的空行,表示响应头的结束。

  4. 响应体:服务器返回的数据,可以是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状态码,告诉浏览器使用本地缓存的资源。

区别:

  1. 无需通信:强缓存不需要与服务器通信,直接使用本地缓存的资源。
  2. 需要通信:协商缓存需要与服务器通信,以确定资源是否被修改。
  3. 过期时间:强缓存依赖于过期时间或最大年龄,协商缓存依赖于资源的版本或最后修改时间。
  4. 适用场景:强缓存适用于不经常变化的资源,协商缓存适用于可能会更新的资源。

HTTP1.0和HTTP1.1的区别?

HTTP/1.0HTTP/1.1
持久连接默认情况下,每个TCP连接只发送一个请求和响应。发送数据后,连接就关闭了。可以通过Connection: keep-alive头部来启用持久连接。默认启用持久连接(也称为连接复用),一个TCP连接可以被用来发送多个HTTP请求和响应,减少了连接建立和关闭的开销。
管道化/支持请求管道化,即在第一个请求响应到达之前,就可以发送多个请求。这可以减少连接建立的时间,提高效率。
缓存处理使用Pragma头部来处理缓存,功能有限引入了新的Cache-Control头部,提供了更丰富的缓存控制指令,如no-cacheno-storemax-age等。
分块传输编码不支持分块传输编码支持分块传输编码,允许服务器分批次发送响应体,客户端可以逐步接收和处理数据,适用于大数据量的传输。
Host头部没有Host头部增加了Host头部
范围请求/支持范围请求,允许客户端请求资源的一部分

HTTP1.1和HTTP2.0的区别?

HTTP/1.1HTTP/2.0
使用文本格式传输数据用二进制格式
存在队头阻塞问题,即在一个TCP连接中,请求和响应需要排队等待,前一个请求的完成是发送下一个请求的前提。通过多路复用技术,允许在单个TCP连接上并行传输多个请求和响应,从而减少了延迟,提高了连接的利用率.
不支持头部压缩支持头部压缩
服务器只能响应客户端明确请求的资源许服务器主动推送资源到客户端,这有助于提前加载资源,减少页面加载时间
主要使用明文传输,安全性较差认使用TLS加密传输数据,提高了安全性

HTTP3.0?

它基于QUIC协议,运行在UDP之上。

特点:减少连接建立时间;解决队头阻塞问题;连接迁移;改进的拥塞控制;安全性;多路复用;抗拥塞控制;0-RTT连接建立。

HTTP和HTTPS的区别?

它们之间的主要区别在于安全性和数据传输的方式:

  1. 安全性

    1. HTTP:是明文传输协议,在传输过程中,数据未经加密,可能会被截获和篡改。
    2. HTTPS:在HTTP的基础上加入了SSL/TLS协议,提供了数据加密、完整性校验和身份验证,确保数据传输的安全性。
  2. 端口

    1. HTTP:默认使用80端口。
    2. HTTPS:默认使用443端口。
  3. 连接建立

    1. HTTP:使用TCP三次握手建立连接,之后就可以开始数据传输。
    2. HTTPS:除了TCP三次握手,还需要进行SSL/TLS握手过程,包括密钥交换、证书验证等,以建立加密的通信链路。
  4. 性能

    1. HTTP:由于没有加密和解密的步骤,通常性能较高。
    2. HTTPS:由于加密和解密的处理,可能会消耗更多的计算资源,导致性能略低于HTTP。
  5. 用途

    1. HTTP:适用于一般性的网页浏览,如浏览新闻、查看公开信息等。
    2. HTTPS:适用于需要保护用户隐私和数据安全的场合,如网上银行、在线支付、登录认证等。
  6. 浏览器显示

    1. HTTP:浏览器地址栏显示普通的“http://”。
    2. HTTPS:浏览器地址栏显示“https://”,并可能伴有锁形图标,表示连接是安全的。
  7. 搜索引擎优化( SEO

    1. 使用HTTPS的网站可能会获得搜索引擎的优先排名,因为搜索引擎倾向于推广安全的网络环境。
  8. 证书需求

    1. HTTP:不需要证书。
    2. HTTPS:需要从证书颁发机构(CA)获取SSL证书,并部署在服务器上。
  9. 成本

    1. HTTP:通常免费。
    2. HTTPS:可能需要支付证书费用,尽管有许多免费证书颁发机构提供基础的HTTPS证书。

HTTPS的工作原理?

HTTPS(安全超文本传输协议)的工作原理基于HTTP协议,并增加了SSL/TLS协议来提供安全性。以下是HTTPS建立安全通信的基本步骤:

  1. 客户端请求: 用户在浏览器中输入一个以https://开头的URL,客户端(通常是浏览器)向服务器请求建立安全连接。
  2. 服务器响应: 服务器接收到客户端的请求后,会响应其公钥证书,该证书包含了服务器的公钥以及由受信任的证书颁发机构(CA)签发的证书签名。
  3. 证书验证: 客户端接收到服务器的证书后,首先验证证书的有效性,包括证书是否过期、证书颁发机构是否受信任等。
  4. 密钥 交换: 如果证书验证通过,客户端会生成一个随机的对称加密密钥(会话密钥),并使用服务器的公钥对这个会话密钥进行加密,然后将其发送给服务器。
  5. 服务器解密 密钥: 服务器使用自己的私钥解密客户端发来的加密信息,得到会话密钥。
  6. 加密通信: 客户端和服务器现在都拥有相同的会话密钥,可以使用对称加密算法对数据进行加密和解密,确保数据在传输过程中的安全性。
  7. 数据传输: 使用会话密钥,客户端和服务器开始加密数据传输。浏览器发送的请求和服务器响应的数据都会被加密,以防止数据在传输过程中被截获。
  8. 完整性校验: HTTPS还提供了消息完整性校验,确保数据在传输过程中未被篡改。
  9. 结束加密通信: 当通信结束时,会话密钥将被销毁,以保证安全性。
  10. 前向保密: 如果使用了适当的密钥交换算法(如DHE或ECDHE),即使服务器的私钥被泄露,之前的通信记录也无法被解密,这称为前向保密。

TCP和UDP的区别?

TCP面向连接提供可靠的服务面向字节流连接是点到点的首部开销20字节
UDP无连接不可靠面向报文支持一对一,一对多,多对多通信首部开销8字节

TCP连接如何确保可靠性?

  1. 信道可靠(三次握手、四次挥手)
  2. 数据正确(分区编号、校验和、超时重传)
  3. 传输控制(拥塞控制、差错控制、滑动窗口)

UDP怎么实现可靠传输?

UDP(用户数据报协议)本身是一种无连接的协议,并不提供数据传输的可靠性保证。但是可以借助一些方法实现可靠传输,如:

  1. 序列号和确认机制——分配序列号,并要求接收方发送ACK应答。
  2. 超时重传——设置定时器。
  3. 有序接收——接收方按照序列号将数据包排序。
  4. 流量控制和拥塞控制——利用滑动窗口。
  5. 校验和——利用UDP首部的校验和字段。
  6. 应用层协议——使用应用层协议如RUDP、RTP、UDT等。
  7. QUIC协议

三次握手的过程,为什么是三次?

三次握手:

  1. 客户端发送SYN报文,携带客户端的初始序列号,告诉服务端:客户端希望建立连接,同时客户端进入SYN_SENT状态。
  2. 服务端回应SYN-ACK报文,确认服务端收到连接请求,并申请和客户端建立连接。
  3. 客户端回应ACK报文,确认客户端收到服务端的请求,且双方进入established状态,准备数据传输。

为什么是三次握手的原因:

  1. 防止已失效的连接请求报文突然传到服务端导致打开错误连接。
  2. 确保双方都准备好发送和接收数据(排除两次握手的情况)。
  3. 计算数据包的往返时间RTT。
  4. 避免浪费资源(没必要更多次握手)。

四次挥手的过程,为什么是四次?

四次挥手:(假设客户端主动要求断开连接)

  1. 客户端发送FIN报文,申请和服务端断开连接。
  2. 服务端回应ACK报文,此时服务端仍可能在发送数据。
  3. 服务端发送FIN报文,表示数据已经发送完,请求和客户端断开连接。
  4. 客户端回应ACK报文,再等2MSL(最大报文生存时间得两倍),确保服务端接收到ACK报文,自此双方断开通信连接。

为什么是四次挥手的原因?

  1. 确保数据传输完成,服务端可能还有数据没发送完,所以服务端先回应客户端的FIN报文,待数据发送完再发FIN报文,请求断开连接。
  2. 双向连接,TCP连接是双向的,每个方向都需要单独关闭。
  3. 避免资源泄漏,确保双方都有机会发送剩余的数据和确认关闭。

HTTP中Keep-Alive是什么?TCP中的Keep-Alive和它是一个东西吗?

HTTP Keep-Alive,也称为HTTP持久连接或连接复用,是一种HTTP头扩展,它允许客户端和服务器在完成一个HTTP请求和响应后,保持底层的TCP连接打开,以便重用它来发送和接收后续的HTTP请求和响应。这样做可以减少每次通信需要建立和关闭连接的开销。

TCP Keep-Alive是TCP协议的一个特性,用于检测一个处于长时间静默状态的连接是否仍然有效。如果一个连接在指定的时间内没有任何数据传输,TCP Keep-Alive会定期发送探测包,以检查连接的另一端是否仍然可达。

区别:

  1. 目的:HTTP Keep-Alive用于重用TCP连接进行多个HTTP请求和响应的传输,而TCP Keep-Alive用于检测并关闭长时间无活动的连接。
  2. 层面:HTTP Keep-Alive是应用层协议HTTP的一部分,TCP Keep-Alive是传输层协议TCP的特性。
  3. 控制方式: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