HTTP 协议最全解析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45505313/article/details/102219831

1. HTTP 协议简述

HTTP (Hyper Text Transfer Protocol:超文本传输协议)基于TCP/IP通信协议传递数据,是属于应用层面向对象的协议,通常用于服务器与本地浏览器之间的数据交互。

HTTP 协议工作于 Client-Server 架构上,浏览器作为 HTTP 客户端通过 URL向 HTTP 服务端即WEB服务器发起请求,Web服务器根据接收到的请求后向客户端发送响应数据。在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址

  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接

  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器

  4. 服务器对浏览器请求作出响应,并把响应的 html 文本发送给浏览器

  5. 释放 TCP连接

  6. 浏览器将该 html 文本解析渲染并显示内容

在这里插入图片描述
经过不断发展,HTTP 协议不同版本的特点各不相同,其早期的版本 HTTP 1.0 特性如下:

  1. 多模式支持
    支持B/S(Browser/Server)及 C/S(Client/Server)模式

  2. 简单快速
    客户端向服务器请求服务时,只需指明请求方法和路径。常用的请求方法有GET、HEAD、POST,不同方法规定了客户端与服务器联系的不同类型。由于HTTP协议简单,故HTTP服务器的程序规模不大,因而通信速度很快

  3. 灵活
    HTTP 可传输任意类型的数据对象,传输的数据类型由 Content-Type 标记

  4. 无连接
    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间

  5. 无状态
    HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。这意味着如果后续处理需要前面的信息,则它必须重传,这样会导致每次连接传送的数据量增大。为了解决这个问题, Web程序引入了Cookie 机制来维护状态。另一方面,在服务器不需要先前信息时它的应答就较快

2. HTTP 请求

2.1 HTTP 请求消息的结构

客户端发送一个HTTP请求到服务器的请求消息为以下格式:

  • 请求行(request line)
    请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
    Method Request-URI HTTP-Version CRLF(回车/换行符)

  • 请求头部(header)
    请求头部为紧挨着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

  • 空行
    请求头部后面的空行是必须的,用以分割请求头和消息体,即使第四部分的请求数据为空,也必须有空行

  • 请求数据
    请求数据就是消息体,可以添加任意的其他数据。当使用的是"GET" 方法的时候, 消息体为空

在这里插入图片描述

以一个POST 请求为例子,POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单

POST /reg.jsp HTTP/1.1 // 请求行
Accept:image/gif,image/x-xbit,...  // 自此之后为请求头字段
...
HOST:www.guet.edu.cn 
Content-Length:22 
Connection:Keep-Alive 
Cache-Control:no-cache 
 //空行,表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234  //此行及以下为提交的数据

2.2 HTTP 请求的方法

HTTP 请求可以使用多种请求方法,不同的方法作用各有不同:

  • HTTP1.0定义了三种请求方法: GET、POST 、HEAD
  • HTTP1.1新增了五种请求方法:OPTIONS、 PUT、DELETE,、TRACE 、CONNECT
请求方法 方法的功能
GET 请求获取Request-URI所标识的资源
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求消息体中。POST请求可能会导致新的资源的建立或已有资源的修改
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的资源
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 允许客户端查看服务器的性能,并获取服务器支持的 HTTP 请求方法
TRACE 回显服务器收到的请求,主要用于测试或诊断

2.3 GET和POST请求的区别

  1. 地址栏
    GET 提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,POST方法是把提交的数据放在HTTP包的消息体中。简而言之,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

  2. 传输数据大小
    HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制,但实际上GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据理论上没有限制

  3. 数据获取方式
    GET方式需要在服务器端使用 Request.QueryString 来取得变量的值,而POST方式通过Request.Form来获取变量的值

  4. 安全性
    GET方式提交数据,会带来安全问题。典型如登录页面,如果通过GET方式提交数据则用户名和密码将出现在URL上,这就增加了密码泄露的风险

3. HTTP 响应

3.1 HTTP 响应消息的结构

服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息,其格式如下:

  • 状态行
    状态行由 HTTP协议版本号, 状态码, 状态消息 三部分组成。
    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

  • 消息报头
    消息报头用来说明客户端要使用的一些附加信息,以下示例中第二行和第三行为消息报头:
    Date:生成响应的日期和时间
    Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

  • 空行
    消息报头后面的空行是必须的,用以分割消息报头和响应正文

  • 响应正文
    响应正文为服务器返回给客户端的文本信息,以下示例中空行后面的 html 部分为响应正文

在这里插入图片描述

一个 HTTP 响应消息的示例:

HTTP/1.1 200 OK  // 状态行
Date: Fri, 22 May 2009 06:07:21 GMT // 响应头部
Content-Type: text/html; charset=UTF-8
// 空行,分割响应头和响应消息体
<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>

3.2 HTTP 响应状态码

状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息–表示请求已接收,继续处理

    状态码 含义
    100(继续) 请求者需继续请求,服务器返回此代码表示已收到请求的第一部分,正在等待其余部分
    101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换
  • 2xx:成功–表示请求已被成功接收、理解、接受

    状态码 含义
    200 (成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页
    201 (已创建) 请求成功并且服务器创建了新的资源。
    202 (已接受) 服务器已接受请求,但尚未处理。
    203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源
    204 (无内容) 服务器成功处理了请求,但没有返回任何内容
    205 (重置内容) 服务器成功处理了请求,但没有返回任何内容
    206 (部分内容) 服务器成功处理了部分 GET 请求
  • 3xx:重定向–要完成请求必须进行更进一步的操作

    状态码 含义
    300 (多种选择) 针对请求,服务器可执行多种操作。请求者(user agent)需选择一项操作
    301 (永久移动) 请求的网页已永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置
    302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原位置来进行以后的请求
    303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
    304 (未修改) 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
    305 (使用代理) 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
    307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
  • 4xx:客户端错误–请求有语法错误或请求无法实现

    状态码 含义
    400 (错误请求) 服务器不理解请求的语法
    401 (未授权) 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应
    403 (禁止) 服务器拒绝请求
    404 (未找到) 服务器找不到请求的网页
    405 (方法禁用) 禁用请求中指定的方法
    406 (不接受) 无法使用请求的内容特性响应请求的网页
    407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
    408 (请求超时) 服务器等候请求时发生超时
    409 (冲突) 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息
    410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应
    411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求
    412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件
    413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力
    414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理
    415 (不支持的媒体类型) 请求的格式不受请求页面的支持
    416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码
    417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求
  • 5xx:服务器端错误–服务器未能实现合法的请求

    状态码 含义
    500 (服务器内部错误) 服务器遇到错误,无法完成请求
    501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时会返回此代码
    502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应
    503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态
    504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求
    505 (HTTP 版本不支持) 服务器不支持请求中所用的 HTTP 协议版本

4. HTTP 版本更迭

4.1 HTTPS 与 HTTP

HTTPS 与 HTTP 的区别主要有以下几点:

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费

  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的

  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443

  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题

在这里插入图片描述

4.2 HTTP1.1 的主要特性

HTTP1.1 是当前使用最为广泛的 HTTP协议,其与 HTTP1.0 主要区别如下:

  1. 缓存处理
    在HTTP1.0中主要使用header里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略

  2. 带宽优化及网络连接的使用
    HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象传输过来了,并且不支持断点续传功能。HTTP1.1 则在请求头引入 range 头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便充分利用带宽和连接

  3. 错误通知的管理
    在HTTP1.1 中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除

  4. Host头处理
    在HTTP1.0 中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1 的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)

  5. 长连接
    HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点

4.3 SPDY:HTTP1.X 的优化

SPDY的方案优化了 HTTP1.X 的请求延迟,解决了HTTP1.X 的安全性,具体结构及优化如下:

在这里插入图片描述

  1. 降低延迟
    针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率

  2. 请求优先级(request prioritization)
    多路复用带来的新问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容

  3. header压缩
    HTTP1.x的header很多时候都是重复多余的,选择合适的压缩算法可以减小包的大小和数量

  4. 加密传输
    基于HTTPS的加密协议传输,大大提高了传输数据的可靠性

  5. 服务端推送(server push)
    采用了SPDY的网页,假如网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求

4.4 HTTP2.0 的特性

主要基于SPDY协议,HTTP2.0 可说是SPDY的升级版,但是HTTP2.0 跟 SPDY 仍有不同之处。

HTTP2.0和SPDY的区别

  • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  • HTTP2.0 消息头的压缩算法采用 HPACK ,而不是 SPDY 采用的 DEFLATE

HTTP2.0和HTTP1.X相比的新特性

  • 新的二进制格式(Binary Format)
    HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析采用二进制格式,实现方便且健壮

  • 多路复用(MultiPlexing)
    即连接共享,每一个request 都是连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面

  • header压缩
    HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小

  • 服务端推送(server push)
    同SPDY一样,HTTP2.0也具有server push功能

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/102219831
今日推荐