title: HTTP学习记录
toc: true
date: 2018-09-21 20:40:48


HTTP协议,HyperText Transfer Protocol,超文本传输协议,是因特网上应用最为 广泛的一种网络传输协议。

版本

HTTP/0.9

已过时,只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。

因为这个版本不支持POST方法,因此客户端无法向服务器传递太多信息。

HTTP/1.0

第一个在通讯中指定版本号的版本,至今仍被广泛采用,特别是在代理服务器中。

HTTP/1.1

当前版本,默认采用持久连接,并能很好地配合代理服务器工作。

支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

SPDY

SPDY (发音为"speedy") ,是一个由 Google 主导的研究项目发明的HTTP替代协议。SPDY一开始主要关注降低延迟,采用了TCP通道,但是使用了不同的协议来达到此目的。

HTTP/2.0

简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)。

协议之间的比较

HTTP/1.1相较于HTTP/1.0的主要区别

  • 缓存处理
  • 带宽优化及网络连接的使用
  • 错误通知的管理
  • 消息在网络中的发送
  • 互联网地址的维护
  • 安全性及完整性

HTTP/2与HTTP/1.1比较

HTTP/2 相比 HTTP/1.1 的修改并不会破坏现有程序的工作,但是新的程序可以藉由新特性得到更好的速度。

HTTP/2 保留了 HTTP/1.1 的大部分语义,例如请求方法状态码乃至URI和绝大多数HTTP头部字段一致。

但是 HTTP/2 采用了新的方法来编码、传输客户端/服务器间的数据。

HTTP/1.1与SPDY的区别

其与HTTP/1.1相比,SPDY主要的改变有:

  • 实现无需先入先出的多路复用
  • 为简化客户端和服务器开发的消息—帧机制
  • 强制性压缩(包括HTTP头部)
  • 优先级排序
  • 双向通讯

HTTP/2与SPDY的比较

HTTP/2的开发基于SPDY进行跃进式改进。在诸多修改中,最显著的改进在于,HTTP/2使用了一份经过定制的压缩算法,基于霍夫曼编码,以此替代了SPDY的动态流压缩算法,以避免对协议的Oracle攻击——这一类攻击以CRIME为代表。此外,HTTP/2禁用了诸多加密套件,以保证基于TLS的连接的前向安全。

简介

基于TCP/IP通信协议传递数据。

工作原理

HTTP协议工作在客户端-服务端架构(C/S)上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

Web服务器有Apache服务器、IIS(Internet Informatica Services)服务器等。

Web服务器根据接收到的请求,向客户端发送响应信息。

HTTP默认端口号为80,我们也可以改为8080或者其他端口。

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)定位互联网上的资源。

注意事项

HTTP是:

  • 无连接的:每次连接只处理一个请求。服务器处理完客户的请求并受到客户的应答后就断开连接。采用这种方式可以节省传输时间。
  • 媒体独立的:只要客户端和服务端都知道如何处理数据内容,任何类型都可以通过HTTP发送。客户端和服务器指定合适的MIME-tyoe内容类型。
  • 无状态的:协议对于事务处理没有记忆能力。HTTP协议自身不对请求和响应之间的通信状态进行保存。
    • 这是为了更快地处理大量事务,确保协议的可伸缩性而特意设计的。但这也导致业务处理变得棘手的情况增多,比如要保持登录状态,因为HTTP无状态,因此需要额外保存用户状态。
    • HTTP/1.1虽然也是无状态协议,但是为了实现比如保持状态的功能,引入了Cookie技术,这让管理状态变得简单。
    • Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

HTTP协议通信流程:

Web浏览器<=HTTP协议=>HTTP服务器<=>CGI(通用网关接口)应用程序<=>数据库

其中CGI:

是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。

HTTP报文

用于HTTP协议交互的信息称为HTTP报文。请求端(客户端)的HTTP报文称为请求报文,响应端(服务器端)的叫响应报文.

HTTP报文本身是由多行(用CR+LF作为换行符)数据构成的字符串文本。

HTTP报文大致可分为报文首部和报文主体,两者由最初出现的空行(CR+LF)来划分。

通常并不一定要有报文主体。

报文首部

服务器端或客户端需处理的请求或响应的内容及内容

请求报文的报文首部由请求行、请求首部字段、通用首部字段、实体首部字段、其他组成

响应报文的报文首部由状态行、响应首部字段、通用首部字段、实体首部字段、其他组成

CR+LF

CR,Carriage Return,回车符,16进制0x0d

LF,Line Feed,换行符,16进制0x0a

报文主体

应被发送的数据

常用请求首部信息

(参考自红宝书)

虽然不同浏览器实际发送的头部信息会有所不同,但下边这些基本上是所有浏览器都会发送的:

  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Accept-Language:浏览器当前设置的语言
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URI。注意HTTP规范将这个字段拼写错了(正确拼法为Referrer),但为了保证与规范一致,也只能将错就错了。
  • User-Agent:浏览器的代理用户字段。

注意,这些字段名是一个字母都不应有区别的,一旦有区别,那它就不是首部字段。

请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET

GET方法请求指定的页面信息. 使用GET的请求应该只被用于获取数据.

HEAD

HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.

POST

POST方法用于向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

PUT

PUT方法从客户端向服务器传送的数据取代指定的文档的内容。

注意:因为HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的web网站不使用该方法。

DELETE

DELETE方法删除指定的资源。

注意:和PUT一样,因为HTTP/1.1的DELETE方法自身不带验证机制,存在安全性问题,因此一般的web网站不使用该方法。

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

OPTIONS

询问支持的方法,查询请求URI指定的资源支持的方法。

TRACE

回显服务器收到的请求,查询发送出去的请求是怎样被加工/修改的,主要用于测试或诊断(因为从代理服务器路由中转时请求可能被篡改)。不常用。

PATCH

PATCH方法用于对资源进行部分修改。(PUT为对资源进行整体覆盖)

HTTP状态码

  • 1XX信息,服务器收到请求,需要请求者继续执行操作
  • 2XX成功,操作被成功接收并处理
  • 3XX重定向,需要进一步的操作以完成请求
  • 4XX客户端错误,请求包含语法错误或无法完成请求
  • 5XX服务器错误,服务器在处理请求的过程中发生了错误

常见状态码:

  • 200 OK, 一切正常,对GET和POST请求的应答文档跟在后面
  • 301 Moved Permanently,客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
  • 302 Found,类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
  • 304 Not Modified,客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
  • 307 Temporary Redirect,和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是 POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清楚地区分几个状态代码: 当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。
  • 400 Bad Request,请求出现语法错误。
  • 401 Unauthorized,客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求
  • 403 Forbidden, 资源不可用。
  • 404 Not Found,无法找到指定位置的资源
  • 410 Gone, 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用
  • 500 Internal Server Error,服务器遇到了意料不到的情况,不能完成客户的请求
  • 501 Not Implemented,服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求
  • 503 Service Unavailable ,服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头

Content-Type

Content-Type: text/html; charset=UTF-8

实体首部字段,表示实体主体的媒体类型。

字段值采用type/subtype形式赋值。

对照表链接:https://www.w3cschool.cn/http/ahkmgfmz.html


W3C的教程的学习笔记,过两天再啃一下MDN和《图解HTTP》,还要再复习一下计网,很多都忘了...

emmmW3C有的是错的...使用网络教程需谨慎....

关于HTTP/2.0以及SPDY等均来自维基百科。

这里只是重新回忆一下什么是HTTP,还是要看文档!啃《图解HTTP》!复习计网!

HTTP学习记录的更多相关文章

  1. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  2. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  3. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  7. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  8. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  9. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

  10. UWP学习记录6-设计和UI之控件和模式3

    UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...

随机推荐

  1. Vmware 安装samba之二

    安装samba:sudo apt-get install samba 安装smbclient:sudo apt-get install 安装smbfs:sudo apt-get smbfs 2.修改配 ...

  2. scrollView中内部控件的悬停

    以下图为例,图片,红色view和蓝色view是添加在scrollView上的,向上拖动,红色view停留在屏幕顶端不动,其它的继续滚动,向下拖动后,红色view跟着下来 代码如下:(注意的是scrol ...

  3. Spring学习笔记(二) 初探Spring

    版权声明 笔记出自<Spring 开发指南>一书. Spring 初探 前面我们简单介绍了 Spring 的基本组件和功能,现在我们来看一个简单示例: Person接口Person接口定义 ...

  4. ORA-16019 和 ORA-16018 错误的处理方法(转)

    一. ORA-16019 和 ORA-16018 错误产生描述 同事在修改归档目录,一不小心把参数设置错误了, 他设置的是log_archive_dest参数. 这个参数和默认log_archive_ ...

  5. ASP.NET中各种缓存技术的特点及使用场景

    对于一些不经常改变却经常被request的数据,我们喜欢将它们缓存在内存.这样用户请求时先到缓存中去取,如果缓存中没有,再去数据库拿,提高响应速度.缓存一般实现在BLL,这样可以与DAL分离,更换数据 ...

  6. js获取浏览器中相关容器的高度

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...

  7. thinkphp 5 count()方法在控制器,模板中的使用方法

    thinkphp中关于count()方法的使用: 控制器中:echo count($arr)模板中:{$arr | count}模板中if判断语句中 <if condition="co ...

  8. RabbitMQ学习笔记(2)----RabbitMQ简单队列(Hello World)的使用

    1. 简单队列结构图 2. 引入依赖 pom.xml文件 <dependency> <groupId>com.rabbitmq</groupId> <arti ...

  9. java简单实现MD5加密

    1.话不多说,直接上代码-----传入字符串,返回加密码 import java.security.MessageDigest; import java.text.NumberFormat; publ ...

  10. Python数据分析8-----网页文本处理

    1.去除网页的标签,如<br/> from bs4 import BeautifulrSoup preData=BeautifulSoup(data,'html.parser').get_ ...