IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【HTTP】面试常见HTTP系列的问题 -> 正文阅读

[网络协议]【HTTP】面试常见HTTP系列的问题

1、HTTP的几种请求和方法

Http的几种方法:

get:发送一个请求来取的服务器上的某一资源。

post:向url指定的资源提交数据或附加新的数据。

put:跟post方法很像,也是向服务器提交数据,但它们之间有所不同,put指定了资源在服务器上的位置,而post没有。

head:只请求页面首部。

delete:删除服务器上的某资源

options:它用于获取当前url所支持的方法,如果请求成功,会有一个Allow的头包含类似"get,post"这样的信息。

trace:用于激发一个远程的,应用层的请求消息回路。

connect方法:把请求连接转换到透明的TCP/IP通道。

put和post请求的官方区别分析:

The difference between PUT and POST is that PUT is idempotent: calling it once or several times successively has the same effect (that is no side effect), where successive identical POST may have additional effects, like passing an order several times.

翻译一下,put是幂等的,调用一次或几次会产生相同的效果,没有副作用。但连续相同的post可能会有额外的效果,比如多次传递命令。

get和post的区别分析:

关于W3C给出的官方比较get和post的信息

?(这里衍生出来一个面试问题,为什么登陆要使用post而不是使用get,可以参考它的安全型来回答。)

先说结论但是get和post其实没有实质上的区别,它们只是报文格式不同。get和post只是HTTP协议中两种请求方式,无论是get还是post,都是基于TCP/IP的应用层协议,在传输上没有区别。

让我们回顾一下get和post的报文

get:

GET /test?name=test HTTP/1.1
Host: localhost

post:

POST /test HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

name=test

通过上面的报文可以看出,当没有参数时,get和post的区别仅仅在于报文头的名字不同而已。携带参数时,按照约定,get的参数在url中,post的参数在body中,如果不按照约定,我们也可以使用post方法但是在url上写参数,使用get方法在body里写参数,这需要服务端支持,但并不会报错。所以它们的本质是TCP连接并没有差别。

但是在查阅网络资料时,有小伙伴提到了,它们是有一个重大区别的:get产生一个tcp数据包,post产生两个tcp数据包,我在这里再列一下:

对于浏览器来说,如果发送get请求,浏览器会将http header和data一起发送出去,服务器响应200(返回数据)。如果发post请求,浏览器会先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok (返回数据)。也就是说,post是需要两步的,看起来get比post效率要更高一些。

但并不是所有浏览器都是这样处理,而且get和post都有自己的语义,最好不要混着用,在网络环境好的时候,它们之间的效率差别也可以无视,在网络环境差的时候,两次包的tcp在验证数据包完整性上有非常大的优点。

2、从浏览器输入url到显示页面的步骤

简述:

浏览器根据请求的url交给dns进行域名解析,找到真实ip,向服务器发起请求;

服务器交给后台处理,完成之后返回数据,浏览器接收文件(HTML,JS,CSS,图片等);

浏览器对加载到的资源(HTML.JS,CSS等)进行语法解析,建立对应的内部数据结构(例如HTML的dom);

载入解析到的资源文件,渲染页面。

展开说说这个过程:

在浏览器地址栏输入url,浏览器查看缓存,如果资源未缓存,发起新请求;如果已缓存,检查是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。

检验新鲜通常有两个HTTP头进行控制:Expires和Cache-Control。HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期;HTTP1.1增加了Cache-Control:max-age=,值为以秒为单位的最大新鲜日期。

浏览器解析URL获取协议,主机,端口,path。

浏览器组装一个HTTP请求报文。

浏览器获取主机ip地址,过程如下:

  1. 浏览器缓存
  2. 本机缓存
  3. hosts文件
  4. 路由器缓存
  5. ISP DNS缓存
  6. DNS递归查询(可能存在负载均衡导致每次IP不一样)

打开一个socket与目标IP地址,建立TCP连接,三次握手如下:

  1. 客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口
  2. 服务器发回SYN=1,ACK=X+1,Seq=Y的响应包
  3. 客户端发送ACK=Y+1,Seq=Z

TCP链接建立后发送HTTP请求。

服务器接收并请求解析,将请求转发到服务程序,如虚拟主机使用HTTP Host头部判断请求的服务程序。

服务器检查HTTP请求头是否包含缓存验证信息,如果验证缓存新鲜,返回304等对应状态吗。

处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作。

服务器将响应报文通过TCP连接发送回浏览器。

浏览器接收HTTP响应,然后根据情况选择关闭TCP连接或者保留重用,关闭TCP连接的四次挥手如下:

  1. 主动方发动Fin=1,Ack=Z,Seq=X报文
  2. 被动方发送ACK=X+1,Seq=Z报文
  3. 被动方发送Fin=1,ACK=X,Seq=Y报文
  4. 主动方发送ACK=Y,Seq=X报文

浏览器检查响应状态码,是否为1XX,3XX,4XX,5XX,这些情况与2XX不同。

如果资源可以缓存,进行缓存。

对响应进行解码(例如gzip压缩)。

根据资源类型决定如何处理(假设资源为HTML文档)。

解析HTML文档,构建DOM树,下载资源,构造CSSOM树,执行js脚本,这些操作没有严格的先后顺序,以下分解释:

构建DOM树:

  1. Ttokenizing:根据HTML规范将字符流解析为标记。
  2. Lexing:词法分析将标记转换为对象并定义属性和规则。
  3. Dom construction:根据HTML标记关系将对象组成DOM树。

解析过程中遇到图片、样式表、js文件,启动下载。

构建CSSOM树:

  1. Tokenizing:字符流转换为标记流。
  2. Node:根据标记创建节点。
  3. CSSOM:节点创建CSSOM树。

根据DOM树和CSSOM树构建渲染树:

  1. 从DOM树的根节点遍历所有可见节点。(不可见节点包括script,meta,和被css隐藏的节点,例如display:none)
  2. 对每一个可见节点,找到恰当的CSSOM规则并应用。
  3. 发布可视节点的内容和计算样式。

JS解析如下:

浏览器创建Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading。

HTML解析器遇到没有async和defer的script时,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执行时解析器会暂停,这样就可以用document.writer()把文本插入到输入流中。同步脚本经常简单定义函数和注册事件处理程序,它们可以遍历和操作script和它们之前的文档内容。

当解析器遇到了设置async的script时,开始下载脚本并继续解析文档,脚本会在它下载完成后尽快执行,但解析器不会停下来等它下载。异步脚本禁止使用document.writer(),它们可以访问自己的script和之前的文档内容。

当文档完成解析,document.readState变成interactive。

所有defer脚本会按照在文档出现的顺序执行,延迟脚本能访问完成文档树,禁止使用document.writer()。

浏览器在Doducment对象上触发DOMContentLoaded事件。

此时文档完全解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入并且所有异步脚本完成载入和执行,document.readState变成complete,window触发load事件。

显示页面。(HTML解析过程中会逐步显示页面)

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:52:51  更:2021-10-11 17:53:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/29 18:50:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码