HTTP

HTTP的特点

HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态

  1. 无连接

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

  2. 灵活

    HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记

  3. 无状态

    无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

  4. 简单快速

    客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

  5. 支持客户/服务器模式

请求报文与响应报文

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文

请求报文

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成

img

  • 请求行 :

    请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。常见的请求方法有GET、POST、PUT、DELETE等

  • 请求头 :

    请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

    img

  • 请求数据 :

    请求体不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length

响应报文

一个HTTP响应报文由响应行、响应头部、空行和响应体4个部分组成

img

  • 响应行

    响应行由协议版本、状态码、状态码描述三个字段组成,常见的状态码有:

    • 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是最常用的两种请求方式,它们的区别主要有

  1. 提交

    GET:提交会将数据附在URL之后

    POST:提交将数据放在请求体中

  2. 传输数据的大小

    首先声明,HTTP既没有对传输数据的大小进行限制也没有对URL长度进行限制

    GET:传输数据受到URL长度的限制

    POST:理论上数据不受限。但实际上各个web服务器会对其进行限制

  3. 安全性

    GET:请求的数据会被浏览器缓存起来,请求数据明文显示

    POST:请求数据不会被缓存

  4. 使用范围

    GET:一般用于获取/查询资源信息

    POST:一般用于更新资源信息

HTTP请求流程

浏览器与服务器之间将完成下列 7 个步骤:

  1. 建立 TCP 连接:在HTTP工作开始之前,浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的。

  2. 浏览器向服务器发送请求行:一旦建立了TCP连接,浏览器就会向服务器发送请求命令。例如:GET /sample/hello.html HTTP/1.1。

  3. 浏览器发送请求头:浏览器发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

  4. 服务器响应:客户机向服务器发出请求后,服务器会向客户机发送响应, HTTP/1.1 200 OK ,响应的第一部分是协议的版本号和状态码。

  5. 服务器发送响应头:正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档。

  6. 服务器向浏览器发送数据:服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 应答头信息所描述的格式发送用户所请求的实际数据

  7. 发送完毕:TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP版本

HTTP1.1特性

  1. 长连接

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

  2. 管道化

    基于长连接

    tcp没有断开,用的同一个通道

    请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3
    

    管道化请求

    请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3
    
  3. 缓存处理

    在HTTP1.0里面主要使用header里的if-Modified-Since、Expires来作为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag、if-Match等

  4. 断点传输

    在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率。最后发送方会发送长度为0的组块,表示传输完毕

  5. Host头处理

    在HTTP1.0中认为每台服务器绑定一个唯一的的IP地址,但随着虚拟技术的发展,一个物理服务器上可能有多个虚拟主机共用一个IP地址,所以在HTTP1.0的请求头上多了一个Host域

HTTP2.0特性

  1. 二进制协议

    HTTP1.1 数据头肯定是文本,数据体可以是文本,也可以是二进制。而 HTTP2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为帧;二进制协议的一个好处是,可以定义额外的帧。HTTP2.0 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多

  2. 多路复用

    在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来

  3. 头部压缩

    由于 HTTP 是无状态的,每一个请求都需要头部信息标识这次请求相关信息,所以会造成传输很多重复的信息,当请求数量增大的时候,消耗的资源就会慢慢积累上去。所以 HTTP 2 可以维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源,详见 HTTP/2 头部压缩技术介绍

  4. 服务器推送

    HTTP/2 允许服务器未经请求,主动向客户端发送资源。常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。

HTTPS

HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。并使用443端口

HTTPS的请求过程

img

即:

  • 客户端发送 HTTPS 请求,报文包含支持的加密协议和版本
  • 服务器从中选出合适的协议,并返回数字证书,包含了网站地址,加密公钥,以及证书的颁发机构
  • 客户端验证证书合法性,如果证书受信任,或接受了不受信任的证书,那么生成随机数作为对称密钥,并通过证书的公钥加密,发送到服务器
  • 服务器使用私钥解密,获得对称密钥,那么就可以使用对称密钥加密数据了
  • 客户端解密数据,即开始通信

对称加密与非对称加密

对称加密:加密和解密使用相同的算法

非对称加密:加密和解密使用不同的算法

中间人攻击

  1. 某网站拥有用于非对称加密的公钥A、私钥A’
  2. 浏览器向网站发起请求,服务器将公钥A发送给服务器
  3. 中间人劫持到公钥A,保存下来,将A替换为自己伪造的公钥B(它同时也具有对应的私钥B’)发送给浏览器,
  4. 浏览器随机生成用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器
  5. 中间人劫持后用私钥B’解密得到密钥X,然后用公钥A加密后传给服务器
  6. 服务器拿到后用私钥A’解密得到密钥X

中间人攻击的根本原因:浏览器无法确认自己收到的公钥是不是网站自己的

解决方案:数字证书+数字签名

数字证书:是由信任机构颁发给网站的如同身份证一般用于记录网站基本信息(最重要的网站公钥)的证书

数字签名:用于去验证证书的有效性(证书也可能被伪造),信任机构使用私钥对明文信息加密后内容

img

与HTTP的比较

  • 安全

    HTTP:明文传输,没有加密

    HTTPS:由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,所有内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方地证书进行了非对称加密

  • 端口

    HTTP:80端口

    HTTPS:443端口

  • 层次不同

    HTTP:运行在TCP之上

    HTTPS:运行在SSL/TLS上的HTTP协议

参考:

深入理解http协议的特点

HTTP请求报文和HTTP响应报文

一次完整的HTTP请求过程

一次完整的HTTP请求过程

HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

彻底搞懂HTTPS的加密机制

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值