计算机网络【HTTP 面试题】

HTTP的请求报文结构和响应报文结构

HTTP请求报文主要由请求行、请求头、空行、请求正文(Get请求没有请求正文)4部分组成。

1、请求行

  • 由三部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔
  • 请求方法包括GET、HEAD、PUT、POET、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,出于安全性的考虑也是不同的;
  • 协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1;

2、请求头

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

常见请求头如下:

img

3、空行

请求头的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。

4、请求正文

可选部分,比如GET请求就没有请求正文。

HTTP响应报文主要由状态行、响应头、空行、响应正文4部分组成。

1、状态行

由3部分组成,分别为:协议版本、状态码、状态码描述,之间由空格分隔

2、响应头

与请求头类似,为响应报文添加一些附加信息。

常见响应头如下:

img

3、空行

4、响应正文

常见HTTP首部字段

A、通用首部字段(请求报文与响应报文都会使用的首部字段)

  • Date:创建报文时间
  • Connection:连接的管理
  • Cache-Control:缓存的控制
  • Transfer-Encoding:报文主体的传输编码方式,如Transfer-Encoding: chunked。

B、请求首部字段(请求报文会使用的首部字段)

  • Host:请求资源所在服务器
  • Accept:可处理的媒体类型
  • Accept-Charset:可接收的字符集
  • Accept-Encoding:可接受的内容编码
  • Accept-Language:可接受的自然语言

C、响应首部字段(响应报文会使用的首部字段)

  • Accept-Ranges:可接受的字节范围
  • Location:另客户端重新定向到的URI
  • Server:HTTP服务器的安装信息

D、实体首部字段(请求报文与响应报文的实体部分使用的首部字段)

  • Allow:资源可支持的HTTP方法
  • Content-Type:实体主类的类型
  • Content-Encoding:实体主体适用的编码方式
  • Content-Language:实体主体的自然语言
  • Content-Length:实体主体的字节数
  • Content-Range:实体主体的位置范围

HTTP状态码含义

  • 200 OK 服务器已成功处理了请求并提供了请求的网页。

  • 202 Accepted 已经接受请求,但处理尚未完成。

  • 204 No Content 没有新文档,浏览器应该继续显示原来的文档。

  • 206 Partial Content 客户但进行了范围请求。响应报文中由Content-Range指定实体内容的范围。实现断点续传。

  • 301 Moved Permanently 永久性重定向。请求的网页已永久移动到新位置。

  • 302(或307) Moved Temporatily 临时性重定向。请求的网页临时移动到新位置。

  • 304 Not Modified 未修改。自从上次请求后,请求的内容未修改过。

  • 401 Unauthorized 客户试图未经授权访问受密码保护的页面

  • 403 Forbidden 服务器拒绝请求。

  • 404 Not Found 服务器上不存在客户机所请求的资源。

  • 500 Internal Server Error 服务器遇到一个错误,使其无法为请求提供服务。

HTTP中有关缓存的首部字段有哪些?HTTP的浏览器缓存机制?

Last-Modified和ETags如何帮助提高性能?

聪明的开发者会把Last-Modified和ETags请求的HTTP报头一起使用,这样可利用客户端的缓存。因为服务器首先产生Last-Modified/ETags标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其缓存。

扩展2:既然有了Last-Modified,为什么还要用ETags字段呢?

  • 某些文件修改非常频繁,比如在秒以下的时间内进行修改,If-Modified-Since能检查到的粒度是秒级的,这种修改无法体现。
  • 一些文件也许会周期性的更改,但是它的内容并不改变(仅仅改变修改的时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
  • 某些服务器不能精确的得到文件的最后修改时间。
  • 因此,HTTP/1.1利用Entity Tag 头提供了更加严密的验证。Last-Modified与ETag一起使用时,服务器会优先验证ETag的值。

3、Expires/Cache-Control(优先使用)

用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到服务器取数据。

当服务器发出响应的时候,可以通过两种方式来告诉客户端缓存请求:

第一种是Expires,比如:Expires: Sun, 16 Oct 2016 05:43:02 GMT

不过Expires有缺点,比如说,服务端和客户端的时间设置可能不同,这就会使缓存的失效可能并不能精确地按服务器的预期进行。

第二种是Cache-Control,比如:Cache-Control: max-age=315360000

这里声明的是一个相对的秒数,表示从现在起,315360000秒内缓存都是有效的,这样就避免了服务端和客户端时间不一致的问题。

但是Cache-Control是HTTP1.1才有的,不适用于HTTP1.0,而Expires既适用于HTTP1.0,也适用于HTTP1.1,所以说在大多数情况下,同时发送这两个头回是一个更好的选择,当用户端两种头都能解析的时候,会优先使用Cache-Control。

HTTP1.1和HTTP1.0的区别。(HTTP1.1版本的4个特性)

1、默认持久连接和流水线

HTTP/1.1默认使用持久连接,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,在同一个TCP连接下,可以发送多次HTTP请求。同时,默认采用流水线的方式发送请求,即客户端每遇到一个对象引用就立即发出一个请求,而不必等到收到前一个响应之后才能发出下一个请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送相应结果,以保证客户端能够区分出每次请求的相应内容,这样也显著地减少了整个下载过程所需要的时间。

HTTP/1.0默认使用短连接,要建立长连接,可以在请求消息中包含Connection: Keep-Alive头域,如果服务器愿意维持这条连接,在响应消息中也会包含一个Connection: Keep-Alive的头域。Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次清秋节过后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。

2、分块传输数据

HTTP/1.0可用来指定实体长度的唯一机制是通过Content-Length字段。静态资源的长度可以很容易的确定,但是对于动态生成的响应来说,为获取它的真是长度,只能等它完全生成之后,才能正确地填写Content-Length的值,这便要求缓存整个响应,在服务器端占用大量的缓存,从而延长了响应用户的时间。

3、状态码 100 Continue

HTTP/1.1加入了一个新的状态码 100 Continue,用于客户端在发送POST数据给服务器前,征询服务器的情况,看服务器是否处理POST数据。

4、Host域

HTTP1.1在Request消息头里多了一个Host域,HTTP1.0则没有这个域。在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,这个IP地址上只有一个主机。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。

常用的HTTP方法有哪些?

注意:只有POST和PUT方法才有请求内容。

  • GET:用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
  • POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
  • PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置。
  • HEAD:获得报文首部,与GET方法类似,只是不返回报文主体。
  • DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
  • OPTIONS:查询相应URL支持的HTTP方法。

注意:并非所有的服务器都实现了这几个方法。有的服务器还实现了自己持有的HTTP方法,称为扩展方法。

GET: GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据返回给客户端。GET请求中,永远不会包含呈现数据

HEAD: HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常用GET,但这里用HEAD则意义更加明确。

PUT:这个方法比较少见。本质上来讲,PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST没有,POST的数据存放位置由服务器自己决定

DELETE:删除某一个资源。

POST:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个完成。

OPTIONS:这个方法很有趣,但极少使用。它用于获取当前URL所支持的方法。

TRACE:请求服务器回送收到的请求信息,主要用于测试和判断,所以是安全的。

HTTP的请求方式get和post的区别?

GET一般用于获取或者查询资源信息,这就意味着它是幂等的(对于同一个URL的多个请求返回同样的结果)和安全的(没有修改资源的状态),而POST一般用于更新资源信息,POST既不是安全的,也不是幂等的。

为什么HTTP是无状态的?如何保持状态(会话跟踪技术、状态管理)?

**HTTP无状态:**无状态是指协议对于事务处理没有记忆能力,不能保存每次客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息就都丢掉了。如果用户发来一个新的请求,服务器也无法知道它是否与上次的请求有联系。

**优点:**服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,节省服务器端资源,以更高效地去处理业务。

**缺点:**缺少状态意味着如果后续处理需要前面的信息,则客户端必须重传,这样可能导致每次连接每次连接传送的数据量增大。

针对这些缺点,可以采用会话跟踪技术来解决这个问题。把状态保存在服务器中,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来;这样,就可以定位存储在服务器上的状态信息了。

有四种会话跟踪技术:

  • COOKIE;
  • Session;
  • URL 重写;
  • 作为隐藏域嵌入HTML表单中(隐藏表单域);

在浏览器和服务器之间来回传递一个标识符,这就是所谓的会话(session)跟踪。来自浏览器的所有包含同一个标识符(这里是SESSIONID)的请求同属于一个会话。

HTTP断点续传的原理

要实现断点续传下载文件,首先要了解断点续传的原理。**断点续传其实就是在上一次下载断开的位置开始继续下载。**HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。在以前版本中HTTP协议是不支持断点的,HTTP/1.1开始就支持了,一般断点下载时才用到Range和Content-Range实体头。

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

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

相关文章

全栈架构:从0开始,Vue的搭建与开发

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 然后,很多小伙伴平时聚焦CRUD,没有亮点项目, 黄金项目。 简历也写得是非常lo…

Generalized Focal Loss V1论文解读

摘要 单级检测器基本上将物体检测表述为密集分类和定位(即边界框回归)。分类通常通过Focal Loss进行优化,而边界框的定位通常根据Dirac delta分布进行学习。单级检测器的最新趋势是引入一个单独的预测分支来估计定位质量,预测质量…

【javaSE】代理并不难

代理: 代理模式最主要的就是在不改变原来代码(就是目标对象)的情况下实现功能的增强 在学习AOP之前先了解代理,代理有两种:一种是动态代理,一类是静态代理。 静态代理 相当于是自己写了一个代理类&#…

力扣(leetcode)第257题二叉树的所有路径(Python)

257.二叉树的所有路径 题目链接:257.二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出…

win10和win11上解决乱码的一个优点偏门的方法,不算很完美

左下角搜索控制面板,进入控制面板之后,点击时钟和区域下面的更改日期、时间或数字格式 点击顶上的“管理”选项,然后找到更改系统区域设置,把下方的Beta版:使用Unicode UTF-8提供全球语言支持(U&#xff…

视频批量转码:一键转换多个视频mp4格式到FLV视频

在数字媒体时代,视频格式的多样性给处理工作带来了诸多不便。满足不同的播放需求,经常要视频从一种格式转换为另一种格式。其中,将mp4格式转换为FLV格式的需求很常见。现在一起来看下云炫AI智剪如何高效的将视频批量转码方法,一键…

[Angular] 笔记 21:@ViewChild

chatgpt: 在 Angular 中,ViewChild 是一个装饰器,用于在组件类中获取对模板中子元素、指令或组件的引用。它允许你在组件类中访问模板中的特定元素,以便可以直接操作或与其交互。 例如,如果你在模板中有一个子组件或一个具有本地…

\r\n和缓冲区/进度条小程序

一 前置知识 带有\n就会立马刷新缓冲区(因为显示器是行刷新),\r不会刷新缓冲区 刷新的2个场景: 1 ~fflush 缓冲区中存在\r或\n --> \r fflush --> 不换行的\n) 2 ~ 文件关闭自动刷新缓冲区 倒计时小程序0-9 %-d是左对齐,%d是右对齐 倒计时小程序0-99 …

在Go中使用Goroutines和Channels发送电子邮件

学习如何使用Goroutines和Channels在Go中发送电子邮件 在现代软件开发的世界中,通信是一个关键元素。发送电子邮件是各种目的的常见实践,例如用户通知、报告等。Go是一种静态类型和编译语言,为处理此类任务提供了高效和并发的方式。在本文中&…

BED 文件格式 chip-seq m6a数据可视化会用到

General usage — bedtools 2.31.0 documentationhttps://bedtools.readthedocs.io/en/latest/content/general-usage.html BED格式(Browser Extensible Data format)是一种在生物信息学中广泛使用的文本文件格式,用于描述基因组上的特征和…

机器人中的数值优化之线性共轭梯度法

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文ppt来自深蓝学院《机器人中的数值优化》 目录 1.无约束优化方法对比 2.Hessian-vec product 3.线性共轭梯度方法的步长​编辑 4.共轭梯度…

7.10非递减子序列(LC491-M)

算法: 在90.子集II (opens new window)中我们是通过排序,再去重来达到去重的目的。 而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 肯定还是回溯算法。 画树: 树里面其实有两个注意…

[python]python利用pyaudio录制系统声音没有立体声混音怎么录制系统音频

当电脑没有立体声混音导致Python写代码无法使用pyaudio进行录制系统声音怎么办?查阅资料和安装驱动等方法都不行,难道没办法了吗?那为什么电脑其他软件可以做到呢?因此研究了一下pyaudio在没有立体声混音情况下确实无法录制声音&a…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

Android Matrix画布Canvas旋转Rotate,Kotlin

Android Matrix画布Canvas旋转Rotate&#xff0c;Kotlin private fun f1() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.…

软件开发新手用哪个IDE比较好?软件开发最好的IDE都在这!

目录 IDES 的优点 最佳编程 IDE 列表 Java 开发的流行集成开发环境 JetBrains 的 IntelliJ IDEA NetBeans 适用于 C/ C、C# 编程语言的最佳 IDE Visual Studio 和 Visual Studio 代码 Eclipse PHP 开发的最佳 IDE PHPStorm Sublime Text Atom JavaScript 的顶级 I…

Python:正则表达式速通,码上上手!

1前言 正则表达式&#xff08;Regular Expression&#xff09;是一种用来描述字符串模式的表达式。它是一种强大的文本匹配工具&#xff0c;可以用来搜索、替换和提取符合特定模式的文本。 正则表达式由普通字符&#xff08;例如字母、数字、符号等&#xff09;和元字符&#…

2023 AI开发者生态报告

随着人工智能技术的飞速发展&#xff0c;全球IT市场对AI的投入持续增长&#xff0c;预计到2027年将达到4236亿美元。中国作为AI领域的重要参与者&#xff0c;其投资规模预计将占全球的9%。在这样的背景下&#xff0c;2023年的《AI开发者生态报告》为我们揭示了人工智能时代的技…

Linux的账号及权限管理

一.管理用户账号 1.1 用户账户的分类 1.1.1 用户账号的分类 超级用户&#xff1a;&#xff08;拥有至高无上的权利&#xff09; root用户是Linux操作系统中默认的超级用户账号&#xff0c;对本主机拥有最高的权限&#xff0c;系统中超级用户是唯一的。普通用户&#xff1a; …

centos7.9 TCP 加速

BBR是谷歌开发的新的TCP加速算法&#xff0c;在网络状况不好的服务器上开启TCP的bbr&#xff0c;可以在无需增加任何硬件投入的情况下实现网络加速&#xff0c;并且客户端无需做任何配置&#xff0c;因此使用起来非常的方便。TCP加速对网络状况较好的内网环境&#xff0c;或者大…