HTTP 基础

协议理论基础


  • 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的区别:

  1. get 方法一般用于请求,比如你在浏览器地址栏输入 www.cxuanblog.com 其实就是发送了一个 get 请求,它的主要特征是请求服务器返回资源,而 post 方法一般用于表单的提交,相当于是把信息提交给服务器,等待服务器作出响应,get 相当于一个是 pull/拉的操作,而 post 相当于是一个 push/推的操作。

  2. 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
  1. GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而 POST方法 请求会把参数和值放在消息体中,对数据长度没有要求。

  2. get 请求会被浏览器主动 cache,而 post 不会,除非手动设置。

  3. get 请求在浏览器反复的 回退/前进 操作是无害的,而 post 操作会再次提交表单请求。

  4. 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-alivekeep-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 搜索引擎的蜘蛛等

AccpetAccept-LanguageAccept-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-SinceExpires 作为缓存失效的标准。

  • 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 中新增加了 EtagIf-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-AgentCookieAcceptServerRange 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。

  • 二进制格式:HTTP 2.0 使用了更加靠近 TCP/IP 的二进制格式,而抛弃了 ASCII 码,提升了解析效率

  • 强化安全:由于安全已经成为重中之重,所以 HTTP2.0 一般都跑在 HTTPS 上。

  • 多路复用:即每一个请求都是是用作连接共享。一个请求对应一个id,这样一个连接上可以有多个请求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容