HTTP篇
1.什么是HTTP/HTTPS
?
HTTP
指的是超文本传输协议,是一种在浏览器客户端或其他程序中发送请求与服务器响应过程中的应用层通信协议HTTPS
是由HTTP
+SSL
构成的一种可以进行加密传输与身份认证的一种安全通信通道
2.HTTP
与HTTPS
有什么区别?
HTTP
- 使用明文传输信息,安全性差
- 默认使用
80
端口号 - 连接是无状态的
HTTPS
- 由
HTTP
+SSL
构成,对信息进行加密传输,需要进行身份认证,安全性高 - 默认使用
443
端口号 - 需要到
ca
申请证书,需要承担额外的费用
- 由
3.HTTP
常见的响应状态码有哪些?
1**
信息响应状态码100
客户端必须继续发送请求*
101
客户端要求服务器根据请求转换HTTP
协议*
2**
成功状态码200
请求成功*
201
请求成功并创建了新的资源*
202
接受和处理,但尚未完成处理203
返回信息不确定或不完整204
返回信息为空*
205
服务器完成了请求,但是用户代理必须复位当前已浏览过的文件206
服务器完成了用户的部分get
请求
3**
重定向状态码300
请求的资源可以在多处获得301
删除请求数据*
302
在其他地址发现了请求数据*
303
建议用户访问其他URL
或者更换访问方式304
用户请求的资源未被修改,可以使用缓存的资源*
305
请求的资源必须从服务器指定的URL
获取306
前一版本中HTTP
使用的代码,现版本不再使用307
请求的资源被临时删除
4**
客户端错误状态码400
请求错误,服务器无法理解*
401
请求授权失败*
402
保留有效chargeto
头响应403
禁止访问*
404
请求资源未找到*
405
用户在request-line
字段定义的方法不允许406
请求资源不可访问407
用户必须首先在代理服务器中得到授权408
客户端没有在用户指定的时间内完成请求409
当前资源的状态请求无法完成410
服务器上不再存在此资源并且没有参考地址411
服务器拒绝用户定义的content-length
属性请求412
请求头中存在字段错误413
请求的资源大于服务器允许的大小414
请求的URL
长度大于服务器允许的长度415
请求资源不支持请求项目格式416
请求中包含range
请求头字段,但请求资源范围内没有range
指示值417
服务器不满足expect
请求头指定的期望值
5**
服务端错误状态码500
服务器内部错误*
501
服务器不支持请求的函数502
服务器暂时不可用*
503
服务器过载或暂停维护*
504
关口过载,服务器使用另外的关口响应请求,等待时间设定值较长505
服务器不支持或拒绝请求头中指定的HTTP
版本
4.常见的HTTP
请求有哪些?有什么区别?
请求方法 | 作用 |
---|---|
get | 获取资源,向服务器查询信息 |
post | 将包含在请求体中的数据向指定的地址进行提交 |
head | 返回的响应中没有具体内容,通常用于获取报头 |
put | 从客户端发送数据以取代指定文档的内容 |
delete | 请求服务器删除指定内容 |
connect | 要求在与代理服务器通信时建立隧道,使用隧道进行TCP 通信 |
options | 询问支持的请求方法,用来跨域请求 |
trace | 回显服务器收到的请求,用于测试或诊断 |
- 上述请求中,
get
与post
请求更加常用 get
请求传参通常直接跟在URL
地址后面以?
的方式进行拼接,并且将多个参数用&
进行连接,使用get
方式传递的参数具有大小限制,这通常是因为对URL
长度有限制,使用get
请求,在地址栏能够看到提交的参数信息,通常意味着存在安全风险
5.什么是三次握手与四次挥手?
- 三次握手指的是客户端与服务端之间进行通信连接的三个步骤
- 第一次握手是用来建立连接,客户端发送连接请求报文,发送规定的数据包
- 第二次握手是服务器端表示接收到连接请求报文,并回传规定的数据包
- 第三次握手是客户端接收到了服务端回传的数据包之后,给服务端再次发送数据包
- 四次挥手指的是当前连接请求已经结束,需要断开此次连接
- 第一次挥手是客户端对服务端发起断开请求
- 第二次挥手是服务端确认收到这次的断开请求
- 第三次挥手是服务端表示已经断开连接
- 第四次挥手是客户端表示已经断开连接
6.详细说说get
请求与post
请求有什么区别?
区别 | get | post |
---|---|---|
应用场景 | 请求通常不会影响服务端资源 | 会影响服务端资源 |
参数传递 | 通常使用明文的方式在URL 末尾使用? 拼接参数,多个参数使用& 连接 | 将参数放在请求体中进行发送 |
安全性 | 不安全 | 安全 |
缓存 | 一般会缓存 | 一般不会缓存 |
请求长度 | 限制请求参数长度 | 不受限制 |
参数类型 | 使用名值对的方式 | 使用名值对,json 数据格式等 |
报文格式 | 报文中实体部分为空 | 实体部分用来存放请求参数 |
7.详细说说post
请求与put
请求有什么区别?
post | put |
---|---|
通常会增加数据库中数据的长度或类别,它会创建一个新的数据 | 通常用来更新服务器的部分数据,并不会更改原数据库中的数据长度 |
8.常见的HTTP
请求头与响应头有哪些?
- 请求头
name | description |
---|---|
accept | 浏览器能够处理的内容类型 |
accept-charset | 浏览器能够显示的字符集 |
accept-encoding | 浏览器能够处理的压缩编码 |
accept-language | 浏览器当前设置的语言 |
connection | 浏览器与服务器之间的连接类型 |
cookie | 当前页面设置的任何cookie |
host | 当前请求的页面所在的域 |
referer | 当前浏览器发出请求的页面的URL |
user-agent | 浏览器的用户代理字符串 |
- 响应头
name | description |
---|---|
date | 消息发送的时间 |
server | 服务器名称 |
connection | 浏览器与服务器之间连接的类型 |
cached-control | 控制浏览器的缓存 |
content-type | 表示后面的文档属于什么MIME 类型 |
content-type
有如下类型application/x-www-form-urlencoded
可以提交表单类型数据,以名值对的格式application/json
提交json
字符串类型的数据text/xml
提交xml
类型的数据multipart/form-data
提交表单类型数据
9.HTTP
状态码304
是多好还是少好?
304
状态码指的是客户端请求的网页内容与本地缓存的内容一致,没有发生变化- 浏览器对之前访问过的页面会进行缓存,当用户对访问过的页面再次请求时,服务器会根据缓存判断请求内容是否与之前相同,如果相同,浏览器会直接使用缓存内容,不必进行二次下载
- 搜索引擎会青睐经常更新内容的网站,通过特定时间内对网站抓取返回的状态码来调节对该网站的抓取频次
- 如果网页响应长期处于
304
状态,搜索引擎就会减少对该网站的抓取频次
- 如果网页响应长期处于
- 产生
304
的原因- 网站更新周期长或者停止更新
- 网站采用的是静态页面
- 长期产生
304
状态的后果- 网站快照停止
- 网站收录减少
- 网站权重下降
10.options
请求方法与应用场景是什么?
options
请求用于查询服务器支持的HTTP
方法与其他选项- 客户端在采取具体的资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能
- 用途
- 获取服务器支持的所有
HTTP
方法 - 检查访问权限,跨域请求预检测
- 获取服务器支持的所有
11.HTTP1.0
与HTTP1.1
的区别?
区别 | HTTP1.0 | HTTP1.1 |
---|---|---|
连接方面 | 非持久连接 | 持久连接 |
资源请求方面 | 不支持客户端取回部分数据 | 允许客户端取回部分数据,新增put ,options ,head 请求方法 |
缓存方面 | 缓存策略少(If-Modified-Since ,Expires ) | 支持更加丰富的缓存策略(Etag ,If-Unmodified-Since ,If-Match ,If-None-Match ) |
新增功能 | 认为每台服务器应当存在唯一的IP 地址,请求的URL 中没有传递主机名 | 虚拟主机允许在同一台服务器中存在多个虚拟主机,并且共享IP ,新增host 字段,指定服务器的域名 |
12.HTTP1.1
与HTTP2.0
的区别?
区别 | HTTP1.1 | HTTP2.0 |
---|---|---|
二进制协议 | 报文头部是文本,数据体是文本或二进制 | 头与数据体都是二进制 |
多路复用 | - | 复用TCP 连接,允许在同一个连接中客户端与服务器同时发送多个请求或响应 |
数据流 | - | 将同一个请求或响应的所有数据包称为数据流,每个数据流有唯一的编号, HTTP2.0 在发送数据包时并不是按照顺序发送,同一个连接的连续数据包也可能来自于不同的请求,所以在发送数据包时都标记了数据流的编号以便区分 |
头信息压缩 | 协议不带状态,每次发送请求都必须附上所有信息 | 头信息压缩后发送,客户端与服务器同时维护同一张头信息表,所有字段均会存入该表,并生成一个索引号,后续发送头信息只需要发送索引号 |
服务器推送 | - | 允许服务器未经请求向客户端发送资源,推送一些必要的信息以减少数据传递时间 |
13.使用get
方法为什么会限制URL
长度?
- 在
HTTP
中,并未规定对get
方法请求的URL
长度进行限制,是浏览器及服务器的限制 - 浏览器限制
IE
,限制URL
长度为2083
字节(min
)FireFox
,限制URL
长度为65536
字符Safari
,限制URL
长度为80000
字符Opera
,限制URL
长度为190000
字符Chrome
,限制URL
长度为8182
字符
- 服务器限制
Apache
,最大接收URL
长度为8192
字符Microsoft Internet Infomation Server
,最大接收URL
长度为16384
字符
14.当在浏览器中输入Baidu.com
并且按下回车之后发生了什么?
- 解析
URL
- 根据
URL
解析出请求的协议以及请求的资源地址,如果协议或者主机名不合法,浏览器将会将输入的内容传递给搜索引擎检索;如果协议及主机名合法,浏览器会将URL
中存在的非法字符进行转义
- 根据
- 缓存判断
- 浏览器会判断请求的资源是否在缓存中,如果缓存中的数据未失效,那么浏览器将会直接使用,否则会向服务器发起新的请求
DNS
解析- 获取输入的
URL
域名的IP
地址 - 浏览器会先判断本地是否缓存有该域名的
IP
地址,有则直接使用 - 否则向本地的
DNS
服务器发起请求,DNS
服务器首先会判断本地是否缓存有当前域名的IP
地址,有则直接使用 - 否则向根域名发起请求,获取顶级域名服务器的地址后,再向顶级域名服务器发起请求;然后获取权威域名服务器的地址后,再向权威域名服务器发送请求获取到域名的
IP
地址 - 本地
DNS
服务器将获取到的IP
地址返回给请求的用户
- 获取输入的
- 获取
MAC
地址- 获取到
IP
地址后,还需要直到主机的MAC
地址 - 应用层下发数据给传输层,
TCP
协议会指定源端口号与目的端口号,下发给网络层 - 网络层将本机地址作为源地址,获取的
IP
地址作为目的地址,下发给数据链路层 - 数据链路层的发送需要加入通信双方的
MAC
信息,本机的MAC
信息作为源,目的的MAC
地址分情况- 将
IP
地址与本机的子网掩码相与,能够判断本机与目的主机是否在同一个子网里 - 若在,通过
APR
协议直接获取到主机的MAC
地址 - 若不在,请求被转发给网关,并由它代为转发,此时同样可以通过
APR
协议获取到目的主机的MAC
- 将
- 获取到
TCP
三次握手- 客户端向服务端发送一个
SYN
报文段用来请求连接,同时发送一个随机序号 - 服务端接收到请求后,向客户端发送一个
SYN ACK
报文段,确认连接请求,同时发送一个随机序号 - 客户端接收到服务端应答后,进入连接状态,同时向服务端发送一个
ACK
确认报文段,服务端收到后也进入连接状态
- 客户端向服务端发送一个
HTTPS
握手- 如果使用的是
HTTPS
协议,在正式通信前还存在一个TLS
的四次握手过程- 客户端向服务端发送协议版本号,一个随机数与加密方法
- 服务端收到后,确认加密方法,也向客户端发送一个随机数与数字证书
- 客户端收到后,检查证书是否有效,如果有效,再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,还会提供一个前面所有内容的
hash
值供服务端进行检验 - 服务端收到后,利用私钥对数据解密,同时向客户端发送一个前面所有内容的
hash
值供客户端检验 - 此时双方都有了三个随机数,按照之前约定的解密方法,用这三个随机数生成一个密钥,后期双方通信前,就使用这个密钥对数据进行加密后再传输
- 如果使用的是
- 返回数据
- 服务端接收到客户端发送的请求后,将会返回一个
html
页面,当浏览器接收到后,开始对页面进行渲染
- 服务端接收到客户端发送的请求后,将会返回一个
- 页面渲染
- 根据
html
文件中的文档结构生成一个Dom
树 - 根据设置的
Css
规则生成一个CSSom
树 - 如果遇到
script
标签,则会先检查是否有defer
或async
属性,否则非异步执行的脚本程序会阻塞页面的解析 - 根据
Dom
树与CSSom
树构建一个渲染树,浏览器会根据渲染树对页面进行布局,布局完成后调用浏览器的相关接口绘制整个页面
- 根据
TCP
四次挥手- 客户端向服务端发送断开连接请求
- 服务端收到后,会告诉应用层需要释放
TCP
链接,然后向客户端发送ACK
包,进入CLOSE_WAIT
状态,此时客户端到服务端的链接已经被断开,服务端不再接收客户端发送的数据,但是服务端可以发送数据给客户端,服务端会继续向客户端发送未发送完的数据,完毕后会向客户端发送断开连接请求,然后服务端进入LAST_ACK
状态 - 客户端收到后,会向服务端发送确认应答,此时客户端进入
TIME_WAIT
状态,该状态会持续2MSL
时间,若该时间段内没有接收到服务器的数据,则进入CLOSED
状态 - 服务端收到确认应答后,也进入
CLOSED
状态
15.对keep-alive
的理解?
HTTP1.0
中,对于客户端的每次请求与服务端的响应,都需要新建一个连接来完成,并且在数据传输完成之后立刻断开连接,这就是短链接- 使用
keep-alive
时,客户端到服务端的连接持续生效,这就避免了在多次请求时会新建连接或者重建链接,减少了建立连接所带来的时延 - 在
HTTP1.0
中,配置头部Connection:keep-alive
,如果希望取消Connection:close
- 在
HTTP1.1
中,默认启用了该功能,如果希望取消,配置头部Connection:close
keep-alive
建立过程- 客户端向服务端发送请求报文同时在首部添加发送
Connection
字段 - 服务器收到并处理
Connection
字段 - 服务器回送
Connection:keep-alive
字段给客户端 - 客户端收到
Connection
字段 keep-alive
连接建立成功
- 客户端向服务端发送请求报文同时在首部添加发送
- 服务端自动断开过程
- 客户端向服务端发送请求报文
- 服务器收到并处理请求
- 服务器将资源返回给客户端并且关闭连接
- 客户端接收到资源后,发现没有
Connection
字段,断开连接
- 客户端请求断开连接过程
- 客户端向服务端发送
Connection:close
字段 - 服务器收到请求并处理
Connection
字段 - 服务器将资源返回给客户端并且关闭连接
- 客户端接收到资源后关闭连接
- 客户端向服务端发送
优点 | 缺点 |
---|---|
更少的CPU 使用与内存占用,允许请求与应答的HTTP 管线化,降低TCP 拥塞,降低了后续的请求时延,报告错误无需关闭TCP 连接 | 长时间TCP 连接导致系统资源无效占用 |
16.如果页面有多张图片,HTTP
是如何加载图片的?
- 在
HTTP1.0
中,浏览器对同一个域名中最大的TCP
链接数为6
,如果超过该次数,将会新增请求- 可以使用多域名部署解决,可以增加同时请求的数目,加快页面图片的获取速度
- 在
HTTP2.0
中,浏览器通过多路复用机制可以实现在同一个TCP
链接中发送多个HTTP
请求,可以一次性获取多张图片
17.HTTP2.0
中的头部压缩算法是怎样的?
- 采用
HPACK
算法,在客户端与服务端建立字典,用索引号表示重复的字符串- 在客户端与服务端共同使用同一份首部表,用来存储之前请求与响应中发送的键值对
- 对于相同的数据,不再发送重复的数据.首部表在
HTTP2.0
的存续期间一直存在,由客户端与服务端共同维护 - 每个新的键值对要么会被添加到首部表末尾,要么会覆盖掉已有的数据
18.HTTP
请求报文是什么样的?
- 包含一个请求行
- 请求行包含请求方法,目标
url
,协议版本
- 请求行包含请求方法,目标
- 包含一个请求头
- 请求头中用来实现请求的具体配置,是一个键值对集合,每个键值对占据一行
- 包含一个空行
- 包含一个请求体
- 请求时所携带的数据
19.HTTP
响应报文是什么样的?
- 包含一个响应行
- 响应行包含协议版本,状态码,简要描述
- 包含一个响应头
- 是一个键值对集合,每个键值对占据一行
- 包含一个空行
- 包含一个响应体
- 根据具体请求响应的数据
20.HTTP
的优点与缺点有哪些?
HTTP
是超文本传输协议,它定义了客户端与服务端之间交换报文的格式与规则,默认使用80
端口,使用TCP
作为传输层协议- 优点
- 简单快速,请求时只需要传递方法与目标
url
- 无连接,每次连接只处理一个请求,服务器处理完请求,收到客户端应答后断开连接
- 无状态,如果后续处理需要之前的信息,那么需要重传,但是相反,如果不需要之前的信息,则应答比较快
- 灵活性强,允许传输任意类型的数据对象,利用
content-type
设置数据类型
- 简单快速,请求时只需要传递方法与目标
- 缺点
- 无状态的协议,不会保存关于用户的任何信息
- 安全性低,协议中的报文是文本形式,容易直接暴露在外部
21.关于HTTP3.0
的理解?
HTTP3.0
使用UDP
协议实现了多路复用数据流,传输可靠性等功能,简称为QUIC
协议
- 流量控制与传输可靠性控制,在
UDP
基础上额外提供了一层保证数据传送的可靠性,包括:数据重传,拥塞控制等 - 继承
TLS
加密功能,并且减少了握手时花费的RTT
数 - 多路复用,同一个物理连接可以有多个独立的数据流,实现了数据流的单独传输,解决了
TCP
的队头拥塞问题 - 快速握手,基于
UDP
,可以直接使用0~1
个RTT
来建立连接
22.HTTP
的性能如何?
HTTP
协议基于TCP/IP
,使用了请求-应答
的通信模式HTTP
有两种连接模式:持续连接与非持续连接- 持续连接指的是当客户端与服务端成功连接后,
TCP
的连接状态将会一直保存,可以被多个请求复用 - 非持续连接指的是服务端必须为每一个请求建立和维护一个全新的连接
- 持续连接指的是当客户端与服务端成功连接后,
- 管道网络传输
HTTP1.1
使用持续连接进行通信,可以实现管道网络传输- 管道网络传输指的是对于同一个
TCP
连接,客户端可以发送多个请求,第一个请求发送之后,不必等待响应,可以直接发送后续请求,缩短了请求整体响应的时间,但是如果前面的请求过慢,会阻塞后面的请求
- 队头堵塞
HTTP
的报文传输必须是一发一收,但是,其中的任务被放在一个队伍中串行执行,一旦前面的任务处理较慢,就会阻塞后面的任务- 解决队头堵塞
- 并发连接,对于同一个域名,允许分配多个长连接
- 域名分片,将域名分化成为多个二级域名,均指向同一个服务器
23.与缓存相关的HTTP
请求头有哪些?
- 强缓存
expires
,cache-control
- 协商缓存
etag
,if-none-match
,last-modified
,if-modified-since
24.详细说明什么是HTTPS
协议?
HTTPS
协议指的是超文本传输安全协议,是一种通过计算机网络进行安全通信的协议HTTPS
经由HTTP
实现通信,利用SSL/TLS
进行加密HTTPS
的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性HTTPS
安全层的主要作用是在发送HTTP
请求时加密信息,在接收HTTP
内容时解密信息
HTTP | HTTPS |
---|---|
采用明文传输信息,易造成信息泄露,信息篡改,信息劫持等风险 | 采用身份验证,完整性检查,信息加密的方式保护数据 |
25.TLS/SSL
加密的工作原理?
TLS/SSL
被称为安全传输层协议,是介于TCP
与HTTP
之间的一层安全协议,不影响原有的协议- 主要依赖三类基本算法:
散列函数hash
,对称加密
,非对称加密
散列函数hash
验证信息的完整性- 常见的有
MD5
,SHA1
,SHA256
,该函数具有单向不可逆的特点,对输入数据敏感,输出长度固定,任何数据的修改都会改变函数结果,可以用来验证数据的完整性,防止数据被篡改 - 信息传输过程中,无法实现防止信息被篡改,因为传输作为明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息及信息摘要进行加密
- 常见的有
对称加密
采用协商的密钥对信息加密- 双方使用同一个密钥对信息进行加密与解密
- 密钥如果通过网络传输,那么容易被窃取,一旦被窃取,那么对称加密就失效了
- 常见的对称加密方法有
AES-CBC
,DES
,3DES
,AES-GCM
等 - 信息传输一对一,需要共享相同的密钥,安全的密钥是信息安全的基础,服务器与
N
个客户端进行通信,就需要维护N
个不同的密钥
非对称加密
实现身份认证与密钥协商- 使用一个公钥与一个私钥,两者分别对信息加密,并且只有对立方才能够解密
- 将公钥公开,从而使得通信的客户端能够使用公钥加密,服务端使用私钥就能够解密
- 非对称加密的加密过程较慢,如果每次通信都使用非对称加密,那么会造成等待时间过长的问题
- 常见的非对称加密方法有:
RSA
,ECC
,DH
等 - 采用一对多的方式,服务端拥有一个私钥就可以实现与多个客户端进行通信,使用该私钥可以对客户端使用公钥加密的信息进行解密;服务端使用私钥加密的信息,任何拥有公钥的客户端都能够进行解密
TLS/SSL
的工作方式- 客户端使用非对称加密与服务端进行通信,实现身份的验证并协商对称加密的密钥,对称加密算法采用协商密钥对信息及信息摘要进行加密,不同节点之间采用的对称密钥不同,从而保证信息只能够由通信双方获取
26.数字证书是什么?
- 使用
TLS/SSL
加密后也不能够确保信息一定是安全的,如果存在一个中间人,截取了服务端发送的公钥,然后将他的公钥发送给客户端,客户端使用这个公钥对信息进行加密后发送,中间人使用自己的私钥将加密信息解开并模仿客户端的行为,向服务端发送信息,服务端最后会将信息返回给中间人,这样就会导致信息泄漏 - 为了验证公钥的安全性,可以使用数字证书
- 使用
hash
算法对公钥与其他信息加密,生成一个信息摘要,然后让CA
机构用它的私钥对消息摘要加密,形成签名,最后将原信息与数字签名进行混合,就是数字证书 - 当服务端接收到数字证书后,利用
hash
算法对原信息生成一个摘要,然后使用公证处的公钥对数字证书中的摘要进行解密,最后将解密的摘要与生成的摘要进行对比
- 使用
- 只要认证中心可靠,那么就确保信息是安全的,一般在浏览器中都会内置一些顶层的认证中心的证书
27.HTTPS
有哪些特点?
- 优点
- 可以认证客户端与服务器,将信息发送至正确的客户端与服务器
- 可以在通信过程中认证身份,加密信息,使得通信更加安全
- 是目前最安全的解决方案,极大地增加了中间人劫持信息的成本
- 缺点
- 需要进行服务端与客户端双方的加密与解密过程,额外耗费时间
- 使用
SSL
证书需要收费,功能越强费用越高 SSL
证书需要绑定IP
,不能在同一个IP
上绑定多个域名- 占用更多的服务器资源,支持访客稍多的网站需要投入更多成本
28.同样作为重定向,302
,303
,307
有什么区别?
302
是HTTP1.0
的重定向状态码- 在
HTTP1.1
之后,细分出303
与307
两个分支304
表示客户端应通过get
请求获取该资源,且会将post
请求转变为get
请求307
表示会遵照浏览器的标准,不会自动更改请求
29.DNS
协议是什么?
DNS
是域名系统的缩写,提供主机名到对应IP
地址的转换服务,即域名系统- 它是一个分层的
DNS
服务器组成的分布式数据库,是定义了主机如何查询该分布式数据库方法的一个应用层协议,方便人们直接通过域名访问网址,而非通过一串IP
地址进行访问 - 它将主机名解析成为对应的
IP
地址,客户端向DNS
服务器发送域名查询请求,DNS
服务器告知客户端Web
服务器对应的IP
地址
30.DNS
同时使用了TCP
协议与UDP
协议吗?
DNS
服务器默认占用53
号端口,同时使用TCP
与UDP
协议- 区域传输时使用
TCP
协议- 辅域名服务器会定时向主域名服务器进行查询,了解数据是否存在变动,如果数据有变动,会执行一次区域传送.传送的数据量相比请求而言更加庞大,使用
TCP
传送保证了数量的准确性
- 辅域名服务器会定时向主域名服务器进行查询,了解数据是否存在变动,如果数据有变动,会执行一次区域传送.传送的数据量相比请求而言更加庞大,使用
- 域名解析时使用
UDP
协议- 客户端向
DNS
服务器查询域名,一般返回的结果不会超过512Byte
,使用UDP
协议直接传输,不用经过三次握手,DNS
服务器负载更低,响应更快
- 客户端向
31.DNS
完整的查询过程是怎样的?
- 浏览器会先到缓存中查询是否存在对应的
IP
地址,如果能够找到,直接使用,否则执行以下步骤: 浏览器 => DNS服务器
- 将请求发送给本地
DNS
服务器,如果能够找到,直接使用,否则执行以下步骤:
- 将请求发送给本地
DNS服务器 => 上级域名服务器
- 本地
DNS
服务器向根域名服务器发送请求,它会返回一个所查询域的顶级域名服务器地址,本地DNS
服务器继续向顶级域名服务器发送请求,接收请求的服务器会查询自己的缓存,如果能够找到,直接使用,否则执行以下步骤: - 顶级域名服务器查询到缓存中不存在对应的
IP
地址,会返回下一级的权威域名服务器地址,本地DNS
服务器继续向权威域名服务器发送请求,域名服务器会返回对应的IP
地址
- 本地
- 本地
DNS
服务器将查询到的IP
地址进行缓存,同时该IP
地址发送给服务器
32.什么是迭代查询与递归查询?
DNS
的查询过程是一个既包含迭代查询又包含递归查询的过程- 递归查询指的是用户发送依次请求后,服务器代为向第三方继续发送我们的请求,最终服务器会返回给我们一个查询结果,用户只需要发送一次请求即可
- 迭代查询指的是用户发送请求后,每次服务器都会返回给我们一个结果,由用户再次向目标服务器发起请求,用户可能需要发送多次请求
- 通常,在需要使用
DNS
服务时,浏览器通常会向本地DNS
服务器发送一个请求,用来获取目标主机名的IP
地址
33.DNS
报文是什么?
DNS
服务器以资源记录的形式存储着多条信息,每一次DNS
响应报文一般包含多条资源记录- 每条资源记录有一个固定的格式
(name,value,type,TTL)
TTL
是资源记录的生存时间,表示该资源能够被其他DNS
服务器缓存多长时间type
取值不同,name
与value
的取值也不同type=A
,name
代表主机名,value
代表对应的IP
地址type=NS
,name
代表域名,value
代表负责当前域名的DNS
服务器主机名type=CNAME
,name
代表别名,value
为该主机的规范主机名- 该记录用来向查询的主机返回一个该主机名的规范主机名,告诉查询主机查询该主机名的
IP
地址,别名简化了一些复杂的主机名
- 该记录用来向查询的主机返回一个该主机名的规范主机名,告诉查询主机查询该主机名的
type=MX
,name
代表一个邮件服务器的别名,value
为邮件服务器的规范主机名,作用与上述一致
34.OSI
七层模型是什么?
应用层
- 应用层最接近用户,为计算机提供应用接口,也为用户直接提供各种网络服务
- 常见的应用层网络服务协议有:
HTTP
,HTTPS
,FTP
,SMTP
表示层
- 表示层提供各种用于应用层的数据的编码及转换功能,确保一个系统的应用层发送的数据能够被另外的系统识别
- 在项目开发中,通常使用
base64
对数据进行编码解码
会话层
- 会话层负责建立,管理,终止表示层实体之间的通信
- 该层的通信由不同设备的不同程序之间的服务请求与响应组成
传输层
- 传输层建立了端到端的连接,其作用是为上层协议提供端到端的可靠和透明的数据传输服务
- 该层向高层屏蔽了数据传输过程中的细节,让高层用户只看到两个传输实体之间的一条主机到主机的,可由用户设定与控制的,可靠的数据通路
TCP/IP
在这一层,规定了数据的传输方式
网络层
- 本层通过
IP
寻址来建立节点之间的连接,将源端送来的分组,选择合适的路由与交换节点,正确无误地按照地址传输给目的运输层 - 该层是
IP
协议层,IP
协议是Internet
的基础,规定了数据的传输路线
- 本层通过
数据链路层
- 将比特组合成字节,再将字节组合成帧,使用链路层地址访问介质,并进行差错检测
- 该层可以比作数据的传输路线
物理层
- 数据信息的传递最终通过物理层实现,利用物理层介质传输比特流
- 规定了电平,速度与电缆针脚
- 常用设备you集线器,中继器,调制解调器,网线,双绞线,同轴电缆
OSI
七层模型利用对等通信,源端每一层都会与目的地对应层各自进行通信
35.什么是TCP/IP
五层协议?
应用层
- 为应用进程提供服务
- 应用层定义了进程之间进行通信与交互的规则,不同的应用有不同的应用层协议
- 常见的应用层协议有
HTTP
,HTTPS
,FTP
,SMTP
,DNS
传输层
- 负责为两台主机中的进程提供通信服务
TCP
协议,即传输控制协议,提供面向连接的,可靠的数据传输服务,数据的基本传输单位是报文UDP
协议,即用户数据报协议,提供无连接的,尽最大努力的数据传输服务,不保证数据传输的可靠性,数据的基本传输单位是用户数据报
网络层
- 负责为两台主机提供通信服务,利用合适的路由将源数据传输到目标主机
数据链路层
- 负责将网络层交下的
IP
数据报封装成帧,在链路的相邻节点传送帧,每一帧都包含节点与必要的控制信息
- 负责将网络层交下的
物理层
- 确保数据可以在各种媒介上进行传输
TCP/IP
协议也遵循对等通信
36.TCP
与UDP
的概念?它们分别有什么特点?
- 两者都是传输层的协议,都属于
TCP
协议族 UDP
- 面向无连接
- 无需进行三次握手就能随时发送数据,不会对数据报文进行任何拆分与拼接
- 在发送端,应用层将数据传递给传输层的
UDP
协议,UDP
只会给数据增加一个UDP
头作为标识是UDP
信息 - 在接收端,网络层将数据传递给传输层,传输层去除
IP
报文头就传递给应用层,不进行任何拼接操作
- 有单播,多播与广播模式
UDP
支持一对一,一对多,多对多,多对一的数据传输功能
- 面向报文
- 发送方应用程序交下来的数据,
UDP
不进行数据拼接与拆分,添加首部后直接交给IP
层,保留了这些报文的边界,应用程序必须选择合适大小的报文
- 发送方应用程序交下来的数据,
- 不可靠性
- 无连接,随时可以进行数据发送
- 不会备份数据,不关心接收方是否已经接收到数据
- 没有拥塞控制,容易造成丢包
- 头部开销小,数据传输高效
UDP
头部包含了两个16位
端口号:源端口号与目标端口号- 整个数据报文的长度
- 整个数据报文的检验与一个可选的
Ipv4
字段 - 只有
8字节
,相比于TCP
至少20字节
而言,占用更小空间
UDP
适用于实时应用,直播,现场会议,语音聊天等
- 面向无连接
TCP
- 面向连接
- 数据发送之前必须进行三次握手,建立可靠的连接
- 仅支持单播传输
TCP
连接只能够连接两个端点,进行端到端的传输
- 面向字节流
- 不是以单个报文独立传输,以字节流的方式进行传输,不保留报文边界
- 可靠传输
TCP
可以利用段编号以及确认号判断数据是否丢包,误码TCP
为了保证报文的可靠,为每一个数据包都添加了一个序号,序号可以保证接收端按序对数据进行接收,接收端接收到数据后,会发送一个相应的确认ACK
,如果发送方在合理的时间RTT
内没有收到确认,那么该数据宝将会进行重传
- 提供拥塞控制
- 当网络出现拥塞时,
TCP
会减小向网络中注入的数据速率与数量,缓解拥塞
- 当网络出现拥塞时,
- 提供全双工通信
- 允许双方的应用程序在任何时候都能够发送数据,
TCP
的两端设有缓存,用来临时存储双向通信的数据,TCP
可以立即发送数据段,也可以缓存一段时间,一次性发送更多数据段
- 允许双方的应用程序在任何时候都能够发送数据,
TCP
适用于要求高可靠性的场景,文件传输,接收邮件,远程登录等
- 面向连接
37.为什么UDP
协议不可靠?
UDP
传输数据之前不需要建立连接,远程主机的运输层在接收到UDP
报文后,不需要进行确认,提供了不可靠的数据交付- 不保证消息交付,不保证交付顺序,不跟踪连接状态,不进行拥塞控制
38.什么是TCP
的重传机制?
- 由于
TCP
的下层网络层会出现丢失,重复或者失序的情况,TCP
为保证数据传输的可靠性,会重传其认为已丢失的包 TCP
使用两套机制实现数据重传- 基于时间
- 基于确认信息
- 在每次发送数据时,会自动开启一个定时器,如果在这个时间段内没有收到接收方发送的确认信息
ACK
,则对该报文进行重传,在达到一定次数还没有成功时,放弃传输,并且发送一个复位信号
39.什么是TCP
的拥塞控制机制?
- 慢启动
- 数据发送时设置较小的拥塞窗口,测试网络的拥塞程度,由小到大增加拥塞窗口的大小
- 拥塞避免
- 在拥塞避免阶段,将拥塞窗口控制为按照线性增长,使网络不容易堵塞
- 快速重传
- 要求接收方在收到一个失序的报文段后就立即发出重复确认,发送方只要收到连续三个重复确认,立即重传对方尚未收到的报文段
- 快速恢复
- 发送方连续收到三个重复确认时,说明没有出现网络拥塞,此时不执行慢开始,进行相关设置后执行拥塞避免算法
40.什么是TCP
的流量控制机制?
- 流量控制指的是发送方在发送数据包时,避免过快地进行发送,否则接收方来不及接收
TCP
采用大小可变的滑动窗口进行流量控制,窗口大小的单位是字节,窗口大小即每次传输数据的大小- 建立连接时,两端分别分配一个缓冲区保存输入的数据,并将缓冲区的大小发送给另外一端,数据到达时,接收方发送确认
ACK
,其中包含自己剩余缓冲区的大小,剩余缓冲区空间大小称为窗口,发送剩余窗口大小的行为成为窗口通告 - 如果接收方应用程序读取数据的速度与数据到达的速度一样快,接收方将在每个确认
ACK
中发送一个正的窗口通告 - 如果发送方数据发送速度快于接收方,接收到的数据最终将充满接收方的缓冲区,接收方会发送一个零窗口通告,此时发送方必须停止发送
41.什么是TCP
的可靠传输机制?
- 基于连续
ARQ
协议与滑动窗口协议 TCP
协议在发送方维持了一个发送窗口- 发送窗口以前的报文段,已经发送并经过确认
- 发送窗口中包含了已经发送但尚未确认的报文段,已经允许但尚未发送的报文段
- 发送窗口以后的报文段,缓存中还未允许发送
- 当发送方发送报文时,会依次发送发送窗口内的所有报文段,同时设置一个定时器,如果在定时器的时间内收到某个报文段的确认回答,则滑动窗口,将窗口的首部向后滑动到确认报文段的下一个位置
- 如果还有已发送但尚未确认的报文段,则重置定时器
- 如果没有,关闭定时器
- 如果定时器超时,重新发送所有已发送但尚未确认的报文段,并设置超时时间为原先的两倍
- 当发送方接收到三个冗余的确认应答后,表明该报文段之后的信息可能丢失,发送方会启用快速重传机制,在当前定时器结束前,发送所有已发送但确认的报文段
- 接收方使用累计确认机制,所有按序到达的报文段,接收方返回一个报文段的肯定回答,如果收到了一个乱序的报文段,接收方直接丢弃,并返回一个最近按序到达报文段的肯定回答
- 累计确认保证了返回的确认回答之前的报文段都成功按序到达,发送窗口可以移向已发送并确认的报文段的下一位
- 发送和窗口的大小可以变化,由接收窗口剩余大小和网络中的拥塞程度决定,
TCP
通过控制发送窗口的长度进而控制发送报文段的速率TCP
协议并非与滑动窗口协议一致,许多TCP
的实现会将失序的报文段缓存,发生重传时,只会重传一个报文段,TCP
协议可靠传输机制是滑动窗口协议与选择重传协议的一个混合体
42.什么是TCP
粘包?如何处理?
- 一般情况下,
TCP
会启用延迟算法Nagle
,在发送数据之前将数据缓存.如果短时间有多个数据包发送,这些数据包会被缓存到一起集中发送 - 如果是文件传输,不用处理粘包,将多个数据包互相拼接即可
- 如果是多条消息或别的数据,需要处理粘包
- 假如服务端连续发送两个数据包
data1
与data2
- 客户端接收到完整的
data1
,再接收到完整的data2
- 客户端接收到完整的
data1
与部分的data2
,再接收到data2
的剩余数据 - 客户端接收到部分的
data1
数据,再接收到data1
的剩余数据与完整的data2
- 客户端一次性接收到完整的
data1
与data2
- 上述的
234
是数据粘包的情况
- 客户端接收到完整的
- 解决方案
- 多次发送数据包之前设定一个等待时间,等待时间之后进行下一次数据发送,适用于交互频率非常低的情景
- 关闭延迟算法
Nagle
,不启用缓存区,每次发送数据包不缓存直接进行发送,适用于单次发送数据量较大并且频率不是非常高的情景;该方法不适用于网络较差的情况 - 进行封包于拆包,在每个数据包发送之前,在它前后放一些有特征的数据,接收方收到数据包时根据特征数据分割数据包
43.为什么UDP
不会粘包?
TCP
协议是面向流的协议,UDP
协议是面向消息的协议UDP
数据包都是一条消息,应用程序必须以消息为单位提取数据,无法一次提取任意字节的数据UDP
具有消息边界保护机制,在每个UDP
中有消息头,对于接收端来说容易区分每条消息UDP
传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息,接收端一次只能接收发送端发出的一个数据包,如果一次接收数据包大小小于发送的数据包大小,会造成部分数据丢失,但是不会再次接收
44.什么是WebSocket
?
WebSocket
是HTML5
中实现来的一种浏览器与服务器之间进行全双工通信的网络技术,是应用层的协议,基于TCP
协议,复用HTTP
的握手通道- 浏览器只需要与服务器进行一次握手,两者就可以建立持久的连接用来进行双向数据传输
WebSocket
技术的出现解决了半双工通信的弊端- 使用
WebSocket
服务后,服务端可以向客户端主动推送消息,客户端也可以向服务端主动推送消息 - 实现原理
- 客户端向
WebSocket
服务器通知一个带有所有接收者ID
的事件,服务器接收后立即通知所有活跃的客户端,只有ID
在接收者ID
序列中的客户端才会处理该事件
- 客户端向
- 特点
- 支持双向通信,实时性强
- 可以发送文本与二进制数据
- 基于
TCP
协议,服务端的实现比较容易 - 数据格式轻量化,性能开销小,通信高效
- 没有同源限制,客户端可以与任意服务端通信
- 协议标识符为
ws
,加密协议为wss
,服务器网址就是URL
- 兼容
HTTP
协议,默认端口也是80
与443
,握手阶段采用HTTP
协议,握手时不容易被屏蔽
45.如何实现即时通讯?短轮询
,长轮询
,长连接SSE
,WebSocket
有什么区别?
- 短轮询与长轮询的目的是用于实现客户端与服务端的即时通讯
- 短轮询
- 浏览器每隔一段时间都会向服务端发送请求,服务端收到请求后,无论是否有数据更新都进行响应
- 通过客户端不断地向服务端发送请求,模拟实时收到服务端数据的变化
- 方式简单,易于理解,但是由于需要不断地建立
HTTP
连接,浪费了服务端与客户端的资源,如果用户数量过多,会严重增加服务器的压力
- 长轮询
- 客户端向服务端发送请求,服务端接收到请求后不会立即进行响应,服务端先将该请求挂起,并判断请求的数据是否有更新,如果有更新,将更新后的数据进行响应,如果长时间没有更新,则直到设定的限制时间到期后进行响应
- 客户端接收到响应的数据后,再次发送请求重新建立连接要求通信
- 长轮询减少了不必要的
HTTP
请求次数,节约了资源,但是连接挂起也会导致资源的浪费.
SSE
- 服务器使用流传输向客户端推送信息
- 服务端向客户端声明,接下来发送的是流信息,表示发送的信息不是一次性的数据包,而是一个数据流,会持续不断地进行发送,因此,客户端不会关闭连接,会一直等待服务器发送新的数据流
- 基于
HTTP
协议,它不需要建立过多的HTTP
请求,节约了资源
WebSocket
- 是
HTML5
定义的一个新的协议,是一个全双工的协议,允许客户端与服务端互相平等地通信,即允许服务端主动向客户端发送信息,也允许客户端向服务端主动发送信息 - 不同于
SSE
的单向主动通信,只允许服务端主动向客户端发送信息,如果客户端需要发送一个信息给服务端,则需要另外请求
- 是
- 短轮询,长轮询与
SSE
都是基于HTTP
协议 - 性能上,
WebSocket
>SSE
>长轮询
>短轮询
- 考虑兼容性,
短轮询
>长轮询
>SSE
>WebSocket