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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】通过码云Gitee获取OpenHarmony源码

Note:下面包含操作过程和问题解决(首次安装Ubuntu,环境未完善),没有遇到问题可以直接跳过问题part了,小白也能完成配置下载。 前置准备(Git环境账号) (一)安…

Effective-C++阅读解析条款(条款二:尽量以const,enum,inline替换#define)

个人主页:Lei宝啊 愿所有美好如期而遇 书中说这个条款或许改为“宁可以编译器替换预处理器”比较好,这句话在我看来原因是这样的: 如果我们有这样一个宏(假设写这个宏的人比较粗心):#define Add(x, y) x y 我们本意是想得到…

“创新强基·应用强链”2024第104届上海电子展会

2024第104届上海电子展会 2024 Shanghai electron Expo 时间:2024年11月18--20日 地点:上海新国际博览中心 主题:创新强基应用强链 上海与长三角各地产业协同发展,到2025年,初步建成具有全球影响力和竞争力的世界级电子信息产业集群。产业链稳定性和韧…

黄金票据制作

1、黄金票据 黄金票据在内网渗透中主要用于权限维持,即留下后门。使用黄金票据前提是你已经控制了整个域的域控制器。其核心原理与服务器中的krbtgt用户相关。从以下可以了解krbtgt原理: 前言 | windows protocolhttps://daiker.gitbook.io/windows-pro…

DNDC模型对所有处理的土壤温度和湿度模拟效果良好,但有时土壤湿度模拟存在偏差

使用 DNDC 模型评估加拿大多样化作物轮作系统对产量和 N2O 排放的影响 原名:Assessing the impacts of diversified crop rotation systems on yields and nitrous oxide emissions in Canada using the DNDC model 译名:使用 DNDC 模型评估加拿大多样…

使用vite创建一个react18项目

一、vite是什么? vite 是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成: 一个开发服务器,它基于原生 ES 模块提供了丰富的内建功能,如速度快到惊人的模块热更新(HMR)。 …

站群CMS系统

站群CMS系统是一种用于批量建立和管理网站的内容管理系统,它能够帮助用户快速创建大量的网站,并实现对这些网站的集中管理。以下是三个在使用广泛的站群CMS系统,它们各具特色,可以满足不同用户的需求。 1. Z-BlogPHP Z-BlogPHP是…

PSA制氧设备装置的使用注意事项解析

PSA制氧设备,即变压吸附制氧设备,是一种利用物理吸附原理,通过特定的吸附剂,在压力变化的情况下,从空气中分离出氧气的设备。由于其高效、节能、环保等特点,PSA制氧设备在工业、能源等领域得到了广泛应用。…

QCustomPlot一、QCustomPlot基础及画图显示

1、QCustomPlot下载 QCustomPlot源码demo 根据需要选择需要的文件: 完整版。QCustomPlot.tar.gz 源代码例子帮助文档; 共享库。QCustomPlot-sharedlib.tar.gz 库编译和使用; 源代码。QCustomPlot-source.tar.gz 源代码 里面包含了很多QCusto…

JavaEE 初阶篇-深入了解单例模式(经典单例模式:饿汉模式、懒汉模式)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 单例模式的概述 2.0 单例模式 - 饿汉式单例 2.1 关于饿汉式单例的线程安全问题 3.0 单例模式 - 懒汉式单例 3.1 关于懒汉式单例的线程安全问题 3.1.1 加锁 synchr…

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…

基于SSM+Jsp+Mysql的班级同学录网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

深入解析实时数仓Doris:Rollup上卷表与查询

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、基本概念二、Aggregate 和 Unique 模型中的 ROLLUP三、Duplicate 模型中的 ROLLUP四、ROLLUP 调整前缀索引五、ROLLUP使…

【Mars3d绘制完成后设置离地面的实体高度】graphicLayer.startDraw绘制带高度的实体

实现效果: 相关需求场景: 绘制之后可以在success中通过graphic可以拿到所点击的点的位置,然后重新生成一个graphic添加到地图上,重新生成的面在初始化的时候可以指定想要的高度 相关实现代码: // 开始绘制多边形 exp…

如何对抓取的文本进行分词、词频统计、词云可视化和情感分析

目录 一、引言 二、文本分词 三、词频统计 四、词云可视化 五、情感分析 六、总结 一、引言 在大数据时代,文本数据的处理和分析显得尤为重要。对于爬虫抓取的大量文本数据,如何进行高效、准确的处理和分析,是每一个数据分析师和开发…

QML 用文件的方式自定义组件

自定义组件 序言方法首先新建一个QML文件QML文件名称创建完后编写自己的组件 效果注意 序言 说到QML,就肯定离不了自定义一说,毕竟你总不至于用一个qml文件写完全部吧?我来写点基础的东西丰富下QML资料贫乏 方法 首先新建一个QML文件 QML文…

jupyter加目录contrib nbextension 使用

jupyter在工作中使用很方便,可是一旦单个文件的内容多了,即使有markdown文本提醒,上下翻找依旧很费精力。这时,有个目录就显得至关重要了。 1 安装模块 打开anaconda的PowerShell(带有Prompt的)&#xff0…

nut-ui中的menu 菜单组件的二次封装

这个菜单组件 一般可以直接用到项目里 如果复用性不强的话 直接使用 但是有一个问题 如果很多地方都需要用到这个组件 我们可以把这个组件二次封装一下 <template><div class"cinema-search-filter-component"><nut-menu><template #icon>&…

大学html作业-原神官网静态页面(免费)

大学html作业-原神官网静态页面&#xff08;免费&#xff09; 源码来自githab&#xff0c;有些简单的问题我都修复了。大家可以直接去找原作者的源码&#xff0c;如果githab打不开就从我下载的网盘里下载吧。 效果 在这里插入图片描述 源码

C++11模版元编程

1.概述 模版元编程&#xff08;template metaprogram&#xff09;是C中最复杂也是威力最强大的编程范式&#xff0c;它是一种可以创建和操纵程序的程序。模版元编程完全不同于普通的运行期程序&#xff0c;它很独特&#xff0c;因为模版元程序的执行完全是在编译期&#xff0c;…