当前位置: 首页 > news >正文

【面经】HTTP篇

计算机网络是面试必考的内容之一,本篇为大家整理关于HTTP的几道面试题。
⭐码字不易,求个关注⭐
⭐点个收藏不迷路哦~⭐
你的支持是我持续学习的动力~

在这里插入图片描述

文章目录

    • HTTP基本概念
      • HTTP是什么?
      • HTTP常见字段?
      • HTTP常见状态码?
    • GET与POST
      • GET与POST有什么区别?
      • GET与POST都是安全或幂等的吗?
    • HTTP缓存技术
      • HTTP缓存有哪些实现方式?
    • HTTP特性
      • HTTP(1.1)的优点有哪些?
      • HTTP(1.1)的缺点有哪些?
      • HTTP(1.1)的性能如何?
    • HTTP与HTTPS
      • HTTP与HTTPS有哪些区别?
      • HTTPS解决了HTTP的哪些问题?

HTTP基本概念

HTTP是什么?

HTTP是超文本传输协议,也就是HyperText Transfer Protocol。

具体来说,HTTP协议是在计算机网络中的两点之间传输超文本的一种约定和规范。

HTTP常见字段?

  • 通用首部字段

    • Cache-control字段:该字段可以控制缓存的行为
    • Connection字段:最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive
  • 请求首部字段

    • Host字段:发送请求时,指定服务器的域名。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段
    • Accept字段:Accept 首部字段可通知服务器,客户端能够处理的媒体类型及媒体类型的相对优先级。
  • 响应首部字段

    • ETag字段:首部字段 ETag 能告知客户端、资源的标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag值。
    • Location字段:该字段会配合 3xx 的响应码,提供客户端重定向的URL。
  • 实体首部字段

    • Allow字段:用于通知客户端能够支持的所有 HTTP 方法。
    • Content—Length字段:表明本次回应的数据长度。
    • Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式。
    • Content-Encoding 字段:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式。

HTTP常见状态码?

2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

  • 200 OK」是最常见的成功状态码,表示一切正常

  • 204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但没有返回实体内容

  • 206 Partial Content」该状态码表示客户端进行了范围请求,而服务器成功执行了部分的GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

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

  • 301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

  • 302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

    301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

  • 304 Not Modified」协商缓存时,该状态码表示资源未被修改,客户端可以继续使用缓存资源,用于缓存控制。

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

  • 400 Bad Request」表示客户端请求报文中有语法错误

  • 401 Unauthorized」该状态码表示客户端发送的请求需要有通过 HTTP 认证的认证信息(可能服务器会发送一个基于表单的认证信息,来确认用户身份)。另外若之前已进行过 1 次请求,则表示用户认证失败。

  • 403 Forbidden」表示服务器禁止访问资源,比如未获得文件系统的访问授权,访问权限出了问题。

  • 404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

  • 405」自己手写Servlet时遇到,请求方法不匹配。访问浏览器默认是get方法。如果Servlet写的是doPost方法,就会报错。

5xx 类状态码表示服务器处理时内部发生了错误,属于服务器端的错误码。

  • 500 Internal Server Error」该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。

  • 501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。

  • 502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

  • 503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

GET与POST

GET与POST有什么区别?

GET 的语义是请求获取指定的资源。GET 请求的参数位置一般是写在 URL 中。

POST 的语义是向指定的资源提交处理的数据,比如表单的add操作,需要在表单中指明使用post方法。Post通过表单提交,不会显示在URL上。

GET与POST都是安全或幂等的吗?

  • 「安全」是指请求方法不会修改服务器上的资源
  • 「幂等」是指多次执行相同的操作,结果都是「相同」的。
  • GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。
    另外,我们也可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。
  • POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。

HTTP缓存技术

HTTP缓存有哪些实现方式?

使用缓存,可以避免重复发送HTTP请求。主要有两种实现方式,分别是强制缓存协商缓存

  • 强制缓存

    定义:只要浏览器的缓存资源没有过期,就直接使用浏览器的本地缓存。不会访问服务器。是否使用缓存由浏览器这边控制。

    要实现强制缓存的话,是利用两个字段实现的:
    Cache-controlExpires
    如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control的优先级高于 Expires 。建议使用Cache-Control 来实现强缓存。

    浏览器如何判断是否使用缓存?

    • 浏览器第一次请求服务器资源时,服务器会在返回资源的同时,在响应头加上Cache-control设置过期时间大小。
    • 浏览器再次请求服务器中的该资源时,会先比较请求资源的时间和Cache-Control 中的过期时间的大小,计算是否过期,如果没有,则使用该缓存,否则进行协商缓存。
    • 服务器收到请求后,会再次更新响应头的Cache-Control。

    HTTP状态码:

    • 200 (form memory cache) : 不访问服务器,一般已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。
    • 200( from disk cache): 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。
  • 协商缓存

    当浏览器本地的缓存过期,浏览器就会向服务器发送请求,之后由服务器告知客户端是否可以使用缓存【304(继续使用本地缓存)/200(更新缓存)】,这种方式就是协商缓存。通过协商结果来判断是否使用本地缓存。

  • 协商缓存的两种头部实现方式

    1. 请求头部的If-Modified-Since和响应头部的Last-Modified
    2. 请求头部的If-None-Match和响应头部中的Etag字段。
  • 第一种头部实现的具体方式 ?

    当本地资源过期了,发现响应中出现Last-Modified,那么第二次请求就会带上这个时间,服务器把last-ModifiedIf-Modified-Since两个时间进行对比,如果最后修改的时间(last-Modified)比较新,就返回最新的资源。否则就返回状态码304,继续使用本地缓存。

  • 第二种头部实现的具体方式?

    当本地资源过期时,发现响应中出现Etag,那么第二次向服务器发送请求时,会将请求头If-None-Match设置为Etag的值。服务器收到请求后进行对比,资源没有变化则返回304,如果变化,则返回新的资源和状态码200。

  • 同时有EtagLast-Modified

    Etag的优先级更高,因为Etag能解决Last-Modified难以解决的问题。

    1. 文件没变,但是有可能最后修改时间改变了·。
    2. If-Modified-Since检查的粒度是秒级的,如果文件在1秒以内进行修改,无法使用。
    3. 服务器可能并不能准确获取文件的最后修改时间。

最后注意:协商缓存都必须配合强制缓存中的Cache-control来使用,只有不能使用强制缓存时,才可以用协商缓存。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bsqic75s-1663388330896)(C:\Users\不知名网友鑫\AppData\Roaming\Typora\typora-user-images\image-20220914005931460.png)]

HTTP特性

HTTP(1.1)的优点有哪些?

HTTP最突出的优点是:简单、灵活和易于拓展、应用广泛和跨平台。

  1. 简单

    报文格式就是请求行、请求头、请求体。头部信息也是key-value的文本形式,易于理解。

  2. 灵活和易于扩展

    灵活:各种请求方法、URL、头部字段都没有固定,开发人员可以自定义。

    易于扩展:HTTP工作在应用层,它的下层可以随意变化,比如HTTPS就是在HTTP与TCP层之间增加SSL/TLS安全传输层。(注:TLS(传输层安全)是更为安全的升级版 SSL。由于 SSL 这一术语更为常用,因此我们仍然将我们的安全证书称作 SSL。)

  3. 应用广泛

    应用领域:从简单的Web网页,各种浏览器或者APP等,处处都在用HTTP。

    开发领域:不限定编程语言或者操作系统,具有跨语言,跨平台的优越性。

HTTP(1.1)的缺点有哪些?

  • 缺点/优点:无状态

    无状态的坏处:完成有关联性的操作时会很麻烦,比如用户从登录到下单支付的一系列操作,如果是无状态请求,用户的每一次操作都需要验证身份。

    无状态的好处:不需要额外的资源记录状态信息,减轻服务器端压力。

  • 缺点:不安全

    • 通信使用明文,虽然方便阅读,但是内容可能被窃听。
    • 不验证通信方的身份,有可能遭遇伪装。
    • 无法验证报文完整性。
  • Cookie技术:
    现在可以使用Cookie技术来解决HTTP无状态的问题。
    第一次客户端发送没有Cookie的信息,服务器就生产一个Cookie,在响应中返回。

    第二次客户端发送的请求就会带上Cookie。服务器进行检查Cookie,确认身份,之后进行响应。

HTTP(1.1)的性能如何?

  1. 长连接

    HTTP/1.1实现了长链接,不需要每次请求都重新建立和断开TCP连接。减轻了服务器端的压力。性能得到一个提升。

  2. 管线化网络传输

    也就是同一个TCP连接中,发出一个HTTP请求,可以不用等待服务器做出响应,直接发送另一个请求。也是可以提高性能。

    但是服务器必须按照接收请求的顺序发送对这些管道化请求的响应

    队头阻塞

    如果某一个请求处理的耗时较长,就会出现队头阻塞。后面的所有请求都不能进行响应。HTTP/1.1只解决了请求的队头阻塞,没有解决响应的队头阻塞。

    需要注意的是,HTTP/1.1的性能一般,HTTP/2 和 HTTP/3 就是在优化 HTTP 的性能。

HTTP与HTTPS

HTTP与HTTPS有哪些区别?

  1. 建立连接方面:
    HTTP建立连接比较简单,只需要TCP三次握手后便可以进行进行HTTP报文传输;
    HTTPS在经过TCP三次握手后,还需要进行SSL握手过程,才可以进行报文加密传输。
  2. 传输数据方面:
    HTTP的传输是明文传输,存在安全问题。
    HTTPS在TCP层和HTTP层之间加入了SSL安全协议,可以使报文加密传输。
  3. HTTPS协议需要申请CA证书,确保服务器的身份。
  4. 两者端口号也不同,HTTP是80,HTTPS是443。

HTTPS解决了HTTP的哪些问题?

  1. 保证了信息的机密性
    HTTPS采用混合加密的方式实现信息的机密性。
    使用非对称加密的方式来交换[会话密钥]。在通信过程中使用对称加密的形式来加密明文数据。

    这样做的原因?

    • 对称加密共同使用一个密钥。运算速度快。但是必须确保密钥的保密性。

    • 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发,私钥保密,解决了密钥交换问题。但是速度比较慢。

  2. 保证传输内容不被修改
    使用摘要算法计算出内容的哈希值,再使用数字签名算法(非对称加密),对哈希值进行加密。

  3. 身份验证
    首先,服务器把自己的公钥登录到数字证书认证机构,由数字证书认证机构用自己的私钥,去签发公钥证书(CA证书)来确保公开密钥的真实性。
    其次,客户端收到数字证书后,用CA的公钥来确认证书的真实性。最后客户端使用服务器的公钥进行进一步会话。

相关文章:

  • web自动化测试(selenium.webdriver)
  • grpc和protobuf在一起
  • 1. HelmTemplate 3分钟将项目打包成Helm Chart并部署至k8s
  • 【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量
  • Redis 备份恢复(持久化)手册
  • 【Linux】01-Linux系统CentOS7虚拟机VMware安装保姆级教程
  • Go语言各种扩容机制(防止混淆)
  • Pytorch深度学习——线性回归实现 04(未完)
  • 虚拟内存、锁页内存、内存分页、分段、段页式内存管理(超详细)
  • 【BOOST C++】教程4:常量和宏
  • 不可以涩涩!AI续写软件初体验;迁移学习路线图;谷歌新闻非官方搜索API;CS295『因果推理』2021课程资料;前沿论文 | ShowMeAI资讯日报
  • 高项_第十四章信息文档管理与配置管理
  • 07 nginx 的 worker process 的调试
  • 时间序列预测:用电量预测 04 Std_Linear(多元线性回归算法 数据标准化)
  • boost之跨平台 错误处理
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Angular 响应式表单之下拉框
  • Java 多线程编程之:notify 和 wait 用法
  • mysql外键的使用
  • Shell编程
  • Spring Boot MyBatis配置多种数据库
  • vue 个人积累(使用工具,组件)
  • 半理解系列--Promise的进化史
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于Vue2全家桶的移动端AppDEMO实现
  • ------- 计算机网络基础
  • 理清楚Vue的结构
  • 区块链技术特点之去中心化特性
  • 译自由幺半群
  • 原生Ajax
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 阿里云服务器购买完整流程
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • # 安徽锐锋科技IDMS系统简介
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (12)Linux 常见的三种进程状态
  • (30)数组元素和与数字和的绝对差
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (五)关系数据库标准语言SQL
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net的socket示例
  • .NET简谈设计模式之(单件模式)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Autowired和@Resource的区别
  • [17]JAVAEE-HTTP协议
  • [2016.7 test.5] T1
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)