文章目录
什么是http
http超文本传输协议,应用层协议,规定了客户端浏览器与服务器之间互相通信的规则,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
http请求和响应的格式
- 请求消息包括以下格式:请求行(请求方法,URL等)、请求头部(头部信息)、空行和请求数据四个部分组成。请求方法主要有增删改查。
- HTTP响应也由四个部分组成:状态行(状态码)、响应头头部、空行和响应正文。
状态码:2xx表示成功,4xx客户端错误,5xx服务端错误
http常用请求头字段
- Content-Length:表示请求消息正文的长度;
- content-type: 媒体类型:纯文本或者图片等
- user-agent: 浏览器类型,操作系统等、
- Cookie:这是最重要的请求头信息之一;
- accept-language:语言
- connection:是否需要持久连接,里面有三个字段:
keep-alive;timeout=5,max=1000
timeout表示如果在5这个时间没有新的连接则断开,最大连接数,达到了比如1000次请求了那么我们断开,重新连接。
http长连接短连接
connection:keepalive或者close
- 短连接:每次发起请求都要创建一个tcp连接。缺点:创建和关闭都要消耗资源和时间。应用:用户数目较多的网站,如果大量用户都长连接占用系统资源,则对系统是损失。
- 长连接:我们就用长连接保持请求在一定时间内不关闭,复用这个TCP连接。优点:1. 减少握手次数 2. 减少慢启动影响。缺点:长时间保持TCP,系统资源被无效占用。应用:频繁操作,点对点通信,比如即时通讯,网络游戏等
http无状态协议如何保存客户信息
因为一个 HTTP 服务器并不保存关于客户端的任何信息,所以我们说 HTTP 是一个无状态协议。
解决方法:
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
https://blog.csdn.net/guoweimelon/article/details/50886092
-
基于 Cookie 实现的会话保持
Cookie是由服务端生成的,发送给客户端的。Cookie总是保存在客户端中,客户后来重新连接时带上cookie,服务器对它进行检查,看是否存在该cookie,比如:cookie中带来客户端的用户名和密码,服务端直接从cookie中取出用户名和密码进行比对,但是这时用户名和密码都在客户端cookie中。
优点:服务器不用保存状态信息, 减轻服务器存储压力。
缺点:1. 该方式不够安全,因为状态信息存储在客户端。2. 浏览器每次发起 HTTP 请求时都需要发送额外的 Cookie占用头部 到服务器端,会占用更多带宽。 -
基于 Session 实现的会话保持
在客户端第一次向服务器发送 HTTP 请求后,服务器会创建一个 Session 对象并将客户端的身份信息以键值对的形式存储下来,然后分配一个(SessionId)给客户端,这个会话标识一般保存在客户端 Cookie 中,之后每次该浏览器发送 HTTP 请求都会带上 Cookie 中的 SessionId 到服务器,服务器根据会话标识就可以将之前的状态信息与会话联系起来,从而识别客户端。而且session在服务端可以保存任何数据类型,相当于一个java容器。也就是说用户名和密码都保存在服务器端,而客户端不需要保存了。
优点:安全性高,因为状态信息保存在服务器端。并且客户端都cookie很短只存储sessionId就可以了。
缺点:1. 服务器需要更高性能 2. 由于大型网站往往采用的是分布式服务器,浏览器发送的 HTTP 请求一般要先通过负载均衡器才能到达具体的后台服务器,倘若同一个浏览器两次 HTTP 请求分别落在不同的服务器上时,基于 Session 的方法就不能实现会话保持了。解决方法:采用中间件,例如 Redis,我们通过将 Session 的信息存储在 Redis 中,使得每个服务器都可以访问到之前的状态信息。
http1.0 ,1.1 ,2 ,3 的区别
https://juejin.cn/post/6844903489596833800
https://zhuanlan.zhihu.com/p/102561034
1.1比1.0增加
- 缓存控制策略
- 长连接
- 更多的状态错误码
http 2.0(重点使用了LTE通信技术)
- 支持消息推送:比如说我访问主页,那么服务器会把相关的一些消息都推送过来、,服务端预先向客户端推送需要的内容。
- 多路复用:跟我做的通信中的概念是一致的,他借鉴了lte通信的理论。首先,HTTP2 没有改变 HTTP1 的语义,只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流。
**一个连接上可以有多个流同时传输,一个流中有多个帧。**每个流被分割成帧,然后可能是打乱发送。服务端根据流id再将帧重组。
http1串行按顺序文件传输。当请求a文件时需要等到a发送完了b才能发送。而多路复用是把ab文件分成两个流并打散成帧表上序号,b不需要等a发完再发送,可以一起发送,相当于在一个连接上实现并行,更大效率使用该连接。 - header压缩,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自缓存一份header fields表,既**避免了重复header的传输,**又减小了需要传输的大小。
http3.0
https://network.51cto.com/art/202009/625999.htm
http2的缺点:因为http2是基于tcp,所以缺点都是TCP协议的,建立连接时间长,对头阻塞等问题。
http3使用udp来作为传输从协议。连接耗时低,简单易用。
Quic协议
HTTP3主要是在UDP协议之上,新增了QUIC协议
quic协议: 快速UDP网络连接,减少连接和传输延时,避免阻塞。UDP连接快,而且没有TCP那么复杂并且可扩展性更强。
- 无队头阻塞:TCP的队头阻塞:TCP协议在收到数据包之后,这部分数据可能是乱序到达的,但是TCP必须将所有数据收集排序整合后给上层使用,如果其中某个包丢失了,就必须等待重传,从而出现某个丢包数据阻塞整个连接的数据使用。QUIC协议是基于UDP协议实现的,在一条链接上可以有多个流,流与流之间是互不影响的,当一个流出现丢包其他流还会继续传,从而解决队头阻塞问题。
- 低延迟连接。TCP+TSL=3个RRT建立连接。连接使用DH加密,首次建立连接只需要 1 RTT(Round-Trid Time)延迟就可以建立安全可靠的连接(采用 TLS 1.3 版本),后面有缓存了只需要连接0RRT。
- QUIC协议的核心思想是将TCP协议在内核实现的诸如可靠传输、流量控制、拥塞控制等功能转移到用户态来实现,TCP是刚性的必须使用,而Quic允许用户在更高层选择性实现
http缓存控制策略
什么是缓存
什么是缓存,存储将要被用到的数据,提升访问速度,缓存成本低。
如果我们的请求在缓存中存在,我们说缓存命中了。
如果缓存中不存在,我们就需要穿透到服务器去请求。我们比较关注缓存命中率,因为我们想让缓存能够解决绝大部分请求而降低服务器的压力。通常我们希望80%的命中率。
缓存如何设计是个重要问题,因为缓存本身是比较小的,比如服务器有100G数据,那么缓存就只存10M,所以缓存有选择的去存储什么样的数据很关键。
缓存置换:当缓存满了之后,新的缓存条目就会替换旧的缓存条目。
LRU缓存置换算法:类似于手机内存最近使用应用,我们删除时间最久远的,保留时间最近的条目。
http中的缓存
https://www.cnblogs.com/chenqf/p/6386163.html
https://www.jianshu.com/p/c78b5de7a889
浏览器存在一个缓存数据库,用于存储缓存信息。
当用户开始访问一个网站时,假设我们不采取任何措施,则用户每次访问这个网站都要发起一系列http请求,试想,如果这个网站的pv达到上百万甚至上千万,会对网站的后台服务器造成多大的压力。为了尽可能提升网站的性能,我们可以将一些经常访问的比较小的静态资源存储在浏览器的缓存数据库中。
优点:
- 提升数据交换的性能(速度)
- 缓解服务器或数据库的压力
简单来说,http根据是否要向服务器发送请求将缓存规则分为了两类:强缓存和对比缓存(对比缓存也叫做协商缓存)
- 强制缓存:强制缓存如果生效(命中或者在缓存时间则直接使用缓存),不需要再和服务器发生交互,不生效(如果没命中或者超过缓存时间,则执行比较缓存策略或者不执行比较缓存)则向服务器请求并存储到缓存中。
- 对比缓存不管是否生效,都需要与服务端发生交互。但是如果缓存命中,那么客户端向服务器请求,服务器返回个状态码304给客户端。并不需要发送大量数据,节省空间和时间。客户端就可以直接使用缓存。
服务器通过附加一个Cache-control:选项,首部到响应中去控制http的缓存设置
http和https有什么区别
- 主要区别是安全:http简单的请求-响应过程,通过TCP建立连接,一旦建立连接,内容以明文方式发送,没有加密。https他是通过ssl/tsl协议进行加密传输。
- 速度:http响应更快,因为https还有一个SSL协商(四次握手)的过程。
https是如何保证安全性的(TLS/SSL协议)
一文看懂https如何保证数据传输的安全性的
对称加密和非对称加密
HTTPS 协议,就是“HTTP 协议”和“SSL/TLS 协议”的组合,TLS是新版,SSL是旧版
- 对称加密:所谓的“对称加密”,意思就是说:“加密”和“解密”使用相同的密钥。对称加密速度远快于非对称加密速度。比如DES加密算法。
- 非对称加密::所谓的“非对称加密”,意思就是说:“加密”和“解密”使用不同的密钥。非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)所谓的“公钥”,顾名思义就是可以公开的 key;而所谓的“私钥”就是私密的 key,私钥是自定义生成的。私钥加密,公钥解。公钥加密,私钥解。如RSA算法。
对称加密为何不安全
客户端发送数据给服务器端,使用对称加密将内容加密,但是这个密码在网络中传输可能被截获。像银行就可以使用U盾把这个密码放在线下。但是这不适合线上环境。这个密码容易被截获,所以我对密码执行二次加密(非对称加密),服务器拿私钥生成公钥,公钥下发给客户端,客户端用公钥加密密码,然后把密码发回给服务器,这样服务器拿到该加密密码,通过私钥就可以解开该密码了。
ssl四次握手(加密过程)
- 客户端请求建立https链接,并向服务端发客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。
- 服务端回复一种客户端支持的加密方法,CA证书(面首先要花钱、他是一个权威机构颁发的)证书中包括非对称加密的公钥。
- 浏览器验证CA证书。如果发现其中有诈,浏览器会提示“CA 证书安全警告”。客户端生成(对称)密钥key并 利用服务端的公钥对对称密钥进行加密(非对称加密算法比如RSA),发送给服务器。
- 服务器通过自己的私钥对对称密钥进行解密,就可以得到需要加密的对称密钥key了,然后返回给客户端握手结束通知。后面双方都使用对话密钥做对称加解密,加密和解密内容,就可以进行内容传输了。
总的来说,通信内容用对称加密算法机密,通过非对称加密来加密对称加密的密码
什么是HTTPS中间人攻击
黑客会劫持CA真实证书,然后伪造CA证书
黑客核心部分是:他需要客户将他伪造的CA证书装到客户端,这样客户端再去请求,那么黑客就可以根据伪造的证书解密了。比如说黑客让你玩一个游戏,在玩游戏过程中需要你安装伪造证书。
什么是DNS
https://www.cnblogs.com/crazylqy/p/7110357.html
域名解析系统:人们通过例如 nytimes.com 或 espn.com 等域名在线访问信息。Web 浏览器通过 ,DNS 将域名转换为 IP 地址,以便浏览器能够加载 Internet 资源。
DNS解析工作工程:目的,向DNS服务器发送域名,让DNS服务器返回IP地址
- 发送www.163.com域名给本地DNS服务器,本地DNS服务器看有没有缓存,没有就向DNS根服务器去找。
- dns根服务器告诉本地DNS服务器去.com域服务器去找
- .com域服务器告诉区163.com域服务器去找,然后163.com域服务器返回给本地DNS服务器IP地址,本地IP地址缓存以便下次查询并返回给用户ip地址。
一次DNS查询速度最快和最慢差距多大:
最快:直接从本地机器缓存中就查到IP地址
最慢:本地没有,需要本地服务商,然后根服务器,然后顶级域名,然后权威域名,然后返回。
DNS劫持
就是域名劫持,在我们发送域名请求解析的时候,黑客劫持本地DNS服务器,将错误的IP地址返回给我们,这样我们就不能够正确访问网站。一般劫持只在特定范围内,其他DNS服务器是正常的。
预防手段:
- 直接通过IP地址访问网站
- 设置计算机的首选DNS服务器,比如8.8.8.8,从而绕过被劫持的DNS服务器。
什么是CDN
内容分发网络,目的是去中心化,提供一个离用户更近的数据中心。他其实跟DNS是非常类似的,也是部署有根服务器,和各个节点服务器。DNS是缓存域名IP,而CDN是缓存内容。
当客户端请求资源时,那么他请求的是最近服务器看是否有缓存资源,如果有则直接发送给客户端,这样资源请求速度就很快,如果没有则本地服务器向根服务器请求并缓存到本地服务器。比如淘宝的图片访问,有98%的流量都走了CDN缓存。只有2%会回源到源站,节省了大量的服务器资源。
URL
URL使用url唯一定位互联网中的一个资源,比如一个图片,一个音乐文件
URI(统一资源标识符)和 URL(统一资源定位符)之间的区别
URL 其实就是我们平时上网时输入的网址,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。例如 https://leetcode-cn.com/problemset/all/ 这个 URL,标识一个特定资源并表示该资源的某种形式是可以通过 HTTP 协议从相应位置获得。
从定义即可看出,URL 是 URI 的一个子集,两者都定义了资源是什么,而 URL 还定义了如何能访问到该资源。URI 是一种语义上的抽象概念他知识定义了唯一资源,而URL则必须提供足够的信息来定位,是绝对的。
代理服务器(正向代理和反向代理)
代理服务器接收一个请求,然后把请求转发给另一个服务器,从另一个服务器接收结果,然后再返回给请求方。
-
正向代理:类似于翻墙VPN,他就是一个代理,请求方知道访问的是代理服务器,通过代理服务器来访问目标网站
-
反向代理,请求方并不知道使用了代理,以为就是访问的是目标网站,而服务器使用反向代理来做一些负载均衡等事情。
网页解析全过程
- DNS 解析:浏览器将域名发送给DNS服务器,向DNS服务器获取到IP地址以便于访问。
- TCP 连接:Web 服务器真正的 IP 地址后,便向 Web 服务器发起 TCP 连接请求,通过 TCP 三次握手建立好连接后。
- 发送 HTTP 请求:浏览器向 Web 服务器发起一个 HTTP 请求,按照HTTP协议标准发送一个索要网页的请求。在这一过程中,会涉及到负载均衡等操作(因为如果有大量用户同时发送请求那么我们都请求一个服务器的话,一个服务器肯定不能处理这么多操作,这就需要大量的服务器协同工作,而我们使用反向代理服务器,来将大量请求均衡分配给不同服务器来处理,提高处理速度)。
- 返回请求:服务器获取到客户端的 HTTP 请求后,会根据 HTTP 请求中的内容来决定如何获取相应的文件,并将文件发送给浏览器。
- 浏览器渲染:浏览器根据响应开始显示页面,首先解析 HTML 文件构建 DOM 树,然后解析 CSS 文件构建渲染树。
- 断开连接:当客户端数据请求完成关闭浏览器后,或者找过一定时间,客户端和服务器通过四次挥手终止 TCP 连接