文章目录
HTTP的特点
HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态
-
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-
灵活
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
-
无状态
无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
-
简单快速
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
-
支持客户/服务器模式
请求报文与响应报文
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文
请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
-
请求行 :
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。常见的请求方法有GET、POST、PUT、DELETE等
-
请求头 :
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
-
请求数据 :
请求体不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length
响应报文
一个HTTP响应报文由响应行、响应头部、空行和响应体4个部分组成
-
响应行
响应行由协议版本、状态码、状态码描述三个字段组成,常见的状态码有:
- 1XX:指示信息—表示请求已接收,继续处理
- 2XX:成功—表示请求已经成功被接收,理解、处理
- 3XX:重定向—要完成请求必须更进一步操作
- 4XX:客户端错误—请求有语法错误或无法实现
- 5XX:服务器端错误—服务器出现故障
-
响应头
-
响应体
常用状态码
-
100 Continue:表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。
-
200 OK
-
204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
-
206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。
-
301 Moved Permanently :永久性重定向
-
302 Found :临时性重定向
-
303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
-
304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。
-
307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
-
400 Bad Request :请求报文中存在语法错误。
-
401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
-
403 Forbidden :请求被拒绝。
-
404 Not Found
-
500 Internal Server Error :服务器正在执行请求时发生错误。
-
503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
GET和POST的区别
GET和POST是最常用的两种请求方式,它们的区别主要有
-
提交
GET:提交会将数据附在URL之后
POST:提交将数据放在请求体中
-
传输数据的大小
首先声明,HTTP既没有对传输数据的大小进行限制也没有对URL长度进行限制
GET:传输数据受到URL长度的限制
POST:理论上数据不受限。但实际上各个web服务器会对其进行限制
-
安全性
GET:请求的数据会被浏览器缓存起来,请求数据明文显示
POST:请求数据不会被缓存
-
使用范围
GET:一般用于获取/查询资源信息
POST:一般用于更新资源信息
HTTP请求流程
浏览器与服务器之间将完成下列 7 个步骤:
-
建立 TCP 连接:在HTTP工作开始之前,浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的。
-
浏览器向服务器发送请求行:一旦建立了TCP连接,浏览器就会向服务器发送请求命令。例如:GET /sample/hello.html HTTP/1.1。
-
浏览器发送请求头:浏览器发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
-
服务器响应:客户机向服务器发出请求后,服务器会向客户机发送响应, HTTP/1.1 200 OK ,响应的第一部分是协议的版本号和状态码。
-
服务器发送响应头:正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档。
-
服务器向浏览器发送数据:服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 应答头信息所描述的格式发送用户所请求的实际数据。
-
发送完毕:TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP版本
HTTP1.1特性
-
长连接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
-
管道化
基于长连接
tcp没有断开,用的同一个通道
请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3
管道化请求
请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3
-
缓存处理
在HTTP1.0里面主要使用header里的if-Modified-Since、Expires来作为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag、if-Match等
-
断点传输
在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率。最后发送方会发送长度为0的组块,表示传输完毕
-
Host头处理
在HTTP1.0中认为每台服务器绑定一个唯一的的IP地址,但随着虚拟技术的发展,一个物理服务器上可能有多个虚拟主机共用一个IP地址,所以在HTTP1.0的请求头上多了一个Host域
HTTP2.0特性
-
二进制协议
HTTP1.1 数据头肯定是文本,数据体可以是文本,也可以是二进制。而 HTTP2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧;二进制协议的一个好处是,可以定义额外的帧。HTTP2.0 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多
-
多路复用
在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来
-
头部压缩
由于 HTTP 是无状态的,每一个请求都需要头部信息标识这次请求相关信息,所以会造成传输很多重复的信息,当请求数量增大的时候,消耗的资源就会慢慢积累上去。所以 HTTP 2 可以维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源,详见 HTTP/2 头部压缩技术介绍
-
服务器推送
HTTP/2 允许服务器未经请求,主动向客户端发送资源。常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。
HTTPS
HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。并使用443端口
HTTPS的请求过程
即:
- 客户端发送 HTTPS 请求,报文包含支持的加密协议和版本
- 服务器从中选出合适的协议,并返回数字证书,包含了网站地址,加密公钥,以及证书的颁发机构
- 客户端验证证书合法性,如果证书受信任,或接受了不受信任的证书,那么生成随机数作为对称密钥,并通过证书的公钥加密,发送到服务器
- 服务器使用私钥解密,获得对称密钥,那么就可以使用对称密钥加密数据了
- 客户端解密数据,即开始通信
对称加密与非对称加密
对称加密:加密和解密使用相同的算法
非对称加密:加密和解密使用不同的算法
中间人攻击
- 某网站拥有用于非对称加密的公钥A、私钥A’
- 浏览器向网站发起请求,服务器将公钥A发送给服务器
- 中间人劫持到公钥A,保存下来,将A替换为自己伪造的公钥B(它同时也具有对应的私钥B’)发送给浏览器,
- 浏览器随机生成用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器
- 中间人劫持后用私钥B’解密得到密钥X,然后用公钥A加密后传给服务器
- 服务器拿到后用私钥A’解密得到密钥X
中间人攻击的根本原因:浏览器无法确认自己收到的公钥是不是网站自己的
解决方案:数字证书+数字签名
数字证书:是由信任机构颁发给网站的如同身份证一般用于记录网站基本信息(最重要的网站公钥)的证书
数字签名:用于去验证证书的有效性(证书也可能被伪造),信任机构使用私钥对明文信息加密后内容
与HTTP的比较
-
安全
HTTP:明文传输,没有加密
HTTPS:由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,所有内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方地证书进行了非对称加密
-
端口
HTTP:80端口
HTTPS:443端口
-
层次不同
HTTP:运行在TCP之上
HTTPS:运行在SSL/TLS上的HTTP协议
参考: