http协议
产生背景
1989年3月,CERN(欧洲核子研究组织)的蒂姆·伯纳斯-李(Tim Berners-Lee)博士提出了一种能让远隔两地的研究者们共享知识的设想。
最初设想的基本理念:借助多文档的之间相互关联形成的超文本(HyperText),连成可相互传阅的www(word wide web,万维网)
1990年11月CERN(欧洲核子研究组织)成功的研发了世界上第一台Web服务器和Web浏览器
HTTP的建立主要就是解决多个超文本标记语言之间的联系,也就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
www
www(万维网)这一名称,是web浏览器当年用来浏览超文本的客户端应用程序时的名称。现在则是来表示这一系列集合,也可简称web
-
页面的文本标记语言的HTML(HyperText Markup Language,超文本标记语言)
-
作为文档传递协议的HTPP
-
指定文档所在的url(uniform Resource Locator,统一资源定位符)
HTTP的版本
HTTP /0.9 | 1990年问世,但并没有被作为正式的标准建立 |
---|---|
HTTP/1.0 | 1996年5月,HTTP正式作为标准建立版本被命名为HTTP/1.0,记载于RFC1945 |
HTTP/1.1 | 1997年1月公布HTTP1.1版本,为目前的主流的HTTP协议版本,初期标准是RFC2068,之后又发布修订版RFC2616 |
HTTP/2.0 | 还在研究中,还没有普及 |
HTTP协议的诞生主要是为了解决文档的传输问题
HTTP协议的简介
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。
HTTP(Hyper Text Transfer Protocol, 超文本传输协议)协议是一种通信协议 , 是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP是一个属于应用层的面向对象的协议,属于无状态协议
什么是无状态保存
HTTP的是一种不保存状态,就是无状态(stateless)协议,HTTP协议本身对于请求和响应之间的通信状态进行保存,也可以说在HTTP这个级别,协议对于发送过的请求和响应都不会做持久化处理,这是为了更快地处理大量事务,并且确保协议的可伸缩性。
解决协议的无状态问题,可以选择用隐含参数和cookie技术
隐含参数:就是存在与html标签的属性中的值,例如:<input value="java"/> ,里面的参数的大小不能太大
cookie技术:可以保存的很大参数。
什么是无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。 采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。
HTTP/1.1版本不是直接断开了,而是等了几秒,如果用户在这几秒中再一次发送请求,就直接采用这个连接通道,如果在这几秒中没有再发送请求,就断开连接
HTTP的工作原理
HTTP协议工作与客户端-服务端架构上,浏览器作为HTTP的客户端通过url向HTTP服务端(web服务器)发送请求报文
- Web服务器有:Apache服务器,IIS服务器(Internet Information
Services)等。常用的是Apache服务器 - Web服务器接受到请求后,向客户端发送信息
- HTTP的默认端口是80,可以进行修改
HTTP三点注意事项:
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP请求/响应的过程
1.客户端连接web服务器:HTTP客户端(浏览器),与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2.发送请求:通过TCP套接字,客户端向Web服务器发送一个文本的请求报文(请求行、请求头部、空行和请求数据组成)
3.web服务器接受请求并返回HTTP响应:Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。
(一个响应由状态行、响应头部、空行和响应数据4部分组成。)
4.释放TCP连接:
1>.若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;
2>.若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5.客户端浏览器解析HTML内容:
1>.客户端浏览器首先解析状态码
2>.然后解析每一个响应头
3>.客户端浏览器读取响应数据HTML
HTTP的消息结构
HTTP是基于C/S(客户端/服务端)的架构模式,通过一个可靠的链接来交换消息,是一个无状态的请求/响应协议。
HTTP客户端和服务端都是一个应用程序:
-
客户段:通过连接到服务器达到向服务器发送一个或多个HTTP的请求目的。
-
服务端:通过客户端的请求并向客户端发送HTTP响应数据
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
客户端的请求报文
由上图可知请求报文由:请求行、请求头部、请求数据和空行四个部分组成
- 请求行:用来说明请求方式、要访问的资源以及协议版本
- 请求头:用来说明服务器的附加信息、以及消息类型、消息长度
- 空行:请求头部后面的空行是必须的
- 请求数据:也是请求主体,可以添加任意的其他数据
常用的请求头:
- 状态行:由HTTP协议版本号, 状态码, 状态消息 三部分组成。
- 消息报头:用来说明客户端要使用的一些附加信息。
- 空行:消息报头后面的空行是必须的
- 响应正文:服务器返回给客户端的文本信息。
- Cookie:由之前服务器通过Set-Cookie(见下文)设置的一个HTTP协议Cookie
- Connection:客户端(浏览器)想要优先使用的连接类型(Connection: keep-alive(是为了兼容http/1.1版本)、Connection: Upgrade)
- Upgrade:TLS/1.0(用于检测HTTP协议及其他协议是否可使用更高版本进行通信)
- Accept:可接受的响应内容类型(Content-Types)。(Accept: text/plain)
- Accept-Charset:可接受的字符集。(Accept-Charset: utf-8)
- Accept-Encoding:可接受的响应内容的编码方式。(Accept-Encoding: gzip, deflate)
- Accept-Datetime:可接受的按照时间来表示的响应内容版本
- Authorization :用于表示HTTP协议中需要认证资源的认证信息(Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==)
- Cache-Control:通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制
- Transfer-Encoding:规定了传输报文主体时采用的编码方式
- Warning:通常会告知用户一些与缓存相关的问题的警告
- Host:首部字段的host会告知服务器,请求的资源所处的互联网主机名和端口号。host首部字段在HTTP/1.1规范内时唯一一个必须被包含在请求内的首部字段
- Referer:告知服务器请求的原始资源的URL,安全隐患很严重(能够获取用户的以些敏感信息,包括cookie信息)
- User-Agent:浏览器的身份标识字符串
- Connection:客户端(浏览器)想要优先使用的连接类型
- Content-Type:表示后面的文档属于什么MIME类型
- Content-Encoding:文档的编码方法
- Content-Length:以8进制表示的请求体的长度
- Date:发送消息的日期和时间
- From:发送此请求用户的邮件地址
- User-Agent:浏览器的身份标识字符串
服务器的响应消息
HTTP的服务响应由四个部分组成:状态行、消息报头、空行和响应正文
常用的HTTP响应头:
Accept-Ranges:服务器支持的内容范围
Age:响应对象在代理缓存中存在的时间,以秒为单位
Allow:对于特定资源的有效动作;
Connection:针对该连接所预期的选项
Content-Encoding: 响应资源所使用的编码类型。
Content-Length:响应消息体的长度,用8进制字节表示
Content-Location:所返回的数据的一个候选位置
Date:此条消息被发送时的日期和时间(以RFC 7231中定义的"HTTP日期"格式来表示)
Status: 通用网关接口的响应头字段,用来说明当前HTTP连接的响应状态。
Trailer:Trailer用户说明传输中分块编码的编码信息
HTTP的请求方式
根据HTTP标准,HTTP可以使用多种请求方式:
HTTP1.0定义了三种请求方式:GET、POST和HEAD方式
HTTP1.1新增了六种请求方式:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方式 | 描述 |
---|---|---|
1 | GET | 用来请求访问已被URL识别的资源,指定的资源经服务器端解析后返回响应内容,如果请求的资源是文本,那就原样返回,如果是CGI(通用网关接口)那样的程序,则返回经过执行的后的输出结果 |
2 | HEAD | 类似于GET请求,只不过返回的响应中没有具体的内容,而是HTTP的头信息 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。发送资源到服务器,并存粗再服务器的指定位置上 |
5 | DELETE | 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。 |
7 | OPTIONS | 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
POST请求和GET请求的区别?
- GET提交的数据会放在URL之后,以?分割URL和要传输数据,参数之间以&相连,POST提交是将数据放在Http包的Body里
- GET请求只能进行url编码,POST请求支持多种编码方式
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
- GET请求可以被缓存,而POST请求不能被缓存
- GET请求只允许ASCII 字符,而POST请求没有限制
- GET是从服务器上获取数据,POST是向服务器传送数据。
- 对于GET方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
- GET提交的安全性低,因为再url中可见传的参数,而再POST中参数不会被保存在浏览器历史或 web 服务器日志中,所以更安全,
- GET的效率要高于POST
URL和URI
URL(Uniform Resource Locator,统一资源定位符):它是WWW的统一资源定位标志,就是指网络地址
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
也可认为由4部分组成:协议、主机、端口、路径
URL的格式:
protocol(协议) : // hostname*(主机名)[:port(端口号)] / path(路径) / [;parameters(参数)][?query(查询)]#fragment
URI(Uniform Resource Identifier,统一资源标识符):是一个用于标识某一互联网资源名称的字符串
url和uri之间的关系
URI用字符串标识某一互联网资源,而URL表示资源的地点(即在互联网上所处的地点)。可见URL时URI的子集
URL就是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。URI是一种抽象的,高层次概念定义统一资源标识,而URL则是具体的资源标识的方式。URL时URI的一种。
状态码
HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918 等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果借助状态码,用户可以知道服务器端时正常处理了请求,还是出现了错误
状态码的类别
状态码样式 | 类别 | 原因短语 |
---|---|---|
1xx | Informational (信息状态码) | 接受的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作已完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理的请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求错误 |
状态码详情
序号 | 状态码 | 描述 |
---|---|---|
1 | 100 | (Continue)客户端应当继续发送请求,这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应 |
2 | 101 | (Switching Protocols)服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。 |
3 | 102 | 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 |
4 | 200 | (OK)请求已成功,表示响应正常 |
5 | 201 | (Created)请求已被实现,而且有一个新的资源已经一句请求的需要而建立,且其 URI 已经随Location 头信息返回 |
6 | 202 | (Accepted)服务器已接受请求,但尚未处理,目的是允许服务器接收其他过程的请求 |
7 | 203 | (Non-Authoritative Information) 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝 |
8 | 204 | (No Content)服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息 |
9 | 205 | (“Reset Content”)服务器成功处理了请求,且没有返回任何内容,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入 |
10 | 206 | (Partial Content)服务器已经成功处理了部分的GET请求 |
11 | 207 | Multi-Status 代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码 |
12 | 300 | (Multiple Choices)若被请求的资源在服务器端存在多个表示,而服务器不知道客户端想要的是哪一个表示时,发送这个响应代码 |
13 | 301 | Moved Permanently 永久重定向,该状态码表示请求的资源已经被分配了新的URL,以后应使用资源现在所指的URL |
14 | 302 | Move Temporarily 临时重定向,该状态码表示请求的资源已经被分配了新的URL,临时希望用户(本次)能够使用新的URL访问 例:可用于防火墙重定向。 |
15 | 303 | See Other 该状态码表示由于请求对应的资源存在这另一个URL,302和303状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源 |
16 | 304 | ( Not Modified) 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码 |
17 | 305 | Use Proxy 被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源 |
18 | 307 | Temporary Redirect(临时重定向) 请求的资源临时从不同的URI 响应请求。 |
19 | 400 | Bad Request 语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求,请求参数有误。 |
20 | 401 | Unauthorized 该状态码表示发送的请求需要通过HTTP验证(BASIC验证、DIGEST验证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败 |
21 | 402 | Payment Required 该状态码是为了将来可能的需求而预留的。 |
22 | 403 | Forbidden 服务器已经理解请求,但是拒绝执行它(没有权限)。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交 |
23 | 404 | Not Found 请求失败 没有找到 |
24 | 405 | Not Acceptable 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。 |
25 | 408 | Request Timeout 请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。 |
26 | 451 | Unavailable For Legal Reasons 该请求因法律原因不可用。(RFC 7725) |
27 | 422 | 请求格式正确,但是由于含有语义错误,无法响应。(RFC 4918 WebDAV) |
28 | 423 | 当前资源被锁定。(RFC 4918 WebDAV) |
29 | 415 | Unsupported Media Type 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。 |
30 | 500 | 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。 |
31 | 501 | 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。 |
32 | 502 | 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 |
33 | 503 | 由于临时的服务器维护或者过载,服务器当前无法处理请求 |
34 | 504 | 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。 |
35 | 507 | 服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918) |
36 | 510 | 获取资源所需要的策略并没有被满足。 |
37 | 600 | 源站没有返回响应头部,只返回实体内容 |
最基本的状态码
- 200(“OK”) 一切正常。实体主体中的文档(若存在的话)是某资源的表示。
- 400(“Bad Request”)
客户端方面的问题。实体主题中的文档(若存在的话)是一个错误消息。希望客户端能够理解此错误消息,并改正问题。 - 500(“Internal Server Error”)
服务期方面的问题。实体主体中的文档(如果存在的话)是一个错误消息。该错误消息通常无济于事,因为客户端无法修复服务器方面的问题。 - 301(“Moved Permanently”)
当客户端触发的动作引起了资源URI的变化时发送此响应代码。另外,当客户端向一个资源的旧URI发送请求时,也发送此响应代码。 - 404(“Not Found”) 和410(“Gone”)
当客户端所请求的URI不对应于任何资源时,发送此响应代码。404用于服务器端不知道客户端要请求哪个资源的情况;410用于服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了的情况。 - 409(“Conflict”) 当客户端试图执行一个”会导致一个或多个资源处于不一致状态“的操作时,发送此响应代码。
Https认证和http认证
https(Hypertext Transfer Protocol Secure,超文本传输安全协议)协议的简介
HTTP的缺点:
- 通信的时候使用的是明文,内容很容易被窃听
- 没有验证通信方的身份,因此有可能遭遇伪装
- 无法验证报文的完整性,所以有可能会被篡改
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTPS(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议