HTTP学习记录

Posted zmj97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP学习记录相关的知识,希望对你有一定的参考价值。


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学习记录的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

golang代码片段(摘抄)

QT 实用代码片段

CSP核心代码片段记录

记录C#常用的代码片段

discuz X3.1 源代码阅读,记录代码片段