关于http协议你知道多少
http协议
- HTTP协议是超文本传输协议,对于HTTP来说多了一层 SSL/TLS
- 基于TCP/IP通信协议来传递数据
- http协议是短连接协议,限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接
- HTTP协议是无状态协议,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
- 通过http协议中头部的Content-Type标记,可以传输任意数据类型的数据对象(文本、图片、视频等等),非常灵活
- 发送请求访问某个资源时,只需传送请求方法和URL就可以了,使得http服务器的程序规模小,因而通信速度很快
- HTTP1.0定义了三种请求方法:GET, POST , HEAD方法
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE , CONNECT 方法(如果是 RESful 接口的话一般会用到 PUT、DELETE、GET、POST,分别对应增删查改)
http状态码
- 1xx 信息响应(100-Continue-继续,客户端应继续其请求)
- 2xx 成功相应(200-ok-请求成功)
- 3xx 重定向(301-Moved Permanently-永久重定向,304-Not Modified-缓存)
- 4xx 客户端错误(401-Unauthorized-无权限,403-Forbidden-服务器理解请求客户端的请求,但是拒绝执行此请求)
- 5xx 服务器错误(500-Internal Server Error-服务器内部错误,502-Bad Gateway-从远程服务器接收到了一个无效的响应,503-Service Unavailable-服务器暂时的无法处理客户端的请求)
关于http的缺点
- 无状态
- 不安全
- 明文传输:报文(header部分)使用的是明文,直接将信息暴露给了外界
- 队头阻塞:只建立一个TCP连接,同一时刻只能处理一个请求,那么当请求耗时过长时,其他请求就只能阻塞状态
HTTP 和 HTTPS 的区别
- HTTP是明文传输,不安全的,HTTPS是加密传输,安全的多
- HTTP标准端口是80,HTTPS标准端口是443
- HTTP不用认证证书免费,HTTPS需要认证证书要钱
- 连接方式不同,HTTP三次握手,HTTPS中TLS1.2版本7次,TLS1.3版本6次
- HTTP在OSI网络模型中是在应用层,而HTTPS的TLS是在传输层
- HTTP是无状态的,HTTPS是有状态的
TCP三次握手
- 客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口
- 服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息
- 客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”
关于加密
- TLS是SSL的升级版,TLS需要保证信息的:机密性、可用性、完整性、认证性、不可否认性
- TLS实际用的是两种算法的混合加密。通过 非对称加密算法 交换 对称加密算法 的密钥,交换完成后,再用对称加密进行加解密传输数据。
- 浏览器和服务器通信通过共同支持的加密套件,用来实现安全的通信
- RSA:表示握手时用RSA算法交换密钥,即不对称加密算法,就是一对密钥,有公钥(public key)和私钥(private key),对于安全性来说,使用公钥反推出私钥是非常困难,但不是做不到,随着计算机运算能力提高,非对称密钥至少要2048位才能保证安全性,这就导致性能上要比对称加密要差很多
- PSK:表示使用PSK算法签名
- AES128-GCM:表示使用AES256对称加密算法通信,就是加密和解密使用同一个密钥
- SHA256:表示使用SHA256算法验证信息完整性并生成随机数
HTTP2有哪些特点
- 二进制分帧层:HTTP2性能提升的核心就在于二进制分帧层,1.1响应是文本格式,而2.0把响应划分成了两个帧,图中的HEADERS(首部)和DATA(消息负载) 是帧的类型,缩小了请求体积
- 多路复用:HTTP/1.1的线头阻塞和多个TCP连接的问题,HTTP2的多路复用完美解决。HTTP2让所有的通信都在一个TCP连接上完成,真正实现了请求的并发,HTTP2对同一域名下所有请求都是基于流的,也就是说同一域名下不管访问多少文件,只建立一次连接
- 头部压缩:
- 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部名称和值的组合
- 维护一份相同的动态字典,可以动态的添加内容
- 通过静态Huffman编码对传输的首部字段进行编码
- 允许服务端主动推送数据给客户端
- 请求优先级:可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验。
关于缓存
- 为了使缓存策略更加健壮、灵活,HTTP 1.0 版本 和 HTTP 1.1 版本的缓存策略会同时使用,甚至强制缓存和协商缓存也会同时使用,对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接使用缓存,超出有效时间,执行协商缓存策略,对于协商缓存,将缓存信息中的 Etag 和 Last-Modified 通过请求头 If-None-Match 和 If-Modified-Since 发送给服务器,由服务器校验同时设置新的强制缓存,校验通过并返回 304 状态码时,浏览器直接使用缓存,如果协商缓存也未命中,则服务器重新设置协商缓存的标识。
- 强缓存:浏览器如果判断本地缓存未过期,就直接使用,无需发起http请求
- HTTP 1.0中服务器使用的响应头字段为
Expires
, 值为未来的绝对时间(时间戳),浏览器请求时的当前时间超过了 Expires 设置的时间,代表缓存失效 - HTTP 1.1中Cache-Control 是最重要的规则,默认为private,共有5种值:
- private 私有缓存
- public 共享缓存
- max-age 缓存的内容将在 xxx 秒后失效
- no-cache 需要使用对比缓存来验证缓存数据
- no-store 所有内容都不会缓存,强缓存、协商缓存都不会触发
- HTTP 1.0中服务器使用的响应头字段为
- 协商缓存:第一次请求时服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码
- HTTP1.0中If-Modified-Since/Last-Modified 这两个是成对出现的
- HTTP 1.1中If-None-Match/E-tag 这两个是成对出现的
补充
- 从浏览器地址栏输入 url 到请求返回发生了什么?
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 关闭 TCP 连接,通过四次挥手释放 TCP 连接
- 浏览器解析渲染页面
- 解析 HTML 结构,构建 DOM 树
- 解析 CSS,生成 CSS 规则树
- 合并 DOM 树和 CSS 规则,生成 render 树后绘制
- 加载外部脚本
- 解析并执行部分脚本代码
- DOM 树构建完成(PS 可以使用 DOMContentLoaded 事件插入在此之后)
- 加载图片等外部文件
- 页面执行完毕后再执行 window.onload
-
TCP/UDP 都属于传输层,但是他们有什么区别
- TCP 协议面向有连接,能正确处理丢包,传输顺序错乱的问题,但是为了建立与断开连接,需要至少 7 次的发包收包,资源浪费
- UDP 面向无连接,不管对方有没有收到,如果要得到通知,需要通过应用层
-
TCP/IP 协议族按层次分为以下四层
- 应用层
- 传输层
- 网络层
- 链路层
- XSS :跨站脚本攻击
- 利用 html 可以执行
<script>alert(1)</script>
的特性,将脚本注入页面中, - 通过输入框将脚本代码注入数据库
- CSRF 跨站请求伪造攻击防范措施
- Get 请求不用于对数据进行修改
- Cookie 设置 HTTP Only
- 接口设置禁止跨域
- 请求时附带验证信息,比如验证码或者 Token
- 中间人攻击
- 中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。
- 攻击者不仅能获得双方的通信信息,还能修改通信信息。中间人攻击的本质是客户端和服务端之间的认证和信任问题。