一、HTTP简介
通用格式URL
1 | <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> |
请求报文
1 | <method> <request-URL> <version> |
响应报文
1 | <version> <status> <reason-phrase> |
状态码分类
整体范围 | 已定义范围 | 分类 |
---|---|---|
100-199 | 100-101 | 信息提示 |
200-299 | 200-206 | 成功 |
300-399 | 300-305 | 重定向 |
400-499 | 400-415 | 客户端错误 |
500-599 | 500-505 | 服务器错误 |
首部
首部分为:通用首部、请求首部(accept首部、条件请求首部、安全请求首部和代理首部)、响应首部(协商首部和安全响应首部)、实体首部(内容首部和实体缓存首部)和拓展首部。
针对串行事务处理的HTTP连接性能提升:(Connection首部)
1、并行连接(缺点:每个事务都会打开/关闭一条新连接;TCP慢启动;并行数量上限引起的性能问题)
2、持久连接(HTTP/1.0+的”keep-ailve”和HTTP/1.1的”persistent”),为避免哑代理问题,引入Proxy-Connection字段,但只解决了单个哑代理带来的问题,无法解决多层次代理的情况。
于是HTTP/1.1默认所有连接是持久的,如果需要在事务结束后关闭,需要显式添加Connection:close首部。
3、管道化连接,只在HTTP/1.1上,允许在持久连接上可选地使用“请求管道”,但该连接同样会产生限制(例如不能发送非幂等的事务,如POST请求等)。
三次握手
四次挥手
1、“任意”解除链接
2、TCP连接是双向的,因此输入和输出信道有存在是否关闭。
第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i;
1.服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道;
2.客户机收到ACK(i+1)后,关闭客户机写通道;
第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
3.客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道;
4.服务器收到ACK(j+1)后,关闭服务器写通道。
这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。
代理的运用
1、Web缓存
2、反向代理
3、内容路由器
4、转码器
缓存
If-Modified-Since和Last-Modified的配合使用
If-None-Match和ETag的配合使用
压缩
Content-Encoding和Accept-Encoding
内容协商
Vary首部
二、HTTPS
介绍
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL(SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。),因此加密的详细内容就需要SSL。
复杂的一句话解释:
HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
原理
HTTPS解决的问题是:A客户端与B服务器端通信的内容,有且只有A和B有能力看到通信的真正内容。
多问些为什么:
1、怎么保证安全?加密,比如使用对称加密和非对称加密。对称加密速度快、效率高。非对称加密计算量大、效率低。由于效率问题,我们先从对称加密入手。
2、那先只使用对称加密是否能保证安全?当使用对称加密时,秘钥的管理和传输是个问题,会被中间人攻击,会泄漏。
3、怎么保证对称加密秘钥的安全?使用非对称机加密。私钥只有服务端有,而公钥可以发给所有的客户端。非对称加密需要解决的是密钥传输问题。
4、那么混合使用对称加密和非对称加密是否安全?不安全,因为非对称加密的公钥发送给客户端时,可能被中间人掉包。中间人用自己的假公钥替换掉服务端的真公钥,然后用假私钥解密后篡改,用真公钥加密,使得客户端最后用假公钥解密的内容会出现篡改。
5、怎么解决公钥被掉包的问题?涉及到密码学的身份验证问题,即客户端验证返回公钥的是真服务器还是中间人。所以,我们不能直接将服务器的公钥直接传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密。以上的过程其实是数字证书的本质。数字证书中包含了服务器的公钥,这个公钥被第三方机构的私钥加密了。
6、这样大功告成了嘛?不是,第三方机构不可能只给你一家公司制作证书,它也可能会给中间人这样有坏心思的公司发放证书。这样的,中间人就有机会对你的证书进行调包,客户端在这种情况下是无法分辨出是接收的是你的证书,还是中间人的。因为不论中间人,还是你的证书,都能使用第三方机构的公钥进行解密。
7、怎么解决同一机构颁发的不同证书被篡改的问题?需要客户端在拿到证书后,自己就有能力分辨证书是否被篡改了。这个验证必须是本地验证,如果涉及到远端服务,会使整个交互变慢。可使用数字签名,涉及到数字签名的算法。
8、客户端本地怎么验证证书呢?客户端拿到证书后,根据证书内容进行哈希算法,如MD5、SHA256,可以得到一个证书编号1。证书里还包含一个用第三方机构私钥机密后的证书编号2,客户端可使用第三方机构的公钥对证书编号2进行解密,两个证书编号比对后证明是否有效。这个证书编号就是数字签名。
9、第三方的公钥怎么来?浏览器和操作系统会维护一个权威的第三方机构列表和公钥。客户端接收的证书中有颁发机构,会根据颁发机构查找对应的公钥。
它的主要作用可以分为两种:一是建立一个信息安全通道,来保证数据传输的安全;二是确认网站的真实性。
https免费证书方案
Letsencrypt是一个免费、自动化和开放的证书颁发机构,其颁发的证书一次有效期为三个月,但是只要能持续更新,基本可以永久使用。
可使用脚本acme.sh,实现了acme协议, 可以帮你持续自动从Letsencrypt更新CA证书。
抓包工具
Web代理工具,俗称抓包,windows上有Fiddler,mac上有Charles,通用的有Nproxy,代理服务器有Anyproxy(当然近些年Fiddler、Charles也在做多端)。
1 | $ nmp install nproxy -g #安装nproxy |
- ios Thor
- android 小黄鸟 HttpCanary
- pad stream抓包神器
- fiddler抓包
- charles
- Nproxy
bpafter https://www.iherr.cn/
bpafter
bpu
其他
TCP/IP 基础知识总结 https://mp.weixin.qq.com/s/CnaOoN1GMVJ9iGzb6Bbdcw
为了一个 HTTPS,浏览器操碎了心··· https://mp.weixin.qq.com/s/A3d6-6KwcHiu8yF03tjYnw
你觉得HTTPS能防止重放攻击吗?https://www.toutiao.com/a7005058608551477791
http://blog.404mzk.com/http/liu-lan-qi-huan-cun-ji-zhi.html 浏览器缓存机制
https://blog.csdn.net/suliangkuanjiayou/article/details/98966822 HTTP协议抓包分析
https://mp.weixin.qq.com/s/IJlejxtKgm8k4jrUNaIdRg Websocket 百万长连接技术