HTTP 含义
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
HTTP 不是一个孤立的协议
HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协议相互交织,构成了一个协议网,而 HTTP 则处于中心地位。
TCP/IP 分层
- 按层级分 | 层级 | 作用 | | :—-: | —- | | 应用层 | 决定了向用户提供了应用服务时通信的活动,HTTP 协议也属于这层 | | 传输层 | 提供了网络连接中的两台计算机之间的数据传输,有两个不同性质的协议,TCP,UDP | | 网络层 | 网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。IP在这层 | | 数据链路层 | 用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。 |
- TCP/IP 通信传输流
步骤
- 首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。
- 为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
- 在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。
- 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。
TCP协议
按层级分,TCP位于传输层,提供可靠的字节流服务
字节流服务:为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。
确保数据能够到达目标:TCP 协议采用了三次握手(three-way handshaking)策略。用 TCP 协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize)和ACK(acknowledgement)。
三次握手图解
TCP粘包、拆包
tcp传输过程中的任何一个节点都可能会将数据包拆分或合并,最终保证的是数据到达终点的顺序是一致的。由于TCP只关心字节数组流,并不知晓上层的数据格式。所以需要应用层来处理数据是否完整的问题,一般在数据协议上会采用一个字段来表示数据的长度,知道了消息的长度,就可以解决粘包的问题。对于拆包问题,当读到的数据长度比数据长度小时,要继续等待数据。
DNS服务
DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。
DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
各种协议与HTTP协议的关系
HTTP报文
报文:用于 HTTP 协议交互的信息被称为 HTTP 报文
请求报文:请求端(客户端)的HTTP 报文叫做请求报文
相应报文:响应端(服务器端)的叫做响应报文
HTTP常用的状态码
类型状态码
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接受处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理的过程中发生了错误 |
状态码 | 原因 |
---|---|
200 | 请求成功 |
204 | 请求处理成功,但返回的相应报文中没有资源 |
301 | 永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI |
302 | 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问 |
304 | 该资源被浏览器缓存了不需要重新请求服务器 |
400 | Bad Request 用于参数验证,少了一个参数或者参数类型错误之类的 |
401 | Unauthorized 权限不足,就是资源存在但是不让你访问 |
403 | Forbidden 资源禁止访问,如果你的IP列为黑名单了,就会发生这种错误 |
404 | 路径错误 |
413 | 请求报文里的 body 太大; |
414 | 请求行里的 URI 太大 |
500 | 服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障 |
502 | Bad Gateway 后端服务挂掉或者压力过大的时候, Nginx接到的请求无法及时传递给后端的服务进行处理 |
HTTPS
HTTP+ 加密 + 认证 + 完整性保护 = HTTPS
HTTPS的安全通信机制
- 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)
- 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的
- 之后服务器发送 Certificate 报文。报文中包含公开密钥证书
- 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束
- SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。
- 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
- 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
- 服务器同样发送 Change Cipher Spec 报文。
- 服务器同样发送 Finished 报文。
- 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
- 应用层协议通信,即发送 HTTP 响应
- 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。
SSL证书
- SSL证书种类
- 域名型(DV)证书、企业型(OV)证书、增强型(EV)证书
- 域名型(DV)证书
- 仅能起到网站机密信息加密的作用,无法向用户证明网站的真实身份。因此,这类证书可以用于个人产品或个人网站进行信息加密
- 企业型(OV)证书
- 它能验证网站的真实性,不仅能起到网站机密信息加密的作用,而且能向用户证明网站的真实身份。(浏览器有绿色的安全锁标志)
- 增强型(EV)证书
- 目前业界最高安全级别的SSL证书,一般情况下,用于银行证券等金融机构。
TCP确定一个连接
TCP用四个信息来唯一确定一条连接:源ip地址、源端口号、目的ip地址、目的端口号。只要其中有一个不同,那么就不是同一条连接。在任意时刻计算机都可以有几条tcp连接在打开状态。
对TCP性能的考虑
首先相对建立tcp连接、发送http请求报文以及响应报文相比,http事务处理的时间相对短很多很多,此时延可不用讨论,除非你的服务器超负载了或正在处理复杂的运算。因此,http事务的时延往往由以下原因组成:
- 首先客户端解析ip地址或者端口号需要时间,如果当前没有访问过相关资源,那么解析还需要查询dns服务器,此操作,造成的时延较多,可能花费数十秒。
- 建立tcp链接会有建立时延,通常2s左右,如果当前的http事务较多,那么会很快叠加上去。
- 传输、处理请求报文需要时间
- 传输、处理请求报文需要时间
- 当然还有其他因素,比如硬件、网络负载,等!
串行处理事务时延
此种机制描述了http事务一个一个接着发起,不能同时下载更多的资源,使得界面上用户看不到东西,体验不够好。串行连接没有很好的利用tcp/ip连接的慢启动机制!
优化方法
并行连接
通过多条TCP连接发起并发的HTTP连接
持久连接
重用TCP连接,以消除连接及关闭时延
管道化连接
通过共享的TCP连接发起并发的HTTP请求
- 并行连接
- 浏览同时发起过个http事务,因为是并行的,所以时延也并行的,这样总时延较小,页面呈现更快,体验较好。但也不是总是这样,因为如果在网络速度很慢的时候,多个连接会去竞争本来不多的带宽,那么就谈不上加快速度了。还有就是并行连接也是需要付出代价的,比如增加系统内训消耗、服务器负载,比如有一个100客户端同时对服务发起100tcp并行连接的话,那么服务器就得负责10000个处理请求,很快的你的服务器就会爆掉。当然了,并行连接确实能带来视觉上的速度提升,因为相比于串行连接慢慢地显示数据而并行一下子能全部显示完信息,视觉上并行连接会给人速度更快的感觉!
- 持久连接
- 持久连接描述的是:如果对同ip、同端口的发起多个http事务连接,那么可以在前一个事务处理完成之后不要关闭tcp连接,以此来减小建立tcp、tcp慢启动所带来的时延
- 管道化连接
- HTTP/1.1允许在持久连接上可选地使用请求管道。这是在keep-alive连接上的进一步性能优化。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向地球另一端的服务器时,第二条和第三条请求也可以开始发送了。在高时延网络条件下,这样做可以降低网络的环回时间,提高性能。
- 如果不是持久连接就不要使用管道连接
- 接收端必须按收到请求报文的顺序返回响应报文,因为HTTP报文中没有序列号标签。所以必须靠按序发送响应报文来达到“数据对应”
- 发送端应该做好数据没有发送完连接就关闭的准备并开始重新发送数据。
- HTTP客户端不应该用管道化的方式发送会产生副作用的请求(比如POST)。
Nginx 处理长连接
- 使用“keepalive_timeout”指令,设置长连接的超时时间,如果在一段时间内连接上没有任何数据收发就主动断开连接,避免空闲连接占用系统资源。
- 使用“keepalive_requests”指令,设置长连接上可发送的最大请求次数。比如设置成 1000,那么当 Nginx 在这个连接上处理了 1000 个请求后,也会主动断开连接。
CDN
它应用了 HTTP 协议里的缓存和代理技术,代替源站响应客户端的请求。
- CDN的好处
- 它可以缓存源站的数据,让浏览器的请求不用“千里迢迢”地到达源站服务器,直接在“半路”就可以获取响应。如果 CDN 的调度算法很优秀,更可以找到离用户最近的节点,大幅度缩短响应时间。
代理
- 匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器;
- 透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端;
- 正向代理:靠近客户端,代表客户端向服务器发送请求;
- 反向代理:靠近服务器端,代表服务器响应客户端的请求;
安全
通常认为如果通信过程具备了四个特性,就可以是认为安全的。四个特性是:机密性,完整性,身份认证和不可否认
短连接与长连接
- 从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;
- 在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 Connection : Keep-Alive。
OSI 网络分层模型
自下而上
- 第一层:物理层,网络的物理形式,例如电缆、光纤、网卡、集线器等等;
- 第二层:数据链路层,它基本相当于 TCP/IP 的链接层;
- 第三层:网络层,相当于 TCP/IP 里的网际层;
- 第四层:传输层,相当于 TCP/IP 里的传输层;
- 第五层:会话层,维护网络中的连接状态,即保持会话和同步;
- 第六层:表示层,把数据转换为合适、可理解的语法和语义;
- 第七层:应用层,面向具体的应用传输数据。
- 第一层:物理层,TCP/IP 里无对应;
- 第二层:数据链路层,对应 TCP/IP 的链接层;
- 第三层:网络层,对应 TCP/IP 的网际层;
- 第四层:传输层,对应 TCP/IP 的传输层;
- 第五、六、七层:统一对应到 TCP/IP 的应用层。
DNS
DNS 的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:
- 根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的 IP 地址;
- 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 apple.com 域名服务器的 IP 地址;
- 权威域名服务器(Authoritative DNS Server):管理自己域名下主机的 IP 地址,比如 apple.com 权威域名服务器可以返回 www.apple.com 的 IP 地址。
通信方式(物理层)
- 单工通信:单向传输
- 半双工通信:双向交替传输
- 全双工通信:双向同时传输