首页 > 其他分享 >1.HTTP面试题

1.HTTP面试题

时间:2023-07-10 13:32:05浏览次数:47  
标签:面试题 缓存 HTTP 请求 Modified 服务器 客户端

1.HTTP基本概念

1.1 HTTP是什么

   HTTP(HyperText Transfer Protocol)是超文本传输协议。它是一种双向传输协议。具体来说HTTP是一种在计算机世界里,专门在[两点]之间[传输]文字、图片、音频、视频等[超文本]数据的[约定和规范]

1.2 HTTP常见状态码有哪些

1.HTTP面试题_HTTP

1XX类状态码属于提示信息,是协议处理中的一种中间状态;

2XX类状态码表示服务器成功处理了客户端的请求

  • [200 OK]是最常见的成功状态码,表示一切正常。如果非HEAD请求,服务器返回的响应头都会有body数据;
  • [204 NoContent]也是最常见的成功状态码,与200 OK基本相同,但响应头没有body数据;
  • [206 partical Content]应用于HTTP分块下载或断点续传,表示响应返回的body数据并不是资源的全部,而是其中一部分,也是服务器处理成功的状态。

3XX类状态码表示客户端请求的资源发生了变动,需要客户端用新的URL重新发送请求获取资源,即重定向。

  • [301 Moved Permantly]表示永久重定向,说明请求的资源已经不存在,需改用新的URL再次访问;
  • [302 Found]表示临时重定向,说明请求的资源还在,但是暂时需要用另一个URL访问该资源
  • [304 Not Modified]表示资源未修改重定向到已存在的缓存文件,即缓存重定向。告诉客户端可以继续使用缓存资源,用于缓存控制

4XX类状态码表示客户端发送的报文有误,服务端无法处理,即客户端错误

  • [400 Bad Request]表示客户端请求的报文有误
  • [403 Forbidden]表示服务器的资源禁止访问,或客户端无权访问,并不是客户端请求出错;
  • [404 Not Found]表示客户端请求的资源在服务端不存在或找不到,所以无法提供给客户端

5XX类状态码表示客户端请求报文正确,但服务器处理时内部发生错误,属于服务端错误

  • [500 Internal Server Error]与400类似,笼统通用的错误码;
  • [501 Not Imaplmwented]表示客户端请求的功能服务端暂时不支持,类似“即将开业,敬请期待”;
  • [502 Bad Gateway]通常是服务端作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生错误;
  • [503 Service Unavailable]表示服务器正忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”。

1.3 HTTP常见字段有哪些

  1.  Host字段:用于请求发送到同一台服务器的不同程序
  2. Content-Length:服务器返回数据的数据长度。HTTP协议通过设置回车符、换行符作为HTTP header边界,通过Content-Length字段作为Http Body边界,解决“粘包”问题
  3. Connection字段:(Cnotallow=keep-alive)表示用户端与服务端使用HTTP长连接机制,只要任意一端没有明确断开连接,则保持TCP连接状态
  4. Content-Type(Content-Type=text/html;charset=utf-8):用于响应客户端,告诉其本次数据什么格式;客户端Accept:*/*表示接收任何数据格式
  5. Content-Encoding字段(Content-Encoding:gzip)表示服务端返回数据使用的压缩方法;客户端的Accept-Encoding=gzip,deflate表示接收这两种压缩方式

2.GET与POST

 2.1 Get和Post区别

  RFC(Request For Comment):互联网工程任务组(IETTF)发布的用于标准化互联网协议和技术的文件。该文件包含协议规范、安全、路由、传输控制、网络管理等相关信息,该文档是互联网工程和网络技术领域的权威性和可信度文档。

  • 根据RFC规范,Get是从服务其获取指定的(静态文本、页面、图片、音视频)资源。Get请求参数写在支持ASCLL字符且长度有限制的URL中
  • 根据RFC规范,Post是请求负荷(任意类型和大小的报文body)对指定的(静态文本、页面、图片、音视频)资源作出处理

  关于Get和Post方法请求流程这里贴上xiaolincoding的图片

1.HTTP面试题_客户端_02

1.HTTP面试题_客户端_03

2.2 Get和Post方法都是安全和幂等的吗

  在HTTP协议中,安全是指请求方法不会破坏服务器上的资源幂等是指多次执行相同的操作,结果都是相同的

  • 根据RFC规范,Get方法时安全且幂等的,可以对Get请求的数据做缓存,缓存在浏览器本身减少浏览器重复请求相同资源),也可以用于代理(如Nginx),浏览器的Get请求可保存为书签
  • 根据RFC规范,Post方法不是安全幂等的,浏览器一般不会缓存Post请求,也不能将其保存为书签

  RFC中并没有规定Get不能带body,理论上任何请求都可以带有body;URL查询参数并不是Get独有,Post请求的URL也可以带有参数。

3.HTTP特性

3.1 Http/1.1优点

  • 简单:头部信息键值对是简单文本形式,基本报文格式:header+body;
  • 灵活易于扩展:协议中的请求方法、URI/URL、状态码、头字段可以由开发人员自定义和扩展。在HTTP下层传输协议中,HTTPS在HTTP与TCP之间增加了SST/TLS安全传输层;HTTP/1.1和HTTP/2.0传输协议使用的TCP协议,HTTP/3.0协议使用的UDP协议;
  • 应用广泛、跨平台:无论是电脑还是  

3.2 Http/1.1缺点

  • 无状态双刃剑:不额外使用资源记录状态信息,减轻服务器负担;每次操作都需要验证用户身份,用户体验感差。我们可以将请求和响应报文写入Coolie信息控制客户端状态。流程r如下图:

1.HTTP面试题_HTTP_04

  • 明文传输双刃剑:方便阅读但是无隐私可言
  • 不安全:

  1)内容被窃取:找好信息泄漏,号没了;

  2)不验证通行身份,遭遇伪装,访问淘宝,拼多多,钱没了;

  3)无法验证报文完整性,可能被篡改:网页植入垃圾广告,视觉污染,眼没了

  HTTP的安全问题可以通过在HTTPS协议在HTTP和TCP协议中间添加SSL和TLS协议增加安全性。

3.3 Http/1.1性能

   HTTP协议基于TCP/IP协议,使用[请求--回应]通信模式;

  • 长连接:减少TCP重新建立和断开的额外开销,减轻服务器负担。只要任意一端没有明确提出断开连接,TCP保持连接状态。如果某个HTTP连接超过一定时间没有任何数据交互,服务器会主动断开该连接

1.HTTP面试题_状态码_05

  • 管道网络传输:同一个TCP连接中,客户端可以发起多个请求,只要第一个请求发送出去,不必等待其响应,就可以发送第二个请求,减少整体响应时间。但是服务器必须按照管道的请求顺序响应请求。HTTP/1.1解决了请求的对头阻塞,但是没有解决响应的对头阻塞

1.HTTP面试题_状态码_06

  • 队头阻塞:如果顺序发送的请求序列中一个请求因为某种原因被阻塞后面排队的所有请求一同被阻塞导致客户端一直请求不到数据

4.HTTP缓存技术

 为避免重读的Http请求发送,可以将[请求-响应]的数据缓存在本地,因此Http头部中有很多针对缓存的字段。Http缓存技术有两种:强制缓存,协商缓存

4.1 强制缓存

   强制缓存是指浏览器如果判断缓存没有过期,则直接使用浏览器的本地缓存,使用缓存的主动性在浏览器这边。如下图,返回200状态码表示数据返回成功,在其后续括号中标识了from disk cache,这标识了使用强制缓存。

1.HTTP面试题_状态码_07

   强制缓存通过HTTP响应头部的Cache-Control(相对时间)字段和Expires(绝对时间)字段实现表示资源在客户端浏览器缓存的有效期。如果同时又Cache-Control和Expires字段,Cache-Control优先级更高

  Cache资源选项更多,设置更详细,建议使用Cache-Control实现强制缓存,工作流程如下:

  1. 当浏览器第一次访问服务器资源时,服务器在返回该资源的同时,在Response头部加上Cache-Control,并在Cache-Control中设置过期时间;
  2. 浏览器再次请求访问服务器中的该资源时,先通过请求资源的时间与Cache-Control中设置的过期时间大小计算比较资源是否过期,没过期就是用缓存,过期就重新请求服务器;
  3. 服务器再次收到请求后,会再次更新Response头部的Cache-Control。

4.2 协商缓存

  协商缓存是指服务端通过状态码304告诉客户端可以使用缓存的资源

1.HTTP面试题_HTTP_08

   协商缓存过程:与服务器协商之后,通过协商结果判断是否使用本地缓存。

协商缓存通过两种头部实现:

第一种:请求头部中的if-Modified-Since字段与响应头部中的Last-Modified字段实现

  • 响应头部中的Last-Modified标识响应资源的最后修改时间
  • 请求头部中的If-Modified-Since:当资源过期,如果响应头部中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified;服务器收到请求后比较If-Modified-Since和Last-Modified时间,若Last-Modified时间大,则资源被修改过,服务器返回新资源,HTTP 200 OK;如果if-Modified-Since时间大,说明资源没有被修改过,响应HTTP 304走本地缓存获取资源

第二种:请求头部中的if-None-Match字段和响应头部中的Etag字段

  • 响应头部的Etag唯一标识响应资源
  • 请求头部中的if-None-Match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头中的If-None-Match设置为Etag的值。服务器收到请求后进行对比,如果资源没有变化返回304,如果资源变化重新请求服务器返回200。

两者比较:

  第一种请求头部的If-Modified-Since和响应头部的Last-Modfied是基于时间的,第二种请求头部If-None-Match和响应头部的Etag是基于唯一标识的,相对来说后者能够更加准确地判断文件内容是否被修改,避免由于时间篡改导致不可靠问题

  第一次请求服务器资源时,服务器返回的HTTP响应头部同时由Etag和Last-Modified字段。客户端再次请求的时候,会带上这两个字段访问服务器,这时Etag优先级更高,服务器会先判断Etag是否变化,如果有变化不再判断Last-Modified,如果有变化再烂Last-Modified。

ETag现规定与Last-Modified优点:

  1. 在没有修改改动情况下,Last-Modified可能改变,导致客户端认为文件改动,重新请求服务器;
  2. 能有些文件是在秒级以内修改,而If-Modified-Since检查到的粒度是秒级,使用Etag能够保证在这种需求下客户端在一秒内刷新多次;
  3. 有些服务器不能精准获取文件最后修改时间

注意协商缓存中请求和响应中的两个字段需要配合Cache-Control字段使用,只有在没有命中强制缓存的情况下,才能发起带有协商缓存的字段请求。总体缓存流程图如下:

1.HTTP面试题_状态码_09

使用Etag字段实现协商缓存过程:

  • 当浏览器第一次请求服务器资源时,服务器在返回资源的同时,在其Response头部加上Etag唯一标识,这个标识值是根据当前请求的资源生成的
  • 当浏览器再次请求服务器的资源时,首先会检查强制缓存是否过期:
  • 如果没有过期,直接使用本地缓存;
  • 如果缓存过期,会在Request拖布加上If-None-Match字段,该字段值就是Etag唯一标识
  • 服务器再次收到请求后,会根据请求的If-None-Match值与当前请求的资源生成的唯一标识进行比较:
  • 如果值相等,则返回304 Not Modified,不会返回资源;
  • 如果值不相等,则会返回200状态码和请求资源,并在Respons头部加上新的Etag唯一标识
  • 如果浏览器收到304请求响应状态码,则从本地缓存中加载资源,否则更新资源。

5.HTTP与HTTPS

 

6.HTTP的演变

 

7.参考链接

  本人博客内容是基于小林coding的计算机网络写的,中间省略了部分内容,大家可以去小林coding博客看更详细的图解网络,链接为:小林coding (xiaolincoding.com)

标签:面试题,缓存,HTTP,请求,Modified,服务器,客户端
From: https://blog.51cto.com/u_15839058/6675658

相关文章

  • JVM 面试题
    JVM面试题JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与......
  • 详解Django请求与响应:深入理解Web Http交互的核心机制
    本文深入探讨了Django中的请求与响应处理,从Django请求和响应的基础知识、生命周期,到HttpRequest和HttpResponse对象的详细介绍。同时,讨论了Django的视图和请求、响应处理,以及安全性和异步处理的考虑。最后,对比了Django与Flask、FastAPI等框架在请求响应处理上的异同......
  • C# httpclient获取cookies实现模拟web登录
    目前在公司做一款平台化的产品,我主要负责PC端上的开发,在产品推荐过程中为了节省开发时间很多功能模块没来得及做原生,用CEF嵌入了很多带功能web页面,与客户端进行交互从而实现功能。在二期开发中,产品需求说明书中需要把登录功能放在客户端来做,这当中涉及到一个问题客户端做登入登出......
  • Linux 使用 dup2 无法正常重定向管道 tinyhttpd
    项目地址:https://github.com/pphboy/pihttpd文件p_sys.ctinyhttpd是这样写的但是文档是,旧的在前,新在后intdup2(intoldfd,intnewfd);所以是,才能正常输出和输入dup2(1,in_pipe[1]);dup2(0,out_pipe[0]);......
  • error NU1803: 错误形式的警告: 正在通过 “HTTP” 源“http://apricot.com/repositor
    一、私有仓库错误(vs2022)错误信息errorNU1803:错误形式的警告:正在通过“HTTP”源“http://apricot.com/repository/nuget-group/”运行“restore”操作。将来的版本中将删除非HTTPS访问权限。请考虑迁移到“HTTPS”源。错误截图二、解决&处理打开Nuget配置%APP......
  • 网络2️⃣HTTPS-密钥交换算法
    SSL/TLSHTTPS是在TCP和HTTP之间添加SSL/TLS安全协议,解决HTTP的安全性问题。在HTTP中,通信之前需要进行TLS握手。密钥交换算法:不同密钥交换算法的TLS握手流程不同。RSA:简单,但存在前向安全问题(如果服务端私钥泄漏,过去被第三方截获的所有TLS通讯密文都会被......
  • 浏览器扩展 service-worker中如何访问http请求
    参考:https://stackoverflow.com/questions/71443428/how-can-i-make-an-http-request-in-the-service-worker-chrome-extensionfetch文档:https://developer.mozilla.org/en-US/docs/Web/API/fetch因为service-worker没有没有运行到普通的环境,普通的node库也用不了,所以需要使用......
  • 一文彻底搞懂MySQL基础:B树和B+树的区别 转载 https://blog.csdn.net/a519640026/arti
    写在前面大家在面试的时候,肯定都会被问到MySql的知识,以下是面试场景:面试官:对于MySQL,你对他索引原理了解吗?我:了解面试官:MySQL的索引是用什么数据机构的?我:B+树面试官:为什么要用B+树,而不是B树?我:…面试官:用B+树作为MySql的索引结构,用什么好处?我:…B树和B+树是MySQL索引使用的数据结构......
  • 【应届生面试题】说说你对 final 的理解?
    ......
  • http 和 https区别,自动携带cookie的session对象,响应response,下载图片视频到本地,编码
    1.1自动携带cookie的session对象#session对象----》已经模拟登录上了一些网站---》单独把cookie取出来 -res.cookies-转成字典res.cookies.get_dict()#请求头和数据importrequestsheader={'Referer':'http://www.aa7a.cn/user.php?&ref=http%3A%2F%2......