HTTP
DNS
域名系统,把域名转化为IP地址的过程就是DNS解析过程
核心系统结构
- 根域名服务器(Root DNS Server):管理顶级域名服务器,比如com 、net 、cn等顶级域名服务器的 IP 地址
- 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 baidu.com 域名服务器的 IP 地址
- 权威域名服务器(Authoritative DNS Server):管理自己域名下主机的 IP 地址,比如 baidu.com 权威域名服务器可以返回 www.baidu.com 的 IP 地址。
DNS 查询
- 先从根域名服务器查询,然后是顶级域名服务器,接着是权威域名服务器。
- 查询的过程是从域名的右侧向左侧查询
DNS 缓存
- 公司、代理商都有自己的DNS服务器,用于缓存DNS
- 操作系统会对DNS解析进行缓存
- 操作系统里还有一个特殊的 主机映射 文件即我们熟悉的 host 文件
- 浏览器也有DNS缓存
完整的DNS 查询
- 查看浏览器的DNS缓存
- 查看操作系统的DNS缓存
- 查看 host 文件
- 查看公司DNS缓存
- 查看运营商DNS缓存
- 再从根域名服务器开始查询直到最后
请求方法
- GET 获取资源
- POST 传输实体主体
- PUT 传输文件 和FTP协议一样,在请求报文的主体中包含文件内容
- HEAD 获取报问首部,返回的只有资源的信息比如修改时间等不包括资源内容
- DELETE 删除文件,与PUT方法相反
- OPTIONS 询问服务器支持的请求方法
状态码
1xx
- 101 切换协议,在使用websocket时会用到
2xx
- 200 OK 请求已成功,返回正常数据
- 204 No Content 响应正常,但是没有响应内容,一般 PUT 和 DELETE 方法响应的是204
- 206 Partial Content 是 HTTP 分块请求,响应的只是部分数据。
状态码 206 通常伴随着头字段 Content-Range ,表示响应报文里 body 数据的具体范围,供客户端确认,例如 Content-Range: bytes 0-999/2000,意思是此次获取的是总计 2000 个字节的前 1000 个字节。
3xx
- 301 Moved Permanently 永久重定向
- 302 Found 临时重定向
- 304 Not Modified 缓存重定向
它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制
- 303 See Other 类似 302,要求重定向后的请求改为 GET 方法
- 307 Temporary Redirect 临时重定向,类似 302,重定向后请求里的方法和实体不变
- 308 Permanent Redirect 永久重定向,类似 301,重定向后请求里的方法和实体不变
4xx
- 400 Bad Request 请求报文有错误
- 401 Unauthorized 需要认证
- 403 Forbidden 服务器禁止访问资源
- 404 Not Found 未找到资源
- 405 Method Not Allowed 服务器禁止了使用当前 HTTP 方法的请求
- 413 Request Entity Too Large:请求报文里的 body 太大;
- 414 Request-URI Too Long:请求行里的 URI 太大;
- 429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;
- 431 Request Header Fields Too Large:请求头某个字段或总体太大
5xx
- 500 Internal Server Error 服务器内部错误
- 501 Not Implemented 请求的方法不被服务器支持
- 502 Bad Gateway 网关错误
- 503 Service Unavailable 服务器超负载或停机维护,暂时不能处理请求
- 504 Gateway Timeout 网关超时
TCP 状态
TCP 协议是有状态的,一开始处于 CLOSED 状态,连接成功后是 ESTABLISHED 状态,断开连接后是 FIN-WAIT 状态,最后又是 CLOSED 状态
分层
- 应用层
HTTP、DNS、FTP都是应用层
- 传输层
提供网络连接中的两台计算机之间的数据传输。TCP和UDP都是传输层
- 网络层
处理网络中的数据包。IP属于网络层
- 数据链路层
处理连接网络的硬件部分。网卡、光纤是数据链路层
cookie
- document.cookie 可以访问cookie,易造成 xss 攻击
- HttpOnly 只能通过 HTTP 协议传输,禁止其他方式访问包括JS访问
- SameSite 可以防范 跨站请求伪造(XSRF)攻击
设置成 SameSite=Strict 只在访问相同站点时发送 cookie;SameSite=Lax 允许本站上进行发送以及第三方的Get请求也能一起发送;
- Secure 表示仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在
请求头
- Accept 客户端希望接受的格式类型 比如 text/css text/html
- Accept-Encoding 客户端支持的编码方式 比如 gzip deflate br
If-xxx 条件请求
- If-Modified-Since 携带浏览器缓存资源的时间,服务器对比时间,相同就返回304。浏览器缓存资源时间是通过响应头的Last-Modified确定
- If-None-Match 携带ETag值,服务器的ETag值与此值对比,相同返回304
- If-Range 若指定的此值(ETag或时间)和请求的ETag或时间一致,服务器作为范围请求处理,否则返回全部资源
响应头
- ETag 服务器计算的资源的唯一标识符,分强ETag和弱ETag,弱ETag的值以W/开头
- Location 重定向时新的URI
- Allow 允许客户端的请求方法
- Content-Encoding 响应资源的编码方式
- Content-Range 响应资源的范围,主要是针对范围请求的处理
- Content-Type 响应资源的格式类型 比如 text/css text/html
- Content-Length 响应资源的大小 单位是字节
- Last-Modified 响应资源的最后修改时间
缓存
- 强制缓存如果生效,不需要再和服务器发生交互
- 协商缓存不管是否生效,都需要与服务端发生交互
强制缓存
- 强制刷新(ctrl+F5)和刷新(F5)都无效
- 地址栏回车、页面链接跳转、新窗口打开、前进、后退才有效
- Pragma
- expires
- cache-control
- 状态码是200
Pragma(已废弃)
- no-cache: 使用缓存,但是使用前去服务器校验是否有新版本
expires
- 具体的过期GMT时间,优先级低于 cache-control
cache-control
- no-store:不允许缓存,必须发送请求到服务器获取新资源
- no-cache:使用缓存,但是使用前去服务器校验是否有新版本
- must-revalidate:缓存不过期继续使用,过期就必须去服务器校验。
- max-age: 缓存时长,单位是秒
- public: 客户端和代理都可以缓存
- private: 代理不能缓存
状态码200
- from memory cache是从内存中获取,生命周期取决于当前的浏览器tab是否关闭
- from disk cache是从磁盘中获取
协商缓存
- 强制刷新(ctrl+F5)无效
- 刷新(F5)、地址栏回车、页面链接跳转、新窗口打开、前进、后退才有效
- ETag/If-Not-Match
- Last-Modified/If-Modified-Since
- 状态码有304
ETag/If-Not-Match
- ETag由服务器生成,不同的服务器可能生成的值不同
- 精确识别资源有无修改
- 计算ETag需要消耗性能
- 优先级比Last-Modified高
Last-Modified/If-Modified-Since
- 只要资源修改,无论内容是否变化,都会返回给客户端
- 优先级低于ETag/If-Not-Match
状态码有304
当客户端请求头中的If-None-Match或If-Modified-Since与服务器的ETag或Last-Modified相同,服务器返回304(Not Modified)
Vary
对缓存进行控制,它决定了对于未来的一个请求头,应该使用一个缓存作为响应还是向源服务器请求一个新的响应。
幂等性
指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。
GET、HEAD、PUT、DELETE,OPTIONS方法是幂等的。
POST 不是幂等的。
请求waterfall图解析
- Queued、Queueing 是队头阻塞时间,这里花费了1.25秒,才被浏览器处理
- Stalled 是浏览器分配资源,调度连接花费的时间,这里消耗了2.58毫秒
- Initial connection 与服务器连接时间,这里花费了17.08毫秒
- SSL 是SSL握手时间,这里花费了15.84毫秒
- Request sent 发送数据的时间,这里花费了0.26毫秒
- Waiting(TTFB) 等待服务器响应的时间,TTFB(Time To First Byte)是首字节响应时间,包括服务器处理时间和网络传输时间,这里花费了105.65毫秒
- Content Download 接收数据时间,这里花费了1.95毫秒
HTTPS
- 默认端口号 443
- HTTP over SSL/TLS
SSL/TLS
- SSL 即安全套接层(Secure Sockets Layer),在 七层模型中处于第 5 层(会话层)
- 因发展的原因,1999年改名为TLS(传输层安全,Transport Layer Security
- 目前应用的是TLS 1.2版本
- TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等技术
- TLS 的密码套件命名规范是“密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法”
浏览器和服务器在使用 TLS 建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合被称为“密码套件”(cipher suite,也叫加密套件) TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256是一个密码套件,ECDHE是密钥交换算法,RSA是身份验证,AES是对称加密算法,128是强度,GCM是分组模式,SHA256是签名hash算法
- 记录协议(Record Protocol)规定了 TLS 收发数据的基本单位:记录(record)
- 握手协议(Handshake Protocol)是 TLS 里最复杂的子协议,要比 TCP 的 SYN/ACK 复杂的多,浏览器和服务器会在握手过程中协商 TLS 版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统
OpenSSL
- 著名的开源密码学程序库和工具包,几乎支持所有公开的加密算法和协议
- 是 SSL/TLS 的具体实现,Web 服务器 Apache、Nginx等底层都是基于它来实现TLS的
- 开源的
对称加密算法
- 是指加密和解密时使用的密钥是同一个
- 常用的是 AES
- AES 的意思是“高级加密标准”(Advanced Encryption Standard),密钥长度可以是 128、192 或 256,安全强度高,性能好,应用最广泛的对称加密算法
- 最新的加密分组模式被称为 AEAD(Authenticated Encryption with Associated Data),在加密的同时增加了认证的功能,常用的是 GCM、CCM 和 Poly1305
- 只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换
非对称加密算法
- 也叫公钥加密算法
- 一个叫“公钥”(public key),可以公开给任何人使用,公钥加密后只能用私钥解密
- 一个叫“私钥”(private key)。须严格保密,私钥加密只能用公钥解密
- “公钥” 和 “私钥” 是不同的,“不对称”
- TLS中有DH、DSA、RSA、ECC
- RSA的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料
- ECC(Elliptic Curve Cryptography)是基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名
- 解决了密钥交换问题但速度慢
混合加密
- 通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题
- 然后用随机数产生对称算法使用的“会话密钥”(session key),再用公钥加密
- 最后对方用私钥解密,取出会话密钥。这样,双方就实现了对称密钥的安全交换,后续就不再使用非对称加密,全都使用对称加密。
SSL 握手过程
- 客户端先给服务端发送一个消息,消息内容包括:客户端支持的加密方式,支持的压缩方法,SSL的版本号,客户端生成的随机数,文本内容“Hello”等;
- 服务端接收到消息后,也回发一个Hello,并携带从客户端支持的加密方式中选择的加密方式,服务端生成的随机数,服务端的SSL版本号等信息;
- 随后服务器给客户端发送一个Certificate报文,报文中包含服务端的公钥证书;
- 紧接着服务器给客户端发送Server Hello Done, 表示最初的协商握手过程结束;
- 客户端接收到服务端发送的握手结束的消息后,以Client Key Exchange作为回应,此报文中包含通信加密过程中使用的一种被称为Pre-master secret的随机密码串,并使用第三步接收到的公钥证书进行了加密;
- 接着客户端发送Change Cipher Spec报文,告知服务端之后的所有数据将使用第五步中生成的master secret进行加密
- 随后客户端发送Finish报文,此报文中包含连接至今所有报文的整体校验值,用于完整性验证;
- 服务端接收到客户端发送的Change Cliper Spec报文后,同样以Change Cliper Spec报文作为回应;
- 接着服务端发送Finish报文给客户端,表示服务端已正确解析客户端发送的整体校验值,至此,SSL握手的过程结束。
- 随后开始使用HTTP协议传输使用master secret加密过的数据。
HTTP2
头部压缩
- 开发了专门的“HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。
二进制
- 请求头和请求体都是二进制
多工
- 同时发送多个请求,服务器同时回应多个请求且不是安顺序的,解决“队头阻塞”问题
服务器推送
- 主动向客户端推送资源
数据流
- 数据包不是按顺序发送的,每个数据包都有一个唯一的ID,用于标记属于哪个数据流。
- 客户端的数据流ID是奇数,服务端是偶数
- 客户端和服务端都可以发送一个信号帧,取消当前的数据流,并保持TCP连接仍打开着。
- 客户端可以指定数据流的优先级,服务端根据优先级进行回应
HTTP3
QUIC
- 由Google再2013年推出的,全称是Quick UDP Internet Connections。
- HTTP/3 就是基于 QUIC 协议的 HTTP (HTTP over QUIC)
- 属于分层结构中的传输层
特点
- 基于UDP的传输层协议
- 可靠性 在UDP的基础上做了改造,提供了数据包重传、拥塞控制、调整传输节奏等类似TCP的特性以及可靠性
- 实现了无序、并发字节流 单个数据流的传输是按序的,多个数据流是无序的
- 快速握手 提供0-RTT和1-RTT的连接建立
RTT(Round-Trip Time) 数据从网络的一端传输到另一端所需的时间
- 连接迁移 拥有特定的UUID来标记每一次连接,虽然网络环境发生改变,但UUID不变,就可以继续传输数据,不需要断开连接
- 使用TLS1.3传输安全协议,它的握手时间更短,降低协议的延迟
欢迎关注微信公众号:闹闹前端