一. HTTP协议
- GET和POST的请求的区别
- 应用场景:GET请求是一个幂等的请求,一般GET请求用于对服务器资源不会产生影响的场景,比如请求一个网页的资源。而POST不是一个幂等的请求,一般用于对服务器资源产生影响的场景,比如注册用户。
- 是否缓存:一般会对GET请求缓存,不会对POST请求缓存
- 发送的报文格式:GET请求的报文中实体部分为空,POST请求的报文中实体部分一般为向服务器发送的数据
- 安全性:GET请求将请求的参数放入url中向服务器发送,相对POST请求来说不太安全,因为请求的url会被保存到浏览器的历史记录中
- 请求长度:浏览器由于对url长度的限制,所以会影响GET请求发送数据时的长度
- 参数类型:POST的参数传递支持更多的数据类型,而GET请求仅支持ASCII码
- POST和PUT请求的区别
- PUT请求是向服务器端发送数据,从而修改数据内容,但是不会增加数据的种类等,可以理解为更新数据
- POST请求是向服务器端发送数据,但是会改变数据的种类等资源,它会创建新的内容,可以理解为创建数据
- 常见的HTTP请求头和响应头
-
HTTP Request Header常见的请求头:
- Accept:浏览器能处理的内容类型
- Accept-Charset:浏览器能显示的字符集
- Accept-Encoding:浏览器能处理的压缩编码
- Accept-Language:浏览器当前设置的语言
- Connection:浏览器与服务器之间连接的类型
- Cookie:当前页面设置的Cookie
- Host:发出请求的页面所在的域
- Referer:发出请求的页面的URL
- User-Agent:浏览器的用户代理字符串
-
HTTP Responses Header常见的响应头:
- Date:表示消息发送的时间
- server:服务器名称
- Connection:浏览器与服务器之间连接的类型
- Cache-Control:控制HTTP缓存
- content-type:表示后面的文档属于什么类型,常见的Content-Type属性值:
- application/x-www-form-urlencoded:浏览器的原生form表单,提交数据放在body
- multipart/form-data:表单上传文件时使用
- application/json:服务器消息主体是序列化后的JSON字符串
- text/html:提交XML格式的数据
- HTTP状态码304是多好还是少好 服务器为了提高网站访问速度,会对之前访问的部分页面指定缓存机制,当客户端在对这些页面进行请求,服务器会根据缓存内容判断页面与之前是否相同,若相同便直接返回304,此时客户端调用缓存,不会进行二次下载
产生较多304状态码的原因:
- 页面更新周期长或不更新
- 纯静态页面或强制生成静态html
304状态码过多会造成以下问题:
- 网站快照停止
- 收录减少
- 权重下降
- 常见的HTTP请求方法
- GET:向服务器获取数据
- POST:将实体提交到指定的资源,会造成服务器资源的修改
- PUT:上传文件,更新数据
- DELETE:删除服务器上的对象
- HEAD:获取报文首部,不返回报文主体部分
- OPTIONS:询问支持的请求方法,用于跨域请求
- CONNECT:要求与代理服务器之间建立通信隧道,使用隧道进行TCP通信
- OPTIONS请求方法及使用场景
- 获取服务器支持的所有HTTP请求方法
- 用来检查访问权限
- HTTP1.0和HTTP1.1之间有哪些区别?
- 连接方面:http1.0默认使用非持久连接,而http1.1默认使用持久连接。http1.1通过使用持久连接来使多个http请求复用同一个TCP连接,避免使用非持久连接时每次需要的建立连接的时延
- 资源请求方面:http1.0会将整个对象传到服务器,而http1.1在请求头中引入了range,允许只请求资源的某个部分
- 缓存方面:在http1.0中使用header中的If-Modified-Since,expires来判断缓存;http1.1引入了更多缓存控制策略,例如etag,cache-control等缓存头
- http1.1新增了host字段,用来指定服务器的域名
- http1.1相对http1.0增加了许多请求方法,如put,head,options等
- HTTP1.1和HTTP2.0的区别
- 二进制协议:HTTP1.1中,报文的头信息必须是文本,数据体可以是文本,也可以是二进制。HTTP2是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧。每个请求对应一个数据流,每个数据流有一个独一无二的编号。数据包发送时,都必须标记数据流ID,用来区分它属于哪个数据流
- 多路复用:HTTP2实现了多路复用,避免了队头阻塞问题
- 头信息压缩:一方面,头信息使用gzip或compress压缩;另一方面,客户端和服务器同时维护一张头信息表,所有字段会存入该表,生成一个索引号,后续无须发送数据,直接使用索引号就可以了
- 服务器推送:HTTP2允许服务器未经请求,主动向客户端发送资源,这叫服务器推送。都是推送的静态资源,可以减少延迟时间
队头阻塞:HTTP是基于请求-应答的模式,队列里的请求没有优先级,只有入队的先后顺序,排在最前面的请求会被优先处理,如果因为队首的请求处理太慢耽误了时间,会造成队头阻塞的现象。
- HTTP和HTTPS协议的区别
- HTTPS协议需要CA证书,费用较高;而HTTP协议不需要
- HTTP协议是超文本传输协议,信息是明文传输的,HTTPS则是具有安全性的SSL加密传输协议
- 端口号不同,HTTP协议端口是80,HTTPS协议端口是443
- HTTP协议连接很简单,是无状态的;HTTPS协议是具有SSL和HTTP协议构建的可进行加密传输,身份认证的网络协议,比HTTP更加安全
-
当浏览器中输入url到页面渲染发生了什么?
-
解析url:先判断是否合法,如果不合法,则进行搜索引擎
-
缓存判断:浏览器会判断请求的资源是否在缓存里,如果请求的资源在缓存中并且没有失效,那么直接使用,否则向服务器发起新的请求
-
DNS解析:
- 首先判断本地是否有该域名的IP地址的缓存,如果有则使用,如果没有则向本地DNS服务器发起请求
- 本地DNS服务器也会检查是否存在缓存,如果没有则先向根域名服务器发起请求,获得顶级域名服务器的地址
- 再向顶级域名服务器查询,获得权威域名服务器的地址
- 再向权威域名服务器查询,最终获得域名的IP地址后,本地DNS服务器将这个IP地址返回给请求用户,同时将其缓存起来
-
TCP三次握手:
- 客户端向服务器发送一个SYN连接请求报文段和一个随机序号
- 服务器收到请求后,向客户端发送一个SYN ACK报文段,确认连接请求,并且向客户端发送一个随机序号
- 客户端收到确认应答后,进入连接建立的状态,同时向服务器发送一个ACK确认报文段,服务器收到确认后,也进入连接建立状态,此时双方的连接就建立起来了
-
HTTPS握手:还要存在一个TLS的四次握手过程
- 客户端向服务器发送使用的协议版本号,一个随机数和可以使用的加密方法。
- 服务器收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。
- 客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用数字证书中的公钥对随机数加密,发送给服务器,并且还会提供一个前面所有内容的hash值供服务器检验。
- 服务器接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的hash值供客户端检验。
- 这个时候双方都有三个随机数,按照之前约定的加密方法,使用这三个随机数生成一把密钥,以后双方通信都使用这个密钥进行加密后传输。
-
返回数据:服务器会返回一个html文件作为响应,浏览器收到响应后,开始对html文件进行解析,开始页面的渲染过程
-
页面渲染:
- DOM树构建,对html进行解析,对字符进行词法分析生成token,对token进行语法分析转成dom节点对象,dom解析会维护一个解析栈,栈底为document,也就是树的根节点
- CSSOM规则数构建,首先将CSS格式化成StyleSheets,然后对计算好的样式进行标准化操作,样式计算规则主要有层叠和继承。
- layout布局,首先创建布局树,遍历DOM中的节点,将可见节点添加到布局树中,根据DOM结构和元素样式对布局树中的几何位置信息进行计算
- 分层,因为脱离文档流的对象会形成一个层叠上下文,也就是分层的概念,主线程会为每个图层进行计算样式,把一个图层拆分成许多绘制指令
- 栅格化,针对分层后的图层进行栅格化处理,放到gpu中处理
- 合成与显示
-
TCP四次挥手
- 客户端向服务器发送连接释放的请求
- 服务器收到后,会告诉应用层释放TCP连接,然后发送ACK包,进入CLOSE_WAIT状态,客户端到服务器的连接已经释放,但是服务器可以发送数据给客户端,当服务器没有数据发送时会向客户端发送连接释放请求
- 客户端收到释放请求后,向服务器发送确认应答,此时客户端进入TIME_WAIT状态。这个状态会持续2MSL时间,若该时间段内没有服务器的重发请求的话,就会进入CLOSED状态
- 服务器收到确认应答后,进入CLOSED状态
-
-
keep-alive的理解
- http1.0中默认是短连接,也就是每次请求应答后,客户端和服务器都要重新建立一个连接,完成之后立即断开连接。
- http1.1默认使用长连接,允许请求和应答的HTTP管道化
- 页面有多张图,HTTP是怎样的加载表现?
- 在http1下,浏览器对一个域名下最大TCP连接数为6,所以会请求多次
- 在hhtp2下,可以一瞬间加载出来很多资源,因为http2支持多路复用,可以在一个TCP连接中发送多个HTTP请求
- HTTP2的头部压缩算法是怎样的?
- 采用HPACK算法,在客户端和服务端两端建立字典,用索引号来表示字符,采用哈夫曼编码来压缩整数和字符串,可以达到50-90的压缩效率
- HTTP请求报文是什么样的?
请求报文由4部分组成
- 请求行(请求方法,URL字段,HTTP协议版本)
- 请求头部(关键字/值)
- 空行
- 请求体(post/put等请求携带的数据)
- HTTP响应报文是什么样的?
- 响应行
- 响应头
- 空行
- 响应体
- HTTP协议的优点和缺点?
具有以下优点:
- 支持客户端/服务器模式
- 简单快速:只需要请求方法和路径,由于HTTP协议简单,使得HTTP通信速度很快
- 无连接:每次连接只处理一个请求,服务器处理完客户端请求后,收到应答后会立即断开连接
- 无状态:通信过程不保存上下文信息
- 灵活:可以传输任意类型的数据对象
具有以下缺点:
- 无状态:不会保存客户的任何信息
- 明文传输:报文使用的是文本形式,不安全
- 不安全
- 说一下HTTP3.0
HTTP3基于UDP实现了类似TCP的多路复用数据流,传输可靠性等功能
- 流量控制,传输可靠性功能:在UDP上增加了一层来保证数据的可靠性,提供了数据包重传机制,拥塞控制
- 集成TLS的加密功能
- 多路复用,同一物理连接上可以有多个独立的逻辑数据流
- 快速握手,基于UDP
- 队头阻塞的解决方案?
- 并发连接,将一个域名分配多个长连接
- 域名分片,将域名分出很多二级域名
- URL有哪些组成部分?
- 协议:http,https
- 域名:www.asas.com
- 端口::9000
- 虚拟目录:/aas/sadas
- 文件名:/index.html
- 锚部分:从#开始到最后
- 参数:?开始到#结束
- 与缓存相关的HTTP请求头有哪些?
强缓存:
- Expires:存在于服务器响应头中,**服务器的时间和浏览器的时间可能并不一致**会导致过期时间不准确
- Cache-Control:采用了过期时长,对应的字段是max-age。no-cache会直接跳过强制缓存,走协商缓存
协商缓存:
- Last-Modified,If-Modified-Since:服务器在响应头中加入Last-Modified,表示最后修改时间,浏览器接收到后,如果再次请求,会在请求头中携带`If-Modified-Since`字段,这个字段的值也就是服务器传来的最后修改时间。如果请求头中的这个值小于最后修改时间,说明是时候更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。否则返回304,告诉浏览器直接用缓存。
- Etag,If-None-Match:`ETag` 是服务器根据当前文件的内容,给文件生成的唯一标识,只要里面的内容有改动,这个值就会变。服务器通过`响应头`把这个值给浏览器。浏览器接收到`ETag`的值,会在下次请求时,将这个值作为**If-None-Match**这个字段的内容,并放到请求头中,然后发给服务器。服务器接收到**If-None-Match**后,会跟服务器上该资源的**ETag**进行比对:如果两者不一样,说明要更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。否则返回304,告诉浏览器直接用缓存。
二. HTTPS协议
- 什么是HTTPS协议
超文本传输安全协议。HTTP+TLS的协议。HTTPS主要目的是对服务器的身份认证,保证数据的隐私性和完整性。
HTTP协议采用明文传输信息,存在信息窃听,信息篡改和信息劫持的风险,而协议TLS具有身份认证,信息加密和完整性校验的功能。
TLS层的主要作用是对发起HTTP请求的数据进行加密操作和对接收到的HTTP内容进行解密操作
- TLS/SSL的工作原理
TLS的功能实现主要依赖三类基本算法:散列函数hash,对称加密,非对称加密,这三类算法的主要作用如下:
- 基于散列函数验证信息的完整性
- 对称加密算法采用协商的密钥对数据加密
- 非对称加密实现身份验证和密钥协商
- 数字证书是什么?
- 因为没有办法确认得到的公钥一定是安全的公钥,所以有了数字证书这个概念
- 数字证书的过程
- 首先使用一种hash算法来对公钥和其他信息进行加密,生成一个信息摘要
- 让有公信力的认证中心用它的私钥对信息摘要进行加密,形成签名。
- 将原始信息和签名合在一起,称为数字证书。
- 接收方收到数字证书后,先根据原始信息使用相同的hash算法生成一个摘要,然后使用认证中心的公钥来对数字证书中的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,就可以知道得到的信息是否被更改了
-
HTTPS通信过程
- 客户端向服务端发送请求,请求中携带协议版本号,生成的一个随机数,客户端支持的加密方法
- 服务端收到请求后,确认双方使用的加密方法,并给出CA证书,以及一个服务器生成的随机数
- 客户端收到CA后,先验证其有效性,然后生成一个新的随机数,并使用CA中的公钥加密这个随机数,然后发给服务器。
- 服务器使用私钥解密客户端发送过来的随机数
- 客户端和服务端使用约定好的加密方法对三个随机数进行加密,生成对话密钥,以后对话都通过这个密钥进行加密信息
-
HTTPS的特点
HTTPS的优点如下:
- 使用HTTPS协议可以认证用户和服务器,确认数据发送到正确的客户端和服务端
- 使用HTTPS协议可以进行加密传输,身份认证,通信更加安全,确保数据的安全性
- HTTPS是目前最安全的解决方案
HTTPS协议的缺点如下:
- HTTPS需要客户端和服务端双方进行加密解密处理,耗费更多的服务器资源,过程复杂
- HTTPS协议握手阶段比较费时,增加页面的加载时间
- SSL证书费用比较高
- HTTPS连接服务器端资源占用较高
- SSL证书需要绑定IP
三. HTTP状态码
状态码的类别
| 类别 | 原因 | 描述 |
|---|---|---|
| 1xx | 信息状态码 | 接受的请求正在处理 |
| 2xx | 成功状态码 | 请求正常处理完毕 |
| 3xx | 重定向状态码 | 需要进行附加操作完成请求 |
| 4xx | 客户端错误状态码 | 服务器无法处理请求 |
| 5xx | 服务器错误状态码 | 服务器处理请求出错 |
-
2xx(成功状态码)
- 200 OK.
- 204 No Content. 正常处理请求,但是没有返回的内容
- 206 Partial Content. 范围请求
-
3xx(重定向状态码)
- 301 Moved Permanetly. 永久重定向,请求资源被分配了新的URI,以后应使用资源指定的URI
- 302 Found. 临时重定向,希望用户本次使用新的URI访问资源。
- 304 Not Modified. 浏览器缓存相关,告诉客户端有缓存,直接使用缓存中的数据。
- 307 Temporary Redirect. 临时重定向,不会从POST变成GET
-
4xx(Client Error客户端错误状态码)
- 400 Bad Request. 请求报文中存在语法错误
- 401 Unauthorized. 表示需要通过HTTP认证的认证信息
- 403 Forbidden. 请求资源的访问被服务器拒绝
- 404 Not Found. 服务器上无法找到请求的资源
-
5xx(Server Error 服务器错误状态码)
- 500 Internal Server Error. 服务端在执行请求时发生了错误
- 502 Bad Gateway. 从上游服务器接收到的响应是无效的
- 503 Service Unavaliable. 表明服务器处于超载
- 504 Gateway Timeout. 运行超时错误
-
同样是重定向,307,303,302的区别?
- 302是http1.0协议状态码
- 303和307是http1.1协议状态码,307不会将请求从post更改为get,303明确客户端采用get请求方法,302会将请求方法从post改成get
四. DNS协议介绍
-
DNS协议是什么
- 概念:dns域名系统,提供一种主机名到ip地址的转换服务。
- 作用:将域名解析为ip地址
-
DNS同时使用UDP和TCP协议?
- 区域传输使用TCP
- 域名解析使用UDP
-
DNS完整的查询过程
- 首先会在浏览器本地缓存中查找对应的IP地址,如果找到直接返回,找不到继续下一步
- 将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查询到,就直接将结果返回,若找不到继续下一步
- 本地DNS服务器向根域名服务器发起请求,根域名服务器会返回一个查询到的顶级域名服务器地址
- 本地DNS服务器向顶级域名服务器发起请求,顶级域名服务器会返回一个查询到的权威域名服务器地址
- 本地DNS服务器向权威域名服务器发送请求,返回对应的IP地址
- 本地DNS服务器将返回的结果保存在缓存中
- 本地DNS服务器将IP地址返回给浏览器
-
迭代查询与递归查询
一般我们向本地DNS服务器发送请求的方式就是递归查询,因此我们只需要发出一次请求,而本地DNS服务器向其他域名服务器请求的过程是迭代查询的过程
五. 网络模型
- OSI七层模型
- 应用层:为应用程序提供服务(http,https,smtp,pop3,ftp)
- 表示层:数据格式转化,数据加密
- 会话层:建立,管理和维护会话
- 传输层:建立,管理和维护端到端的连接(udp,tcp)
- 网络层:IP地址及路由选择
- 数据链路层:提供介质访问和链路管理
- 物理层:物理层
- TCP/IP五层协议
- 应用层:http,ftp,dns,smtp
- 传输层:tcp(面向连接的,可靠的数据传输服务,报文),udp(面向无连接的,尽最大努力的,不可靠的数据传输服务,数据报)
- 网络层
- 数据链路层
- 物理层
六. TCP与UDP
- TCP和UDP的概念及特点
UDP的特点:
- 面向无连接的,想发送数据就可以直接发送数据
- 有单播,多播和广播的形式
- 面向报文,发送来自应用程序的报文
- 不可靠性,第一点是由于它是无连接,想发就发;第二点是UDP不存在拥塞控制,所以会在网络不好时,丢失数据包
- 头部开销小,只需要8字节,相对比TCP的20字节要少的多
TCP的特点:
- 面向连接的,三次握手,建立可靠的连接
- 仅支持单播传输,点对点传输
- 面向字节流
- 可靠传输,给每个包一个序号,同时序号也保证传到接收端实体的包的按序接收;接收成功会回一个相应的确认
- 拥塞控制,面对网路出现拥塞时,会减小速率和数量,缓解拥塞
- 提供全双工通信
- TCP与UDP的区别
- 是否连接:TCP面向连接,UDP面向无连接
- 是否可靠:TCP是可靠传输(数据顺序和正确性),使用流量控制和拥塞控制;UDP是不可靠传输,不使用流量控制和拥塞控制
- 连接对象个数:TCP只能是一对一通信,UDP支持一对一,一对多,多对一,多对多通信
- 传输方式:TCP面向字节流;UDP面向报文
- 首部开销:TCP首部最小20字节;UDP首部开销小,仅8字节
- 使用场景:TCP用于文件传输,UDP用于实时应用,比如视频会议,直播等
- TCP的重传机制
- 基于时间
- 基于确认信号
- TCP的拥塞控制机制
- 慢启动:开始时不要发送大量数据,而是先测试一下网络的拥塞程度,由小到大增加拥塞窗口的大小
- 拥塞避免:在拥塞阶段控制拥塞窗口为线性增长,使网络不易出现阻塞
- 快速重传:在收到一个失序的报文段后立即发出重复确认
- 快速恢复:发送方连续收到三个重复确认时,就执行乘法减小算法,把拥塞门限减半
- TCP的流量控制机制
- 采用大小可变的滑动窗口进行流量控制,窗口的大小是字节,这里就是每次传输的数据大小
- TCP为什么需要三次握手,两次握手不行吗?
- 为了确认双方的接收能力和发送能力都正常
- 如果是两次握手,那么服务器就没有办法知道自己的序号是否已经被确认了,导致资源一直被浪费
七. websocket
- 对WebSocket的理解
- 全双工通讯
- 服务器可以向客户端主动推送消息,客户端也可以主动向服务端推送消息
- 即时通讯的实现:短轮询,长轮询,SSE和WebSocket的区别?
- 短轮询:每隔一段时间向服务器发送http请求
- 长轮询:服务器会讲这个请求挂起,然后判断是否数据有更新,如果有更新,则进行响应,如果一直没有数据更新,则到达一定时间后才返回
- SSE:服务器主动使用流信息向服务器推送信息,单向的,只能是服务器发送消息给客户端
- WebSocket:允许服务器主动向客户端推送消息,全双工协议