什么是HTTP? HTTP 和 HTTPS 的区别?
HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范。
一、特点
支持客户/服务器模式
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
无状态:HTTP协议无法根据之前的状态进行本次的请求处理
可扩展的:在 HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。
二、HTTP 消息结构
1. 请求报文
HTTP请求报文由:请求行、请求头部、空行和请求数据四个部分组成。
2. 响应报文
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
三、HTTP请求方法
HTTP1.0定义了三种请求方法:GET, POST , HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE , CONNECT 方法。
四、HTTP 首部
主要分为通用首部、请求首部、响应首部和实体首部四种:
五、HTTP 状态返回码
状态码负责表示客户端请求的返回结果、标记服务器端是否正常、通知出现的错误。
六、HTTP 内容类型
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
常见的媒体类型:
文本文件:text/html, text/plain, text/css, application/xml
图片文件:iamge/jpeg, image/gif, image/png;
视频文件:video/mpeg
应用程序使用的二进制文件:application/octet-stream, application/zip
常用的内容编码:
gzip: 由文件压缩程序gzip生成的编码格式;
compress: 由Unix文件压缩程序compress生成的编码格式;
deflate: 组合使用zlib和deflate压缩算法生成的编码格式;
identity:默认的编码格式,不执行压缩。
七、HTTP Cookie
Cookie主要用于以下三个方面:
会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
个性化设置(如用户自定义设置、主题等)
浏览器行为跟踪(如跟踪分析用户行为等)
标记为Secure的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。
为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie API无法访问带有HttpOnly标记的Cookie,它们只应该发送给服务端。
八、 HTTP 缓存
重用已获取的资源能够有效的提升网站与应用的性能。Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间。借助 HTTP 缓存,Web 站点变得更具有响应性。
1. 各种类型的缓存
缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。
缓存的种类有很多,其大致可归为两类:私有与共享缓存。共享缓存存储的响应能够被多个用户使用,私有缓存只能用于单独用户。
下文将主要介绍浏览器缓存,除此之外还有代理缓存、网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上,为站点和 web 应用提供更好的稳定性、性能和扩展性。
常见的 HTTP 缓存只能存储GET响应,对于其他类型的响应则无能为力。
2. 缓存规则
为了方便理解,我们认为浏览器存在一个缓存数据库,用于存储缓存信息(实际上静态资源是被缓存到了内存和磁盘中),在浏览器第一次请求数据时,此时缓存数据库没有对应的缓存数据,则需要请求服务器,服务器会将缓存规则和数据返回,浏览器将缓存规则和数据存储进缓存数据库。
我们可以将其分为两大类强缓存、协商缓存
2.1 强缓存
浏览器如果判断本地缓存未过期,就直接使用,无需发起http请求(200 from memory/disk cache)
HTTP 1.0
服务器使用的响应头字段为Expires,值为未来的绝对时间(时间戳),浏览器请求时的当前时间超过了 Expires 设置的时间,代表缓存失效,需要再次向服务器发送请求,否则都会直接从缓存数据库中获取数据。
2.2 协商缓存
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
HTTP 1.0
If-Modified-Since/Last-Modified这两个是成对出现的,属于协商缓存的内容,其中浏览器的头部是If-Modified-Since,而服务端的是Last-Modified,它的作用是,在发起请求时,如果If-Modified-Since和Last-Modified匹配,那么代表服务器资源并未改变,因此服务端不会返回资源实体,而是只返回头部,通知浏览器可以使用本地缓存。Last-Modified,顾名思义,指的是文件最后的修改时间,而且只能精确到1s以内。
HTTP 1.1
If-None-Match/E-tag这两个是成对出现的,属于协商缓存的内容,其中浏览器的头部是If-None-Match,而服务端的是E-tag,同样,发出请求后,如果If-None-Match和E-tag匹配,则代表内容未变,通知浏览器使用本地缓存,和Last-Modified不同,E-tag更精确,它是类似于指纹一样的东西,基于FileEtag INode Mtime Size生成,只要文件变,指纹就会变,而且没有1s精确度的限制。
HTTPS = HTTP + SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
首先客户端通过URL访问服务器建立SSL连接
服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端
客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级
客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站
服务器利用自己的私钥解密出会话密钥
服务器利用会话密钥加密与客户端之间的通信
区别
HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理,相对更安全
HTTP 和 HTTPS 使用连接方式不同,默认端口也不一样,HTTP是80,HTTPS是443
HTTPS 由于需要设计加密以及多次握手,性能方面不如 HTTP
HTTPS需要SSL,SSL 证书需要钱,功能越强大的证书费用越高
为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?
HTTP在通信过程中,存在以下问题:
通信使用明文(不加密),内容可能被窃听
不验证通信方的身份,因此有可能遭遇伪装
SSL的实现这些功能主要依赖于三种手段:
对称加密:采用协商的密钥对数据加密。对称加密指的是加密和解密使用的秘钥都是同一个,是对称的。只要保证了密钥的安全,那整个通信过程就可以说具有了机密性
非对称加密:实现身份认证和密钥协商。非对称加密,存在两个秘钥,一个叫公钥,一个叫私钥。两个秘钥是不同的,公钥可以公开给任何人使用,私钥则需要保密。公钥和私钥都可以用来加密解密,但公钥加密后只能用私钥解 密,反过来,私钥加密后也只能用公钥解密
混合加密:在HTTPS通信过程中,采用的是对称加密+非对称加密,也就是混合加密。
在对称加密中讲到,如果能够保证了密钥的安全,那整个通信过程就可以说具有了机密性
而HTTPS采用非对称加密解决秘钥交换的问题
具体做法是发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”
摘要算法:验证信息的完整性。
实现完整性的手段主要是摘要算法,也就是常说的散列函数、哈希函数
可以理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”
数字签名:身份验证
数字签名能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名
原理其实很简单,就是用私钥加密,公钥解密
签名和公钥一样完全公开,任何人都可以获取。但这个签名只有用私钥对应的公钥才能解开,拿到摘要后,再比对原文验证完整性,就可以像签署文件一样证明消息确实是你发的
TCP和UDP应用场景
TCP 应用场景适用于对效率要求低,对准确性要求高或者要求有链接的场景,而UDP 适用场景为对效率要求高,对准确性要求低的场景
DNS协议 是什么?说说DNS 完整的查询过程?
DNS相当于一个翻译官,负责将域名翻译成ip地址。
查询方式:递归查询、迭代查询
域名缓存:浏览器缓存、操作系统缓存
查询过程:
解析域名的过程如下:
首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
若没有命中,则继续搜索操作系统的 DNS 缓存
若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器采用递归查询自己的 DNS 缓存,查找成功则返回结果
若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询
首先本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器的地址给本地服务器
本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起
至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起
如何理解CDN?说说实现原理
CDN就是根据用户位置分配最近的资源。用户在上网的时候不用直接访问源站,而是访问离他“最近的”一个 CDN 节点,术语叫边缘节点,其实就是缓存了源站内容的代理服务器。
原理:
在没有应用CDN时,我们使用域名访问某一个站点时的路径为
用户提交域名→浏览器对域名进行解释→DNS 解析得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复
应用CDN后,DNS 返回的不再是 IP 地址,而是一个CNAME(Canonical Name ) 别名记录,指向CDN的全局负载均衡
CNAME实际上在域名解析的过程中承担了中间人(或者说代理)的角色,这是CDN实现的关键
负载均衡系统
由于没有返回IP地址,于是本地DNS会向负载均衡系统再发送请求 ,则进入到CDN的全局负载均衡系统进行智能调度:
看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点
看用户所在的运营商网络,找相同网络的边缘节点
检查边缘节点的负载情况,找负载较轻的节点
其他,比如节点的“健康状况”、服务能力、带宽、响应时间等
结合上面的因素,得到最合适的边缘节点,然后把这个节点返回给用户,用户就能够就近访问CDN的缓存代理
缓存代理
缓存系统是 CDN的另一个关键组成部分,缓存系统会有选择地缓存那些最常用的那些资源
其中有两个衡量CDN服务质量的指标:
命中率:用户访问的资源恰好在缓存系统里,可以直接返回给用户,命中次数与所有访问次数之比
回源率:缓存里没有,必须用代理的方式回源站取,回源次数与所有访问次数之比
缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户
回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,可以有效地减少真正的回源
现在的商业 CDN命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上
说说 HTTP1.0/1.1/2.0 的区别?
HTTP1.0:
浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接
HTTP1.1:
引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用
在同一个TCP连接里面,客户端可以同时发送多个请求
虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着
新增了一些请求方法:put、delete、options
新增了一些请求头和响应头
引入了更多的缓存控制策略,如If-Unmodified-Since, If-Match, If-None-Match等缓存头来控制缓存策略
引入range,允许值请求资源某个部分
引入host,实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点
HTTP2.0:
采用二进制格式而非文本格式
完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行
使用报头压缩,降低开销
服务器推送
说说 HTTP 常见的请求头有哪些? 作用?
面试官:说说 HTTP 常见的请求头有哪些? 作用? | web前端面试 - 面试官系列 (vue3js.cn)
应用场景:
协商缓存:
协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对请求头响应头来管理的
Last-Modified 表示本地文件最后修改日期,浏览器会在request header加上If-Modified-Since(上次返回的Last-Modified的值),询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来
Etag就像一个指纹,资源变化都会导致ETag变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的
If-None-Match的header会将上次返回的Etag发送给服务器,询问该资源的Etag是否有更新,有变动就会发送新的资源回来
而强制缓存不需要发送请求到服务端,根据请求头expires和cache-control判断是否命中强缓存
会话状态:
cookie,类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据,通过响应头set-cookie决定
作为一段一般不超过 4KB 的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie有效期、安全性、使用范围的可选属性组成
Cookie 主要用于以下三个方面:
会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
个性化设置(如用户自定义设置、主题等)
浏览器行为跟踪(如跟踪分析用户行为等
说说TCP为什么需要三次握手和四次挥手?
如果是两次握手,发送端可以确定自己发送的信息能对方能收到,也能确定对方发的包自己能收到,但接收端只能确定对方发的包自己能收到 无法确定自己发的包对方能收到
四次挥手原因
服务端在收到客户端断开连接Fin报文后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN报文断开连接,因此需要四次挥手
说说对WebSocket的理解?应用场景?
一种网络传输协议,位于OSI模型的应用层。可在单个TCP连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通迅。客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输
特点:
全双工:通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合
二进制帧
采用了二进制帧结构,语法、语义与 HTTP 完全不兼容,相比http/2,WebSocket更侧重于“实时通信”,而HTTP/2 更侧重于提高传输效率,所以两者的帧结构也有很大的区别
协议名
引入ws和wss分别代表明文和密文的websocket协议,且默认端口使用80或443,几乎与http一致
握手
WebSocket也要有一个握手过程,然后才能正式收发数据。
Connection:必须设置Upgrade,表示客户端希望连接升级
Upgrade:必须设置Websocket,表示希望升级到Websocket协议
Sec-WebSocket-Key:客户端发送的一个 base64 编码的密文,用于简单的认证秘钥。要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept应答,否则客户端会抛出错误,并关闭连接
Sec-WebSocket-Version :表示支持的Websocket版本
优点
较少的控制开销:数据包头部协议较小,不同于http每次请求需要携带完整的头部
更强的实时性:相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少
保持连接状态:创建通信后,可省略状态信息,不同于HTTP每次请求需要携带身份验证
更好的二进制支持:定义了二进制帧,更好处理二进制内容
支持扩展:用户可以扩展websocket协议、实现部分自定义的子协议
更好的压缩效果:Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率
应用场景
弹幕、媒体聊天、协同编辑、基于位置的应用、体育实况更新、股票基金报价实时更新