说一说 HTTP 和 HTTPS
是什么?有什么用?怎么用?
为什么引入 HTTPS ?
HTTP 中文名叫超文本传输协议,它是互联网上应用最广泛的一种传输协议。
设计 HTTP 最初的目的就是为了提供一种接收和发送 HTML 页面的方法,当然它也支持图片、文本这些数据的传输。
浏览器通过 TCP (三次握手)与服务器建立连接。
但是 HTTP 协议是以明文发送,隐私数据可能被窃取,造成不良影响
HTTPS 是建立在 SSL 之上,安全性由 SSL 保证。采用 SSL 后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护这些功能。
实现手段:
- 混合加密
(非对称加密)交换密钥 + (对称加密)数据通信
密文发送方使用公钥加密处理“对称密钥”,对方用私钥拿到“对称密钥”。
这种方法解决了数据加密,但在网络传输过程中,数据有可能被篡改,并且黑客可以伪造身份发部公钥。因此加密还需要加上完整跟身份验证的特性,来实现真正的安全。
- 摘要算法
实现完整性的手段是摘要算法,也就是常说的散列函数、哈希函数
- 数字签名
数字签名能确定消息确实是从发送方签名并发出来的,因为别人假冒不了发送方的签名。
原理:私钥加密签名,公钥加密签名再和原文对比
CA 验证机构:保证公钥的安全性
从输入 URL 到呈现页面的过程
- 应用层 DNS 解析
计算机从 DNS 寻找和域名匹配的 IP 地址。当局部 DNS 服务器无法查询时,需要通过递归(自己去查)或迭代(客户端去查)解析获取 IP 地址。
优化:DNS 缓存和 DNS 负载均衡
- 应用层生成 HTTP 请求报文
由三部分组成(请求行 + 请求头 + 请求体),请求头后的空行表示请求头的结束
POST /api/blog/list HTTP/1.1
Accept:text/plain
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded;charset:UTF-8
Host:127.0.0.1:8000
title=blogtitle&content=blogcontent
- 传输层建立 TCP 连接
将 HTTP 请求分为多个报文段(segment)并对每个报文进行封装。然后使用本地一个大于 1024 的随机 TCP 端口建立到目标服务器 80(HTTPS 是443)的连接,TCP 源端口和目的端口被加入到报文段中。因为 TCP 是可靠的协议,所以还会加入序列号、确认号、头长度等参数共 20 字节。
- 三次握手(建立连接)
第一次握手:客户端发送 SYN(请求同步) 包到服务器,并进入 SYN_SENT 状态,等待服务器确认;
第二次握手:服务器收到 SYN 包,必须确认客户的 SYN(这里是ACK),同时自己也发送一个 SYN(syn=y)包,此时服务器进入 SYN_RECV 状态
第三次握手:客户端收到服务器的 SYN + ACK 包,向服务器发送确认包 ACK。发送完毕后客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态。
两次握手不行吗?如果两次握手,只能保证客户端到服务端的通信是有效的。
构建 TCP 请求会增加大量网络时延,常用优化方法有 ①资源打包,合并请求 ②使用缓存减少网络传输 ③使用 keep-alive 建立持久连接 ④使用多个域名增加浏览器资源并发加载数,或使用 HTTP2 的管道化连接的多路复用技术
- 四次挥手(断开连接)
第一次挥手:客户端向服务器发送 FIN 报文,进入 FIN-WAIT-1 状态,并停止发送数据,主动关闭 TCP 连接,等待服务器确认;
第二次挥手:服务器收到连接释放报文 FIN 后若校验无误则立即发出确认报文 ACK,服务器进入 CLOSE-WAIT 状态。此时 TCP 处于半关闭状态,客户端到服务器的连接释放,并在收到服务器的确认后进入 FIN-WAIT-2 状态;
第三次挥手:当服务器数据传输完毕后,接着发出 FIN 报文,进入 LAST-ACK 状态,等待客户端的最终确认;
第四次挥手:客户端发送 ACK 报文,进入 TIME-WAIT 状态。经过时间等待计时器设置的事件 2MSL 后,客户端进入 CLOSE 状态,TCP 被释放。
MSL 是 TCP 报文的最大生存周期,它是任何报文段被丢弃前在网络内的最长时间。
看书补充…
- 网络层使用 IP 协议选择线路
处理来自传输层的数据段 segment,在数据段 segment 中装入数据包 packet,填充包头,添加源和目的 IP 地址,发送数据。在数据传输的过程中,IP 协议负责选择传送的路线,称为路由功能
- 数据链路层实现网络相邻节点间可靠的数据通信
将数据包packet封装成帧(Frame),包括帧头和帧尾。帧尾是添加被称做CRC的循环冗余校验部分。帧头主要是添加数据链路层的地址,即数据链路层的源地址和目的地址,即网络相邻结点间的源MAC地址和目的MAC地址
- 物理层传输数据
数据链路层的帧(Frame)转换成二进制形式的比特(Bit)流,从网卡发送出去,再把比特转换成电子、光学或微波信号在网络中传输
- 服务器处理反向传输
服务器的物理层接收到这个比特流,把比特流转换成帧格式,上传到数据链路层。
数据链路层发现数据帧中的目的MAC地址与本网卡的MAC地址相同,服务器拆除数据链路层的封装后,把数据包上传到网络层。
网络层比较数据包中的目的IP地址,发现与本机的IP地址相同,服务器拆除网络层的封装后,把数据分段上传到传输层。传输层对数据分段进行确认、排序、重组,确保数据传输的可靠性。
数据最后被传到服务器的应用层
- 服务器返回 HTTP 响应
响应报文也由三部分组成:状态码、响应报头、响应报文
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>http</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
- 浏览器渲染
- 解析 HTML,生成 DOM 树
- 解析 CSS,生成 CSSOM 树
- 将 DOM 树和 CSSOM 树结合,生成渲染树 Render Tree
- 根据渲染树进行重排,得到节点的几何位置
- 根据渲染树和得到的几何信息进行重绘,得到节点的绝对像素
说说 UDP 和 TCP
UDP 是一个简单的面向数据报的通信协议。对应用层下来的报文加上首部后就交给网络层
UDP 报头包括 4 个字段,每个字段占 2 字节,开销小
特点:
- 如果包的到达顺序出现乱序,UDP 没有纠错功能
- 丢包不重发
- 来包就发,无法通过流量控制等避免网络拥堵
TCP 是一种可靠的面向字节流的通信协议。发送方从应用层下来的数据会放如缓冲区,等到可以发送的时候就发送,并且可以根据当前网络拥堵状态来确定每个报文段的大小。
TCP 首都有 20 个字节,开销大。
特点:
- 充分实现数据传输时各种控制功能,包括包的顺序控制,丢包重发,应对网络拥堵。
- 只有确认通信对端存在时才会发送数据,可以控制流量的浪费
区别:
- TCP 是面向连接的协议,建立连接 3 次握手,断开连接 4 次握手;UDP 是面向无连接的协议,发送端只负责将数据发送到网络,接收端从消息队列读取
- TCP 提供可靠服务(传输过程采用流量控制、编号与确认、计时器等手段确保数据无差错,不丢失);UDP 不保证数据的准确性
- TCP 面向字节流,将应用层报文看成一串无结构的字节流,分解为多个 TCP 报文段传输后,在目的站重新装配。UDP 协议面向报文,不拆分应用层报文,只保留报文边界,一次发送一个报文,接收方去除报文首部后,原封不动将报文交给上层应用
- TCP 只能点对点全双工通信。UDP 支持一对一、一对多、多对一和多对多的交互通信
说说 OSI 七层模型
应用层:定义了应用程序之间的交互规则,通过不同应用层协议为不同网络应用提供服务。例如域名系统 DNS,支持万维网应用的 HTTP 协议,电子邮件系统采用的 SMTP 协议。
表示层:数据压缩,数据加密以及数据描述,使应用程序不必担心在各台计算机中表示和存储的内部格式差异。
会话层:负责建立、管理和终止表示层实体之间的通信会话。
传输层:为两台主机进程之间的通信提供服务,主要通信协议是 TCP 和 UDP。
网络层:选择合适的网间路由和交换节点,确保数据按时成功传送。发送时,网络层把传输层产生的报文或用户数据报封装成分组和包,向下传输到数据链路层。由于使用 IP 协议,该层又称 IP 层
数据链路层:将网络层交下来的 IP 数据封装成帧传输,每一帧的数据可分成报头 head 和数据 data 两部分。
物理层:确定与传输媒体的接口的一些特性。
说说 TCP/IP 协议
应用层:将 OSI 参考模型中的应用层、表示层和会话层功能合并到一个应用层实现。
传输层:对应 OSI 参考模型中的传输层,定义了两个协议 TCP 和 UDP。
网络层:通过选择合适的路由将数据传递到目标主机。发送数据时会把传输层产生的报文或用户数据封装成分组和包进行传送。
数据链路层:在两个相邻节点之间传输数据时,将网络层交下来的 IP 数据报封装成帧。
物理层:确保数据可以在各种物理媒介上传输。