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. 半硬化树脂PP的型号

    1080是PP半固化胶片的型号(perperg),还有7628,2116,2113,2112,1506等等型号,每种型号不一样代表其PP内部的玻纤布不一样,比如7628的玻纤布相对较粗.数值较小则玻纤 ...

  2. 趣谈linux操作系统笔记-从BIOS到bootloader

    BIOS 在主板上,有一个东西叫ROM(Read Only Memory,只读存储器).这和咱们平常说的内存RAM(Read Access Memory,随机存取存储器)不同. 而 ROM 是只读的, ...

  3. emqtt emq 的主题访问控制 acl.conf

    访问控制(ACL) EMQ 消息服务器通过 ACL(Access Control List) 实现 MQTT 客户端访问控制. ACL 访问控制规则定义: 允许(Allow)|拒绝(Deny) 谁(W ...

  4. python接口测试之mock(三)

    前面介绍了moco的详细的使用,它主要是基于moco-runner-0.11.0-standalone.jar,通过编写json的文件来实现,mock翻译过来就是模拟的意思,也就是说,它是将测试对象所 ...

  5. Centos7 安装可视化界面

    yum group list Output: Loaded plugins: fastestmirror There is no installed groups file. Maybe run: y ...

  6. Docker面试题(二)

    什么是虚拟化? 虚拟化允许您在相同的硬件上运行两个完全不同的操作系统.每个客户操作系统都经历了引导,加载内核等所有过程.您可以拥有非常严格的安全性,例如,客户操作系统无法完全访问主机操作系统或其他客户 ...

  7. 数组被遗忘的内置对象--》Array.find()

    需求:一个数组包含很多对象,对象中有很多属性.现在给你一个值,且这个值再这个数组的某个对象存在,那么如何找到这个对象? 首先想的是for循环遍历,但这样非常麻烦,js给我们提供了一个find()方法, ...

  8. 反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!

    最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在<Cocos Creator游戏开发实战>中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反 ...

  9. [转帖]linux文件描述符文件/etc/security/limits.conf

    linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...

  10. PostgreSQL通过解析日志,获取数据库增量变化,pg_recvlogical

    1.首先用该工具来看我们的日志变化,需要先将test_decoding插件编译并安装(进入contrib,编译安装即可) 创建一个slot: SELECT * FROM pg_create_logic ...