计算机网络面试问题(一)

1.在浏览器中输⼊URL并按下回⻋之后会发⽣什么

image-20240331233216712

2.TCP三次握⼿的过程,为什么三次握手

image-20240331234906131 TCP(传输控制协议)的三次握⼿是建⽴⽹络连接的过程,确保通信双⽅能够正确地进⾏数据传输。
  1. 第⼀次握⼿(SYN):
    客户端(Client)向服务器(Server)发送⼀个带有 SYN(同步)标志位的包,表示客户端希望建⽴连接。该包同
    时指定客户端的初始序列号(Client Sequence Number)。

    image-20240331235054841
  2. 第⼆次握⼿(SYN + ACK):
    服务器收到客户端的 SYN 包后,会回复⼀个带有 SYN 和 ACK(确认)标志位的包,表示服务器接受了客户端的请
    求,并希望建⽴连接。服务器也会指定⾃⼰的初始序列号,以及对客户端序列号的确认。

image-20240331235227435 3. 第三次握⼿(ACK): 客户端收到服务器的 SYN+ACK 包后,会发送⼀个带有 ACK 标志位的包作为确认回复。这个包的序列号会加⼀,表 示客户端已经准备好与服务器进⾏数据传输。 此时,TCP 连接已经建⽴起来,通信双⽅可以开始进⾏数据传输。 image-20240331235325992

为什么是三次握手?

三次握⼿的⾸要原因是为了防⽌旧的重复连接初始化造成混乱。

image-20240401061842187

如果是两次握⼿连接,就⽆法阻⽌历史连接,那为什么 TCP 两次握⼿为什么⽆法阻⽌历史连接呢?
我先直接说结论,主要是因为在两次握⼿的情况下,服务端没有中间状态给客户端来阻⽌历史连接,导致服务端可能建⽴⼀个历史连接,造成资源浪费。
你想想,在两次握⼿的情况下,服务端在收到 SYN 报⽂后,就进⼊ ESTABLISHED 状态,意味着这时可以给对⽅发送数据,但是客户端此时还没有进⼊ ESTABLISHED 状态,假设这次是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报⽂来断开连接,⽽服务
端在第⼀次握⼿的时候就进⼊ ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报⽂后,才会断开连接。

3.TCP四次挥⼿的过程,为什么四次挥手?

image-20240401062742652

四次挥⼿是指在TCP连接的断开过程中,由客户端先断开,然后由服务器进⾏最后的断开。
具体的四次挥⼿步骤如下:

  1. 客户端发送⼀个FIN(终⽌)报⽂给服务器,表示客户端不再发送数据。
  2. 服务器收到FIN报⽂后,发送⼀个ACK(确认)报⽂给客户端,表示收到了客户端的终⽌请求。
  3. 服务器发送⼀个FIN报⽂给客户端,表示服务器也不再发送数据。
  4. 客户端收到服务器的FIN报⽂后,发送⼀个ACK报⽂给服务器,确认收到了服务器的终⽌请求,然后关闭连
    接。
    这样,经过四次挥⼿,TCP连接才会完全关闭。因为TCP是全双⼯连接,双⽅都需要通知对⽅停⽌数据传输,所以
    需要四次握⼿来完成断开连接的过程。

可以看到,每个⽅向都需要⼀个 FIN 和⼀个 ACK,因此通常被称为四次挥⼿。

为什么 TCP 挥⼿需要四次呢?

TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。 当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后才会完全关闭了 TCP 连接。 总结:两次握手可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手

服务器收到客户端的 FIN 报⽂时,内核会⻢上回⼀个 ACK 应答报⽂,但是服务端应⽤程序可能还有数据要发送,所以并不能⻢上发送 FIN 报⽂,⽽是将发送 FIN 报⽂的控制权交给服务端应⽤程序:
如果服务端应⽤程序有数据要发送的话,就发完数据后,才调⽤关闭连接的函数;如果服务端应⽤程序没有数据要发送的话,可以直接调⽤关闭连接的函数,
从上⾯过程可知,是否要发送第三次挥⼿的控制权不在内核,⽽是在被动关闭⽅(上图的服务端)的应⽤程序,因为应⽤程序可能还有数据要发送,由应⽤程序决定什么时候调⽤关闭连接的函数,当调⽤了关闭连接的函数,内核就会发送 FIN 报⽂了,所以服务端的 ACK 和
FIN ⼀般都会分开发送。

4.TCP与UDP的概念,特点,区别和对应的使用场景?

  1. TCP与UDP的概念
    ● TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
    ● UDP(用户数据报协议)为应用程序提供了一种无需建立连接就可以发送封装的IP数据包的方法。
  2. 特点
    ● TCP:面向连接,传输可靠,传输形式为字节流,传输效率慢,所需资源多。
    ● UDP:无连接、传输不可靠、传输形式为数据报文段,传输效率快,所需资源少。
  3. 区别
    ● 是否面向连接: TCP 是面向连接的传输,UDP 是无连接的传输。
    ● 是否是可靠传输:TCP是可靠的传输服务,在传递数据之前,会有三次握手来建立连接;在数据传递时,有确认、窗口、重传、拥塞控制机制。 UDP是不可靠传输,数据传递不需要给出任何确认,且不保证数据不丢失及到达顺序。
    ● 是否有状态:TCP 传输是有状态的,它会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等,而 UDP 是无状态的。
    ● 传输形式: TCP 是面向字节流的,UDP 是面向报文的。
    ● 传输效率:由于TCP 传输的时候多了连接、确认重传等机制,所以TCP 的传输效率要比UDP 低。
    ● 首部开销 :TCP 首部开销 (20 ~ 60字节)比UDP 首部开销 (8字节)要大。
    ● 是否提供广播或多播服务: TCP 只支持点对点通信UDP 支持一对一、一对多、多对一、多对多。
  4. 对应的使用场景
    ● TCP常用于要求通信数据可靠场景(如网页浏览、文件传输、邮件传输、远程登录、数据库操作
    等)。
    ● UDP常用于要求通信速度高场景(如域名转换、视频直播、实时游戏等)。

5.HTTP请求常见的状态码和字段

image-20240401150056993 image-20240401151508465

6.常见的请求方式?GET和POST请求的区别?

这些区别主要体现在用途、数据传输方式、安全性、数据容量、编码方式、缓存机制、TCP数据包产生方式以及幂等性上。

image-20240401152748177

image-20240401152755305

  1. 作用

    • GET主要用于请求服务器发送资源,例如请求网页、图片或视频等。
    • POST主要用于向服务器提交数据,例如提交表单数据、上传文件等。
  2. 参数传递方式

    • GET参数通过URL传递,这导致数据容易被截取或查看。
    • POST参数放在HTTP请求体中,对外不可见,支持更大的数据量和更多的数据类型。
  3. 安全性

    • GET因参数直接附在URL后,安全性较低,不适合传输敏感信息。
    • POST由于数据在请求体内,安全性较高,适合传输敏感信息。
  4. 参数长度限制

    • GET参数长度受限(通常限制在URL长度约2KB内),限制由浏览器和服务器决定。
    • POST理论上没有数据量限制,适合大量数据传输。
  5. 编码方式

    • GET请求通常只使用application/x-www-form-urlencoded编码类型。
    • POST支持多种编码方式,包括multipart/form-data用于文件上传。
  6. 缓存机制

    • GET请求可以被浏览器缓存,URL可存为书签,并保留在浏览器历史记录中。
    • POST请求不会被浏览器缓存,请求数据不会保存在浏览器历史中,且不能被存为书签。
  7. TCP数据包

    • GET请求一般只生成一个TCP数据包(header和data一起发送)。
    • POST请求一般会生成两个TCP数据包(先发送header,服务器响应100 continue后发送data)。
  8. 幂等性

    • GET是幂等的,多次执行相同的GET请求,服务器上的资源状态不变,结果相同。
    • POST不是幂等的,多次执行相同的POST请求可能会在服务器上创建多份资源,结果不同。

选择GET还是POST请求方式,取决于操作的性质和需求。如果目的是从服务器获取数据且操作对数据没有影响,GET是更合适的选择。如果目的是向服务器提交数据以更改服务器状态或更新资源,应使用POST。在设计Web应用时,了解和正确使用这两种请求方法对于提高应用的安全性、效率和用户体验至关重要。

7.什么是强缓存和协商缓存

在Web开发中,缓存是一种重要的性能优化手段,它可以减少服务器的负载,加快页面的加载速度。缓存策略主要分为两种:强缓存(Strong Cache)和协商缓存(Negotiated Cache)。这两种缓存策略的运用,能有效地控制资源的获取方式,决定资源是从服务器重新获取还是直接从浏览器缓存中读取。

强缓存

强缓存不会向服务器发送请求,直接从缓存中读取资源。强缓存可以通过设置HTTP响应头中的ExpiresCache-Control来实现:

  • Expires:HTTP/1.0中存在的字段,用来指定资源到期的时间。如果浏览器发现当前时间小于Expires指定的时间,就会直接使用缓存数据,不会向服务器发起请求。但是,Expires是一个绝对时间,受本地时间影响,可能会导致缓存失效。
  • Cache-Control:在HTTP/1.1中引入,更加灵活。它可以通过设置max-age值来控制资源的最大缓存时间(相对时间),优先级高于Expires。例如,Cache-Control: max-age=3600表示资源可以被缓存,且有效期为3600秒。

当强缓存有效时,浏览器不会向服务器发送请求,即使按下刷新按钮,通常也会直接从缓存加载资源,状态码为200,但有时会标记为from cache。

协商缓存

当强缓存失效后,浏览器会向服务器发送请求,由服务器决定是否使用缓存。协商缓存涉及的HTTP头包括Last-Modified/If-Modified-SinceETag/If-None-Match

  • Last-Modified/If-Modified-Since:服务器通过Last-Modified响应头告诉浏览器资源的最后修改时间。下次浏览器请求时,通过If-Modified-Since请求头发送这个时间。服务器比较时间,如果资源未修改,返回304 Not Modified状态码,浏览器则从缓存中加载资源。
  • ETag/If-None-MatchETag是资源的唯一标识,由服务器生成。浏览器在初次接收到资源时,会保存ETag值,并在下次请求时通过If-None-Match发送这个值。服务器比对ETag,如果未发生变化,则返回304,浏览器继续使用缓存的资源。

协商缓存需要服务器参与,每次都会发送请求到服务器,如果资源未修改,虽然不会下载资源,但是会消耗一定的网络带宽。

总结

  • 强缓存优先级高,直接从缓存读取资源,不会发送请求到服务器,极大地减少了网络带宽消耗。
  • 协商缓存需要服务器确认资源是否更新,如果资源未更新,返回304状态码,浏览器继续使用缓存的资源。

合理配置强缓存和协商缓存,可以有效提升Web应用的性能和用户体验。

8.HTTP1.0和HTTP1.1的区别?

  1. 长连接(Persistent Connections)
  • HTTP 1.1 默认支持长连接(Keep-Alive),这意味着在一个TCP连接上可以传输多个HTTP请求和响应,减少了建立和关闭连接的频繁操作,从而减少了延迟,并提高了网络传输效率。
  • HTTP 1.0 默认使用短连接,即每个HTTP请求/响应对后都会关闭TCP连接。这会导致每次请求都需要重新建立TCP连接,增加了额外的延迟和网络负担。
  1. 缓存
  • HTTP 1.0 使用If-Modified-SinceExpires头部作为缓存的判断标准,依赖于资源的最后修改时间和过期时间来控制缓存。
  • HTTP 1.1 引入了更多的缓存控制策略,如Entity tag (ETag)和If-None-Match,提供了更灵活和精确的缓存验证机制。

3. 管道化(Pipelining)

  • HTTP 1.1 的长连接特性使得管道化成为可能。客户端可以在等待第一个请求的响应时发送后续请求,这可以减少等待时间,理论上提高页面加载速度。但由于响应必须按照请求的顺序返回,且服务器端支持程度不一,实际效果可能有限。

4. 增加Host字段

  • HTTP 1.1 引入了必须的Host头部,允许同一个物理服务器上托管多个域名的网站,是虚拟主机技术的关键支持。

5. 状态码

  • HTTP 1.1 新增了24个状态响应码,提供了更细粒度的错误处理和更丰富的状态信息。

6. 带宽优化

  • HTTP 1.0 存在带宽浪费的问题,比如服务器发送整个资源,即使客户端只需要部分内容。
  • HTTP 1.1 通过引入Range请求头和206(Partial Content)响应码支持部分请求和断点续传,显著提高了带宽利用率,尤其是在大文件传输和流媒体服务中非常有用。

9.HTTP2.0与HTTP1.1的区别?

HTTP/2引入了一系列改进HTTP协议的新特性,旨在解决HTTP/1.x(特别是HTTP/1.1)在现代网络环境下面临的性能限制。以下是HTTP/2的主要改进点及其分析:

  1. 二进制分帧
  • 概念:在应用层(HTTP)和传输层(TCP或UDP)之间增加一个二进制分帧层。这一层负责将所有传输的信息分割成更小的消息和帧,并对它们进行二进制编码。
  • 好处:此改进使得HTTP/2能够突破HTTP/1.1的性能限制,实现更低的延迟和更高的吞吐量。二进制协议比传统的文本协议更紧凑,解析速度更快,效率更高。
  1. 多路复用(Multiplexing)
  • 概念:在一个TCP连接上同时发送多个请求和响应,而不需要等待前一个完成。
  • 好处:这解决了HTTP/1.x中的"队头阻塞"问题,即之前的请求延迟会导致后续请求即使已经就绪也无法发送。多路复用使得多个请求和响应可以同时在一个连接上进行,显著提高了网页加载速度和网络利用率。
  1. 首部压缩
  • 概念:HTTP/2使用HPACK算法对首部(header)数据进行压缩,减少了首部的大小,并减少了发送包的数量。
  • 好处:由于HTTP/1.x的首部未经压缩,包含许多重复的首部字段,这会导致不必要的带宽浪费。HTTP/2通过首部压缩,可以减少单个请求-响应的开销,降低延迟,提高传输效率。
  1. 服务端推送(Server Push)
  • 概念:服务器可以主动推送资源到客户端的缓存中,而无需客户端明确请求。
  • 好处:服务端推送可以进一步减少加载时间,因为服务器可以预测客户端需要的资源并提前发送。这减少了往返次数和等待时间,尤其在复杂的应用中可以显著提升性能。

10.HTTPS的工作原理?(https是怎么建立连接的)

这个过程详细描述了使用数字证书进行安全通信的过程,这种机制通常是在HTTPS(HTTP Secure)协议中实现的,用于在互联网上安全地传输数据。以下是对这个过程中的关键步骤和安全机制的分析:

  1. 建立连接请求
  • 步骤:客户端向服务器发起连接请求,开始SSL/TLS握手过程。
  1. 数字证书生成
  • 步骤:服务器生成一对公私钥,并将公钥发送给CA(证书颁发机构)申请数字证书。CA使用其私钥对服务器的公钥和一些身份信息进行签名,生成数字证书。
  • 安全机制:这一步确保了服务器的公钥是经过可信第三方(CA)验证的,增加了信任度。
  1. 证书发送给客户端
  • 步骤:服务器将获得的数字证书发送给客户端。
  • 安全机制:客户端通过验证数字证书来确认服务器的身份,防止中间人攻击。
  1. 客户端验证证书
  • 步骤:客户端解析并验证服务器发送的数字证书,确保它是由可信CA签发的。
  • 安全机制:客户端内置的CA公钥用于验证数字证书的签名,确保了证书的真实性和服务器的身份。
  1. 对称加密密钥的生成
  • 步骤:客户端生成一个随机码(对称加密的密钥),用于后续通信。
  • 安全机制:对称加密密钥只在客户端和服务器之间共享,保证了传输数据的机密性。
  1. 加密的对称密钥传输
  • 步骤:客户端用服务器的公钥加密这个随机码,然后发送给服务器。
  • 安全机制:即使中间人截获了加密的密钥,也无法解密,因为只有服务器的私钥能解开。
  1. 服务端解密对称密钥
  • 步骤:服务器用自己的私钥解密收到的加密密钥,获得对称加密的密钥。
  • 安全机制:确保了只有服务器能解密并获取对称加密的密钥。
  1. 加密数据传输
  • 步骤:服务器和客户端使用对称加密密钥加密通信内容。
  • 安全机制:对称加密确保了数据传输过程的机密性和完整性。
  1. 加密通信
  • 步骤:客户端和服务器持续使用对称密钥进行加密通信。
  • 安全机制:对称加密的高效性使得加密通信在性能上可行,同时保证了通信安全。

总结

整个过程通过结合非对称加密(用于身份验证和对称密钥的安全交换)和对称加密(用于高效的数据加密通信)的方式,确保了通信的安全性。这种机制既保证了通信双方身份的真实性,又确保了数据传输的机密性和完整性,是现代安全通信不可或缺的部分。

image-20240401161622206

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Php_Code_challenge13

题目: 答案: 解析: 开启一个会话,在SESSION变量"nums"为空时则对"nums","time","whoami"进行赋值,并在120秒后关闭会话,创建一个变量"$value"…

第6章 数据存储操作

思维导图 6.1 引言 数据存储与操作包括对存储数据的设计、实施和支持,最大化实现数据资源的价值,贯穿于数据创建/获取到处置的整个生命周期。 6.1.1 业务驱动因素 数据存储与操作活动对于依赖数据的企业来说非常关键,这些活动的主要驱动因素是…

Meta Pixel:助你实现高效地Facebook广告追踪

Meta Pixel 像素代码是用來衡量Facebook广告效果的一个官方数据工具,只要商家有在Facebook上投放广告就需要串联Meta Pixel 像素代码来查看相关数据。 它本质上是一段 JavaScript 代码,安装后可以让用户在自己网站上查看到访客活动。它的工作原理是加载…

记windows配置maven环境变量

配置环境变量 idea中配置maven

C++教学——从入门到精通 4.setw()语句

这次玩点新鲜的------setw() 这家虎是啥呢? 我们编程输出的时候总是要输出空格,但有些时候又点的手都麻了 这时setw语句就派上用场了 具体怎么用呢? 如下图 #include"iostream"// #include"iomanip"// bits/stdc…

AI智能写作:巧用AI大模型让新媒体变现插上翅膀【文末送书】

文章目录 一、AI智能写作的崛起二、AI智能写作与新媒体变现AI智能写作的挑战与应对策略 AI智能写作:巧用AI大模型让新媒体变现插上翅膀【文末送书】 近年来,人工智能(AI)技术的发展日新月异,逐渐渗透到了各行各业&…

稻盛和夫|普通人如何才能取得非凡成就?

哈喽,你好啊,我是雷工! 稻盛和夫老先生曾经回答过这么一个问题: 资质平庸的普通人如何才能取得非凡的成就? 稻盛和夫认为:人生成就能力努力态度。 也就是:做一个努力工作却不甘于只做眼前的事&a…

Verilog基础【二】

3.1 Verilog 连续赋值 关键词:assign, 全加器 连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。: assign LHS_target RHS_expression ;LHS(left hand side)…

linux 系统安装php 8.0.2

1. 安装包准备 https://www.php.net/distributions/php-8.0.22.tar.gz 我下载到 /usr/local/src 这个目录了 cd /usr/local/srcwget https://www.php.net/distributions/php-8.0.22.tar.gz 2. tar 解压 然后进到解压的文件夹 tar -zxvf php-8.0.22.tar.gz cd php-8.0.2…

鸿蒙OS开发实例:【NAPI入门】

背景 公司内部已经有现成的MQTT动态库,想在HarmonyOS平台上共享使用。查找官方指导后,发现可以通过NAPI方式,将MQTT C库导入进来,然后封装一层ArkTS接口就可直接使用。 本篇内容是在按照官方指导下,自己做的一些调研…

Latex绘制多行多TSNE列子图

Latex绘制多行多列TSNE子图 问题描述解决办法 问题描述 写论文需要绘制TSNE可视化图像。 解决办法 代码如下 \usepackage{subfigure}\begin{figure*}\centering\small\subfigure[aaa]{\includegraphics[width0.18\textwidth]{Figure/MFPT_v5_train_tsne_user0_bs0.png}}\su…

Docker 学习

一起学习,加油芹菜!!! 镜像:相当于模板,容器:相当于服务器 镜像:(centos镜像、mysql镜像、nginx镜像、redis镜像、自己的应用程序等) 容器:想让镜像跑起来就需要创建容器,相当于服务器,容器与容器之间是隔离的,安全性较高 1)yum包更新到最新 sudo yum upd…

neo4j使用详解(六、cypher即时时间函数语法——最全参考)

Neo4j系列导航: neo4j及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 6.时间函数-即时类型 表示具体的时刻的时间类型函数 6.1.date函数 年-月-日时间函数: yyyy-mm-dd 6.1.1.获取date da…

C++ vector 数组/向量

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

IPv4地址

IP v4 由32位二进制构成、可以用点分十进制表示。 例如:192.168.1.1 11000000101010000000000100000001 由网络位和主机位组成。为了区分网络位和主机位,需要用子网掩码,子网掩码也是由32位二进制构成,连续的1对应网络位&#…

HDMI 2.1b 规范解读

HDMI 规范 HDMI 2.1b 是最新版 HDMI 规范,支持一系列更高的视频分辨率和刷新频率,包括 8K60 和 4K120 以及高达 10K 的分辨率。同时支持动态 HDR 格式,带宽能力增加到 48Gbps HDMI。 新的超高速 HDMI 线缆支持 48Gbps 带宽。该线缆可确保提供…

吴恩达机器学习笔记 三十二 K-means初始化 选择聚类数量

K-means 初始化 首先 K < m&#xff0c;若集群的数量多于样本数显然是不合理的。 第一步&#xff1a;随机选取 K 个样本&#xff1b; 第二步&#xff1a;设这 K 个样本为 μ1 μ2 ... μk 有时候K-meas 算法会出现局部最小值的情况&#xff0c;如左下图和右下图&#xf…

spark sql执行引擎原理及配置

如果我们想要给上层开发人员配置好一个统一的sql开发界面&#xff0c;让他们统一通过sql开发即可&#xff0c;可通过spark中的thriftserver服务实现&#xff0c;与hive中的thriftserver类似&#xff0c;配置好该服务后&#xff0c;上层通过db client或者代码中通过jdbc连接即可…

Linux gcc day2

mkdir -p 递归的创建目录 rm or rmdir&#xff1a; rmdir &#xff1a;是用来删除空目录的 实际上我们更加常用的是rm命令 rm可以删除普通文件,也可以删除目录&#xff0c;目录是从某次开始就是一棵树就是递归&#xff0c;所以就要递归删除 rm -r [文件名] 递归删除目录或者目…

linux系统命令chkconfig详解,管理系统服务的工具-查看、启用、禁用和设置系统服务的启动级别

目录 一、chkconfig命令介绍 二、命令的主要作用 1、管理服务的启动和停止&#xff1a; 2、配置运行级别&#xff1a; 3、简化系统管理&#xff1a; 4、查看服务状态&#xff1a; 三、命令语法 1、基本语法 2、运行级别 四、获取帮助 1、通过help获取 2、通过man获…