协议理论基础
- HTTP(HyperText Transfer Protocol:超文本传输协议)
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
-
超文本:“带超链接的文本”可以从网站的一个地址到达另外一个地址。文本可以是图片、文字、视频、音频等
-
浏览网页的本质:通过http协议去获取web服务器上的资源
-
互联网资源(文字、图片、网页)无数多,如何指定和获取想要的资源?
指定:http(s)://<主机>:<端口>/<路径> (主机为域名/IP,端口默认http 80 / https 443)
获取:HTTP GET 请求
请求/应答报文
请求报文结构:
请求行:[请求方法] [请求地址] [请求版本]
(只占一行)
请求头:格式为 <key>:<value>
(多行,以空行结束)
请求体:用于发送数据
(可以为空,如GET请求)
应答报文结构:
状态行:[HTTP版本] [状态码] [状态解析]
应答头:格式为 <key>:<value>
应答体:用于发送数据
状态码:
消息头:
请求方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
GET:向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE: 请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
PATCH: 用来将局部修改应用于某一资源,添加于规范RFC5789。
HEAD: 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
OPTIONS: 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
GET和POST的区别:
-
get 方法一般用于请求,比如你在浏览器地址栏输入 www.cxuanblog.com 其实就是发送了一个 get 请求,它的主要特征是请求服务器返回资源,而 post 方法一般用于表单的提交,相当于是把信息提交给服务器,等待服务器作出响应,get 相当于一个是 pull/拉的操作,而 post 相当于是一个 push/推的操作。
-
get 方法是不安全的,因为请求参数拼在 URL 后面,从而导致容易被攻击者窃取、伪造:
/test/demo_form.asp?name1=value1&name2=value2
而 post 方法是把参数放在请求体 body 中的,这对用户来说不可见:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
-
GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而 POST方法 请求会把参数和值放在消息体中,对数据长度没有要求。
-
get 请求会被浏览器主动 cache,而 post 不会,除非手动设置。
-
get 请求在浏览器反复的 回退/前进 操作是无害的,而 post 操作会再次提交表单请求。
-
get 请求在发送过程中会产生一个 TCP 数据包;post 在发送过程中会产生两个 TCP 数据包。对于 get 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 post,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
HTTP 消息头
HTTP 标头会分为四种,分别是 通用标头、实体标头、请求标头、响应标头。
通用标头
通用标头主要有三个,分别是 Date、Cache-Control 和 Connection。
Date:可以出现在请求标头和响应标头中。表示的是格林威治标准时间,这个时间要比北京时间慢八个小时
Date: Wed, 21 Oct 2015 07:28:00 GMT
Cache-Control:通用标头。控制可缓存性、阈值性、 重新验证并重新加载
Connection: 通用标头。决定当前事务(一次三次握手和四次挥手)完成后,是否会关闭网络连接,可选值有两种: 持久性连接keep-alive
和 keep-alive
非持久性连接。
HTTP1.1 其他通用标头:
实体标头
实体标头是描述消息正文内容的 HTTP 标头。
请求标头
Host:
Host 主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。如果没有给定端口号,会自动使用被请求服务的默认端口(比如请求一个 HTTP 的 URL 会自动使用 80 作为端口)。
在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。
Host: developer.mozilla.org
Referer:
HTTP Referer 属性是请求标头的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
Referer: https://developer.mozilla.org/testpage.html
User-Agent:
用户代理,一般情况是浏览器,也有其他类型,如:wget curl 搜索引擎的蜘蛛等
Accpet、 Accept-Language、Accept-Encoding 都是属于内容协商的请求标头。
HTTP 1.1 常用响应头:
响应标头
Access-Control-Allow-Origin:
一个返回的 HTTP 标头可能会具有 Access-Control-Allow-Origin ,Access-Control-Allow-Origin 指定一个来源,它告诉浏览器允许该来源进行资源访问。
Keep-Alive:
Keep-Alive 表示的是 Connection 非持续连接的存活时间,可以进行指定。
Server:
服务器标头包含有关原始服务器用来处理请求的软件的信息。
应该避免使用过于冗长和详细的 Server 值,因为它们可能会泄露内部实施细节,这可能会使攻击者容易地发现并利用已知的安全漏洞。例如下面这种写法
Server: Apache/2.4.1 (Unix)
Set-Cookie
Set-Cookie :
用于服务器向客户端发送 sessionID。
Transfer-Encoding:
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。
chunked
值,允许HTTP由网页服务器发送给客户端应用的数据可以分成多个部分
HTTP /1.1 的传输编码方式仅对分块传输编码有效。
X-Frame-Options:
HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应用上,会出现各种非标准的首部字段。
首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
下面是一个响应头的汇总,基于 HTTP 1.1:
HTTP特点
1、支持客户/服务器模式(基于请求和响应)
HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
2、简单快速
客户向服务器请求服务时,只需传送请求方法和路径。
请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活
HTTP允许传输任意类型的数据对象,由Content-Type加以标记。
4、无连接
HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。
HTTP 1.1使用持续连接:不必为每个web对象创建一个新TCP的连接,一个连接可以传送多个HTTP对象,采用这种方式可以节省传输时间。
5、无状态
HTTP协议是无状态协议。
无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时,这种无状态特性又使他的应答变得更快。
HTTP相关解说
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,HTTP(超文本传输协议 Hypertext transfer protocol)是一种通信协议,详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
HTTP默认的端口号为80,HTTPS的端口号为443。
浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。
HTTP,超文本传输协议(Hypertext Transfer Protocol), 主要内容分为三部分,超文本(Hypertext)、传输(Transfer)、协议(Protocol):
-
超文本就是不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转。
-
上面这些概念可以统称为数据,传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。
-
而协议指的就是是网络中(包括互联网)传递、管理信息的一些规范。
发展历程:
版本 | 产生时间 | 内容 | 发展现状 |
---|---|---|---|
HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 |
HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作为标准 |
HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 |
HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
HTTP 1.0
HTTP 1.0 是在 1996 年引入的,从那时开始,它的普及率就达到了惊人的效果。
-
HTTP 1.0 仅仅提供了最基本的认证,这时候用户名和密码还未经加密,因此很容易收到窥探。
-
HTTP 1.0 被设计用来使用短链接,即每次发送数据都会经过 TCP 的三次握手和四次挥手,效率比较低。
-
HTTP 1.0 只使用 header 中的
If-Modified-Since
和Expires
作为缓存失效的标准。 -
HTTP 1.0 不支持断点续传,也就是说,每次都会传送全部的页面和数据。
-
HTTP 1.0 认为每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)。
HTTP 1.1
HTTP 1.1 是 HTTP 1.0 开发三年后出现的,也就是 1999 年,它做出了以下方面的变化
-
HTTP 1.1 使用了摘要算法来进行身份验证
-
HTTP 1.1 默认使用长连接,长连接就是只需一次建立就可以传输多次数据,传输完成后,只需要一次切断连接即可。长连接的连接时长可以通过请求头中的
keep-alive
来设置 -
HTTP 1.1 中新增加了
Etag
,If-Unmodified-Since
,If-Match
,If-None-Match
等缓存控制标头来控制缓存失效。 -
HTTP 1.1 支持断点续传,通过使用请求头中的
Range
来实现。 -
HTTP 1.1 使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
HTTP 2.0
HTTP 2.0 是 2015 年开发出来的标准,它主要做的改变如下
-
头部压缩:由于 HTTP 1.1 经常会出现
User-Agent
、Cookie
、Accept
、Server
、Range
等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。 -
二进制格式:HTTP 2.0 使用了更加靠近 TCP/IP 的二进制格式,而抛弃了 ASCII 码,提升了解析效率
-
强化安全:由于安全已经成为重中之重,所以 HTTP2.0 一般都跑在 HTTPS 上。
-
多路复用:即每一个请求都是是用作连接共享。一个请求对应一个id,这样一个连接上可以有多个请求。
网友评论