主要参考文档:《图解HTTP》
HTTP简介
什么是HTTP?
HTTP:(HyperText Transfer Protocol),超文本传输协议,是一个基于请求和响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
HTTP发展历史
版本 | 产生时间 | 内容 | 发展现状 |
---|---|---|---|
HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 |
HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、OPTIONS、DELETE命令 | 正式作为标准 |
HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 |
HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
- 持久连接:HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。但如果访问的一个HTML页面里又包含其他的资源,每次的请求都会造成无谓的开销。持久连接就是为了解决上述TCP连接问题。持久连接的特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。在HTTP1.1中,所有的连接默认都是持久连接,但在HTTP1.0内并未标准化。
- 多路复用:通过单一的HTTP/2连接请求发送多重的请求-响应消息,多个请求stream共享一个TCP连接,实现多留并行而不是以来建立多个TCP连接。
与HTTP关系密切的协议:IP、TCP及DNS
- 负责传输的IP协议:IP(Internet Protocol)网际协议位于网络层,IP协议的作用是把各种数据传送给对方。
- 确保可靠性的TCP协议:TCP位于传输层,提供可靠的字节流服务。所谓字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。
- 负责域名解析的DNS服务:DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。
简单的HTTP协议
HTTP协议用于客户端和服务器端之间的通信
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。HTTP协议规定,请求从客户端出发,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有收到请求之前不会发送响应。
用于HTTP协议交互的信息被称为HTTP报文。HTTP报文大致可分为报文首部和报文主体两块。通常,并不一定要有报文主体。
请求报文:由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的:
响应报文:由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
HTTP特点
- 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
- 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
- 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
- 简单快速、灵活
- 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
告知服务器意图的HTTP方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
- GET:获取资源,用来访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。
- POST:用来传输实体的主体。
- HEAD:用来获得报文首部,不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。
- PUT:用来传输文件,要求在请问报文的主体中包含文件内容,然后保存到请求URI指定的位置。
- DELETE:用来删除文件,按请求的URI删除指定的资源。
- OPTIONS:用来查询针对请求URI指定的资源支持的方法。只有1.1支持。
- TRACE:用来让Web服务器端将之前的请求通信换回给客户端。只有1.1支持。
- CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。只有1.1支持。
- PATCH: 是对PUT方法的补充,用来对已知资源进行局部更新。
返回结果的HTTP状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器端错误状态码) | 服务器处理请求错误 |
常用的状态码:
- 200:OK,表示从客户端发来的请求在服务器端被正常处理了。
- 204:No Content,表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。
- 206:Partial Content,表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
- 301:Moved Permanently,表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
- 307:Temporary Redirect,临时重定向
- 400:Bad Request,表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
- 401:Unauthorized,表示发送的请求需要有通过HTTP认证的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。
- 403:Forbidden,表明对请求资源的访问被服务器拒绝了。
- 404:Not Found,表明服务器上无法找到请求的资源。
- 500:Internal Server Error,表明服务器端在执行请求时发生了错误。
- 503:Service Unavailable,表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
HTTP+加密+认证+完整性保护 = HTTPS
HTTPS是身披SSL外壳的HTTP
HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
HTTPS使用混合加密机制
HTTPS采用共享密钥加密(加密解密使用同一个密钥,密钥在发送过程中可能会被截取,不安全)和公开密钥加密(使用私有密钥和共有密钥,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。安全但效率低)两者并用的混合加密机制。
- 使用公开密钥加密方式安全地交换在稍后的共享密钥加密中要使用的密钥。
- 确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信。
遗憾的是,公开密钥加密方法还是存在一些问题的。那就是无法证明公开密钥本身就是货真价实的公开密钥。为了解决这个问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。
HTTPS特点
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改