相信我是不是细狗在上一章,大家心里已经有答案了。成年雄性动物的破防往往只在一瞬间。前面说过Http是基于TCP的,TCP讲完了,这回看看Http。
Http版本:
- Http1.0:未加密、每次传输要三次握手、不支持断点续传、每个主机绑定1个IP。
- Http1.1:身份验证、长连接(可设置连接时长)、支持断点续传、多虚拟机共享IP。
- 范围请求技术(断点续传):将请求数据体压缩,再分块传输,服务端若返回分块的数据到客户端,客户端可解析显示。如下载文件,断网后再续接下载。(数据请求分成多个范围段,再组合)
- Http2.0:压缩Http1.1头大体小的包、二进制格式传输更快、Https上运行安全。
- 非顺序发送包:同一连接中发送多个包,包可能属于不同回应,对于每个请求/应答的所有包,数据流可指定优先级,提高响应。
- 多路复用:一个TCP连接中有多个请求包,无需顺序回复,降低延迟避免队头阻塞。
- 服务器主动推送:对于JS、CSS等静态文件提前发送,减少延时等待。
- 压缩请求头(静态表+动态表):静态表即前面请求头对应编号的固定表,用对应编号代替请求头,后面字符链接在机器中是ASCLL值(占8b),用哈夫曼编码压缩(占5~6b)。动态表即缓存首次请求、缓存首次请求头+哈夫曼编码后面新链接。
- 因2.0多路复用,则TCP层不知到Http请求包的个数,若丢1个包则所有请求包都要等待包重传。
- Http3.0:下层改为UDP,基于QUIC协议实现可靠传输。丢1个包仅阻塞当前流,其他流无影响,避免Http2.0问题。QUIC将Https的6次握手合并为3次握手,QUIC是基于UDP的伪TCP+TLS+Http2.0的多路复用协议。(由于设备支持问题,暂未普及)
- Http1.1请求方法: get获取资源、post提交数据、put更新资源、delete删除资源、head读资源的元数据、options读资源支持的全部请求方法、trace回显服务器上的的额外请求。
- Get请求:回退或进入都无影响、 get请求发送1个TCP包(含Http Header和data)。
- Post请求:回退或进入都重提交、 post发2个包,先发header,返回100后再发data。
Http响应模型:
- 单进程IO模型:服务器开启1个进程,仅处理1个Http请求,按顺序回应。
- 多进程IO模型:服务器并行开多个进程,每个进程处理1个Http请求,同时处理多个。
- 复用IO模型:服务器开1个进程多个线程,每个线程响应1个Http请求,类似NIO。
- 复用多线程IO模型:服务器开多进程,每个进程多线程,每个线程响应1个Http请求。
Http传输:
- Http无状态协议,即每次不记忆用户操作,而再次操作无需再登录是cookie实现的。
- 使用JWT机制,浏览器记忆用户操作。cookie存在本地,但JWT的cookie可跨域认证。
- Http状态码:200(成功)、204(处理成功但无新数据刷新界面)、206(返回部分范围请求)、301(URL已移除)、302(重定向错误)、304(附带的请求不符合条件)、400(请求语法错误)、401(需要身份认证)、403(无权访问)、404(无资源)、500(内部错误)、503(服务器正忙)。
- Http通信:明文传输、未加密、无法验证身份、无法验证完整性
Https传输(Https=Http+SSL/TLS):
- Http请求—>TCP—>IP—>网卡、 Https请求—>SSL/TLS—>TCP—>IP—>网卡。
- Https传输:即Http数据包通过SSL/TLS层加密后传输,SSL(安全套接层)即TLS(传输层安全协议)。
- Https首次建立连接共6次握手:TCP连接3次握手 + TLS交互4次握手 =7次。但TCP第3次握手可携带数据,所以总握手次数为7-1=6次。
- SSL的4次连接流程(非对称加密+对称加密):
- 请求经过CA数字证书携带公钥发送到服务端(对应私钥存在服务端且不公开)。
- 服务端收到后,配置公钥证书返回给客户端。
- 客户端收到后,递归判断根证书是否合法,合法则发送公钥加密后的随机Key,不合法则会警告。
- 服务端收到后,利用对应私钥解密得到Key。流程完成,之后会用Key加密传输。
- 服务端用(Key对称加密)返回数据,客户端用(Key对称解密)获取数据。
- 对称加密: 即用一个Key加密,再用这个Key解密。但首次传Key时若被监听会不安全。
- 非对称加密:公钥加密,私钥解密。私钥加密,公钥解密。相对安全但存在问题:
- 服务端公钥加密返回数据,但客端不存在私钥,所以无法解密。不成立。
- 服务端私钥加密返回数据,但首次发送公钥时若被监听,则仍不安全。
- 2组公钥私钥,安全且可行,但性能消耗大。顾最终TLS选择(公钥私钥+Key密钥)。
- 中间人攻击:起初服务端颁发公钥A1时,中间人拦截A1并给客户端公钥B1,客户端得到后用B1加密Key再发送,中间人再拦截数据用私钥B2解密得Key并发送给服务端,服务端获取到Key。如此一来,中间人获取到Key后,之后传输的数据他均可解密获得。解决:
- 通过CA机构认证,获取数字证书(含公钥、自身信息等)发给服务端,服务端再返回。
- 私钥会验证数字签名:防止中间人只修改CA数字证书的公钥部分,实现篡改后可用。
- XXS攻击:恶意脚本请求,存到数据库中影响正常用户请求。预防:防火墙+拦截处理。
- CSRF攻击:跨域请求伪造(盗用身份去恶意请求)。预防:验证 Http Referer字段、请求添加token并验证、Http头中自定义属性并验证。
- DNS欺骗:冒充域名服务器的一种欺骗行为。预防:使用入侵检测系统、使用DNSSEC。
- 重放(重播/回放)攻击:发送1个目标主机已接收过的包来欺骗系统,身份认证过程中破坏认证的正确性。 预防:加随机数使其唯一、加时间戳使其唯一。
常见加密算法:
- token:用户登录验证成功后,据uuid等参数生成token给用户,服务端存token的对应关系,请求携token避免总去密码验证。设置有效期,过期后需要重获token。
- sign:请求参数的签名,避免请求参数被篡改,保证数据一致,客户端服务端用相同的签名算法,客户端发送(数据和数据经过算法得的签名),服务端收到后比较签名与数据经过算法得到的结果是否一致。一致即未被篡改。
- nonce:附带随机数,防止恶意重复发送相同请求,客户端发送的包携带随机数,服务端收到随机数后,判断是否在缓存中。是则拒绝本次请求,否则放入缓存并接受请求。
- timestamp(时间戳):一般与nonce联用,避免服务端缓存大量的nonce,每次查找nonce耗时变长。时间戳设置超时时间,超时则清除缓存,同时也是nonce的有效期。
- 数据保密性:AES(对称加密)、RSA(非对称加密)、联合使用。
- 加盐算法(非加密算法):MD5校验数据是否被篡改(MD5仅能将数据计算为特殊的MD5值,不能解密且不可逆)、Base64将数据流编码为安全字符。
- SHA(安全散列算法):密码散列函数家族(FIPS认证的安全散列算法),能计算一个数字消息所对应的定长字符串。又称消息摘要算法:输入的消息不同,它们对应到不同字符串的机率很高。