这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记。
HTTP协议
HTTP:超文本传输,超文本是指即除了文本的传输之外,还能有图片、音频、视频等媒介的传输。
通俗理解,HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)。
1.协议
协议的组成:
2.GET与POST方法
安全性:多次请求操作不会改变服务器的数据
幂等性:多次重复操作所获得的结果相同
get方法:用于向服务器请求数据,请求参数一般位于URL处,由于是只读操作,所以是安全幂等的。所以可以将get的请求数据做为缓存。
post方法:用于向服务器提交数据,数据会存在报文中,由于会更改服务器的数据,所以没有安全性和幂等性,避免传输的数据被窃取,需要https协议,这样所有的http数据都会加密处理
3.HTTP缓存
对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,缓存分为强制缓存与协商缓存,采用缓存的优先级如下:
1.强制缓存(优先级高)
需要浏览器判断是否可以使用缓存,建议使用Response头部加上Cache-Control来实现强缓存,流程如下:
- 浏览器第一次向服务器访问资源,当服务器第一次返回数据时,会在
Response头部加上Cache-Control,其中Cache-Control设置了过期时间。 - 当浏览器再次访问相同资源时,会通过请求访问的时间与缓存过期时间进行比较。
- 如果未过期就使用缓存,如果过期就会重新访问服务器,服务器收到请求会再次更新
Cache-Control。
2.协商缓存(当强制缓存过期之后才会执行)
服务端告诉浏览器是否可以使用缓存,当状态码为304时,即浏览器可以使用本地缓存
1. 基于时间实现
通过头部的If-Modified-Since 字段与响应头部中的 Last-Modified 字段(表示服务器资源最后被修改的时间)实现
当缓存过期时,浏览器发现Response头部有 Last-Modified 字段,再次发送请求时,会带上Last-Modified资源最后被修改的时间,将其和If-Modified-Since时间进行比较,如果修改的时间较大,则需要返回最新的资源,HTTP 200 OK;反之,响应HTTP 304返回原先的缓存
2. 基于一个唯一标示实现(避免了上述时间修改造成的不可靠)(优先级高)
通过请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段(唯一标识响应资源)
当缓存过期时,浏览器发现Response头部有ETag字段,再次发送请求时,会将请求头中 If-None-Match 值设置为ETag的值。服务器收到资源会进行比对,如果资源发生了变化就会返回HTTP 200 OK,返回最新的资源,未发生变化就会返回HTTP 304,返回原先的缓存。
不足与展望:
1.网络接入协议
-
路由发包原理:
- 同网段:配置网段即可默认添加静态路由。获取对端MAC直接发包
- 跨网段:配置网关路由。获取网关MAC地址发包
- 动态路由:BGP/OSPF等,路由表在动态变化
- 路由是网状的,不一定是对称的
-
ARP协议
- ARP广播/应答:协议原理
- 免费ARP:主动广播告知MAC地址
- ARP代理:虚拟网络/伪造MAC地址
-
IP协议
- IPv4:互联网终端节点的唯一标识
- IPv6:不仅仅是IP地址长度的增加
-
NAT
- NAT上网:家用路由器
- NAT出网:机房内网主机上外网
- NAT原理:注意不仅仅是源地址变换,源端口/校验和/SEQ等都会变化 同网段:虚拟网络段,可以是多个交换机连接起来路由不一定是对称的
A->H有多条路可达,同样,H->A返回时也有多条路,所以路由不一定是对称的
路由是工作在IP层,路由协议并不一定是工作在IP层,如RIP基于UDP,BGP基于TCP,RIP和BGP二者属于应用层协议,OSPF和EIGRP基于IP,所以OSPF属于传输层协议。路由并不是改的IP地址,是改的MAC地址,找到发包口,源IP地址和⽬标IP地址在传输过程中是不会变化的,只有源 MAC 地址和⽬标 MAC ⼀直在变化。
如何寻找下一跳的MAC
通过ARP协议,其本质是查找下一跳的MAC地址,而不是请求目标地址,逻辑同网段才能发送ARP,源发送ARP广播请求,目标收到后发出ARP应答单播。
2.网络传输协议
-
UDP
- 协议简单
- 需要考虑可靠性的场景使用复杂
-
TCP
- 三次握手:确认传输的序列号/MSS/Option字段,建立连接
- TCP连接:是一个虚拟的概念,本质上两倍维持一段内存,记录连接状态,就是session
- TCP传输:理解sequence number/acknowledge number
- 丢包重传:理解丢包怎么感知并重传,理解快速重传发生在什么时候
- 滑动窗口
- 流量控制
-
HTTP
- HTTP比TCP好在哪里:方便
- HTTP1.1的优化:长连接是重点
-
HTTPS
- HTTPS的产生背景:加密/可靠/防劫持
- SSL/TLS握手:非对称加密/对称加密
3.网络提速
-
HTTP2.0
- 多路复用:依然有队头阻塞
-
QUIC
-
QUIC的产生背景和背后思考:
- 为什么在用户态实现?内核的更新迭代频率较低,不好推广
- 为什么用UDP?TCP的队头阻塞问题不好解决,推倒重来&复用所有操作系统基本都支持的底层协议
-
-
数据中心建设
- 多运营商接入:同运营商内部访问,避免跨运营商的流量
- 有边缘机房/汇聚机房/中心机房
-
CDN静态缓存系统:边缘机房的建设,优先访问边缘机房,缓存命中视频/图片等静态内容
-
DSA动态加速系统:分四层/七层动态加速。核心在于利用可控节点做路径探测和规划。
4.网络稳定
- 对容灾的理解
-
网络容灾的具体案例
- 机房专线故障:环路容灾,避免某条专线故障导致机房孤岛问题(专线是连接各个机房的网络物理路径)
- 单机房接入节点故障:DNS容灾,摘除故障的节点-字节GTM系统
- 云控容灾:云端交互,服务器/云上下发命令到终端-字节TNC系统
- cache容灾:源站不可用,降级到之前的缓存内容-字节TLB/ByteCDN等系统的容灾建设
-
故障排查
- 加强故障沟通-明确故障
- 故障止损要在第一时间做(灾备预案的建设)
- 熟悉常用的故障排查命令
-
故障排查的具体案例
- 服务端配置异常(健康检查异常)
- 客户端某个例异常(客户端自己配置错误)
- 外部运营商故障
- 复杂故障的排查:需要抓包,具体问题具体分析
HTTPS协议
HTTPS = HTTP + 加密 + 认证 + 完整性保护
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL协议(TLS协议)代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则是HTTP先和SSL通信,再由SSL和TCP通信。在采用SSL之后,HTTP就拥有了HTTPS的加密、证书、完整性保护功能,SSL是独立于HTTP协议的,也就是说,不光是HTTP协议,其他运行在应用层的协议,都是可以使用SSL的。
1.HTTPS与HTTP的不同
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- HTTP 的端口号是80,HTTPS 的端口号是443。
- HTTPS 协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
2.HTTPS的安全解决方案
HTTP 由于是明文传输,所以安全上存在以下三个风险:
- 窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
- 篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
- 冒充风险,比如冒充淘宝网站,用户钱容易没。
HTTPS的解决方案
- 混合加密的方式实现信息的机密性,解决了窃听的风险。
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
- 将服务器公钥放入到数字证书中,解决了冒充的风险。
1.混合加密
HTTPS 采用的是对称加密(共享秘钥加密)和非对称加密(公开秘钥加密)结合的「混合加密」方式:
- 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。以这种方式加密时,必须将密钥也发给对方,同样的,如果可以确保密钥可以安全的到达,那么数据也是可以安全到达的。
- 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发,而私钥保密,解决了密钥交换问题但速度慢。发送密文的那一端,使用对方的公开密钥进行加密处理,对方接收到被加密的信息后,使用私钥对此密文进行解密。
- 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
- 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。
2.摘要算法(根据内容计算哈希值,保证内容完整)+ 数字签名(对哈希值私钥加密,公钥解密,保证内容来源可靠)
为了保证传输的内容不被篡改,客户端需要通过摘要算法对内容计算出一个「哈希值」,然后同内容一起传输给对方。
哈希值是唯一的,且无法通过哈希值推导出内容
对方收到后,先是对内容也计算出一个「哈希值」,然后跟发送方发送的「哈希值」做一个比较,如果「哈希值」相同,说明内容没有被篡改,否则就可以判断出内容被篡改了。
通过哈希算法可以确保内容不会被篡改,但是并不能保证「内容 + 哈希值」不会被中间人替换,因为这里缺少对客户端收到的消息是否来源于服务端的证明。
解决方案是采用非对称加密方式:公钥+私钥
(1)公钥加密,私钥解密,因为私钥在服务器这里,私钥不会泄露,所以保证了信息安全,但是公钥加密的是内容,性能较差,所以非对称加密不采用这种方式
(2)私钥加密,公钥解密,因为私钥不会泄露,所以保证了消息不会被篡改,此时私钥不是对内容加密,而是对内容的哈希值进行加密,所以非对称加密采用这种方式
数字签名算法:通过私钥加密,公钥解密的当时来保证内容不被篡改
3.数字证书(验证环节,防止服务端公钥被替换,而服务端不知道)
通过数字证书的方式保证服务器公钥的身份,解决冒充的风险
3.HTTPS建立连接的方式
1.SSL/TLS协议的流程
基本流程
- 客户端向服务端索要,并验证服务器的公钥
- 双方协商产生会话秘钥
- 双方依据会话秘钥进行通信
详细流程
- 客户端向服务器发送加密请求ClientHello
客户端发送支持的协议版本和密码套件列表,还有产生随机数用于生成会话秘钥
- 服务器接收客户端请求,并返回响应SeverHello
服务器响应内容:
(1)确认协议版本,如果浏览器不支持,则关闭加密通信。并确定密码套件列表
(2)服务器产生随机数用于生成会话秘钥
(3)数字证书
- 客户端回应
首先通过浏览器或者操作系统中的CA公钥,检查证书
- 服务器的最后回应