HTTP/1.1

网上关于HTTP/1.1的讨论多是基于RFC2616文档,而IETF已更新了HTTP/1.1并将其分为六个部分,使协议变得更简单易懂,对老版本RFC2616中模糊不清的部分做了解释

  • RFC7230-消息语法与路由
  • RFC7231-语义与路由
  • RFC7232-条件请求
  • RFC7233-范围请求
  • RFC7234-缓存
  • RFC7235-认证

RFC7230-消息语法与路由

客户端/服务器 消息发送

HTTP是一种在传输层或会话层上交换消息的无状态的请求/响应协议,HTTP使用URI来定位资源和资源间的关系,通常请求会包含请求行,请求首部和请求体,下面的例子是在"http://www.example.com/hello.txt"上进行的GET请求

客户端请求:

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com Accept-Language: en, mi

服务器响应:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain Hello World! My payload includes a trailing CRLF.

RFC7231-语义与路由

安全方法

如果请求方法语义上是只读的,那么它被认为是安全的,根据之前定义,GET,HEAD,OPTIONS,TRACE是安全的

幂等方法

如果多个相同的请求方法对服务器的效果与单个请求对服务器的效果相同,则该请求方法是幂等的,根据定义PUT,DELETE与安全方法是幂等的

可缓存方法

当请求方法的响应允许被缓存以供未来复用时,该请求方法是可缓存的。通常,不依赖当前或权威响应的安全方法被认为是可缓存的,本规范定义GET,HEAD,POST为可缓存的,虽然大多数缓存实现只支持GET和HEAD

GET

GET是主要的信息取回机制,客户端可以将GET语义改变为"范围请求",请求被选定representation的一部分

HEAD

HEAD与GET方法几乎一样,但其响应中没有消息体,通常被用于测试连接性,可访问性和最近修改情况

POST

POST通常被用于提交表单,发布消息以及创建资源,添加数据到资源已存在的representation上,当有多个资源在源服务器上被创建时,源服务器应该发送201响应

POST请求的响应只有包含explicit freshness information(4.2.1 of [RFC7234])的时候才被定义为可缓存的,然而POST缓存并没有被广泛实现,当源服务器希望客户端能够缓存POST的结果以供之后的GET使用时,源服务器可能发送包含Content-Location且其值为POST的有效请求URI相同的200响应

HTTPS

RFC2818:HTTP Over TSL

HTTP与HTTPS不同

  • HTTPS需要CA(Certificate Authority,数字证书认证机构) 申请证书,免费的很少
  • HTTP默认80端口;HTTPS默认443端口
  • HTTP使用http标识符;HTTPS使用https标识符
  • HTTP是明文传输;HTTPS是加密传输
  • HTTP响应比HTTPS快,因为HTTPS还需要TSL握手,所以HTTPS更耗费服务器资源

HTTP/1.1与HTTP/2.0

HTTP/1.1默认开启Connection: keep-alive,支持长连接(持久连接)和请求Pipelining,可以在一个TCP连接上发送多个HTTP请求与响应。

  • HTTP/1.x是基于文本解析的,HTTP/2.0是基于二进制解析的
  • HTTP/2.0采用多路复用,很好的解决了浏览器限制同一个域名下的请求数量的问题
  • HTTP/2.0采用Header压缩,HTTP/1.x的header携带大量信息且重复,HTTP/2.0的通信双方各执一份header fields缓存,减少了传输大小与重复header的传输
  • HTTP/2.0服务端推送减少了请求次数,减少请求次数

附录

面试问答

GET和POST有什么区别

答:

  • GET参数通过URL传递,POST放在Request body中
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
  • GET是安全的且是幂等的,POST则不是
  • GET产生的URL地址可以被Bookmark,而POST不可以
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置
  • GET请求只能进行url编码,而POST支持多种编码方式

HTTP/1.x与HTTP/2.0区别

答:

  • HTTP/2.0基于二进制解析,而HTTP/1.x仅支持文本解析
  • HTTP/2.0支持多路复用
  • HTTP/2.0支持服务端推送
  • HTTP/2.0支持Header压缩

参考链接

HTTP/1.1-HTTP/2.0-HTTP/3.0-HTTPS的更多相关文章

  1. 创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案

    提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案: 1.检查是否有C:\Program Files (x86)\d ...

  2. Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法

    今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ...

  3. 字符串数组初始化0 与memset 0 效率的分析

    转自:http://www.xuebuyuan.com/1722207.html 结合http://blog.sina.com.cn/s/blog_59d470310100gov8.html来看. 最 ...

  4. bootstrap2.0与3.0的区别

    在阅读这篇bootstrap2.0与3.0的区别的文章之前,大家一定要先了解什么是响应式网站设计?推荐大家看看这篇"教你快速了解响应式网站设计" . 我觉得bootstrap的可视 ...

  5. centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解

    centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解 环境准备: 操作系统:centos ...

  6. ASP.Net MVC3安全升级导致程序集从3.0.0.0变为3.0.0.1

    开发环境一般引用的是本机 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies下的System.Web.Mvc.dll,当 ...

  7. R语言中的logical(0)和numeric(0)以及赋值问题

    logical(0) 不等于 numeric(0).两者都不等于NULL值,即is.null(logical(0))和is.null(numeric(0))返还值都是FALSE.这很有意思,说明长度为 ...

  8. Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead. Please use Android Tools>Fix project Properties.

    重装操作系统之后,或者破坏了Android的开发环境之后,需要重新配置好Android的开发环境.但是配置好后,导入原有的项目时,报错: Android requires compiler compl ...

  9. Windows 8(虚拟机环境)安装.NET Framework3.5(includes .NET 2.0 and 3.0)

    按照这篇文章:http://blogs.technet.com/b/aviraj/archive/2012/08/04/windows-8-enable-net-framework-3-5-inclu ...

  10. 解决 DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe 在VS2015 Update3 安装失败的问题

    今天抽空升级VS2015 Update3. 在安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe 时报错了,看了错误日志 显示: 看到我标红的两个地方,那么 ...

随机推荐

  1. 浏览器端-W3School-JavaScript:History 对象

    ylbtech-浏览器端-W3School-JavaScript:History 对象 1.返回顶部 1. History 对象 History 对象 History 对象包含用户(在浏览器窗口中)访 ...

  2. 90子集II

    题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).说明:解集不能包含重复的子集. 输入:[1,2,2]   输出:[[2],[1],[1,2,2],[2,2],[1 ...

  3. linux查看内存使用情况top

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看, ...

  4. caffe-----使用C++ 提取网络中间层特征数据

    最近实验,想要在c++下知道网络中间某一层的特征数据情况,查找了相关资料,记录一下. 其实在caffe框架里面是包含这种操作的,可以模仿tools/extract_features.cpp中的操作来得 ...

  5. linux 设备树中 dwc3 节点的phys参数含义

    找了好久今天找到了,记录一下: &dwc3_0 { ... phys = <&lane3 PHY_TYPE_USB3 1 2 26000000>; ... } Requir ...

  6. 【VS开发】【智能语音处理】Windows下麦克风语音采集

    简介 这是我很早以前的大学毕业设计,忽然间找到贴出来以纪念自己的纯真年代...但是因为CSDN不给面子所以导致短短的一篇文章贴了足足7次..他老提时说文章超过了64K,老大,拜托,那是算上了里面的图片 ...

  7. 将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

    public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// < ...

  8. Docker&Java&Mysql&Python3&Supervisor&Elasticsearch安装

    目录 docker 安装java 安装mysql 安装Mysql8 安装python3 安装supervisor 安装ElasticSearch 打包images docker yum install ...

  9. 使用自定义View

    1 关于自定义的View的构造函数 java中对构造函数只是调用,不继承.因为整个UI是android系统提供的框架,因此构造函数需要写成它要求的格式,即和View的构造函数一样. 自定义的View中 ...

  10. [转帖]Ubuntu 对应内核版本

    带有相应Linux内核版本的Ubuntu版本列表 https://www.helplib.com/ubuntu/article_155943   问题: 是否有带有默认对应的Linux内核版本的Ubu ...