HTTP:伟大而又无闻的协议

HTTP:伟大而又无闻的协议

学习一时爽,一直学习一直爽!

  Hello,大家好啊,我是Connor,一个从无到有的技术小白。有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协议,只是知道HTTP协议是用来网页传输的,但是再深究一点就不明白了,所以今天我们来讲一讲什么是HTTP协议。

1.HTTP 与 HTTPS

1.1 什么是HTTP协议

  • 超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
  • HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。
  • 一次HTTP请求的基本流程一般是,在建立TCP连接后,由客户端向服务端发起一次请求 request ,而服务器在接收到以后返回给客户端一个响应 response 。所以我们看到的HTTP请求内容一般就分为请求和响应两部分。
  • HTTP协议通常承载于TCP协议之上,默认HTTP的端口号为80。有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS,稍后我们会详细说HTTP和HTTPS的区别。

1.2 HTTP协议的特点

  • http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。
  • 无连接。所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。限制每次的连接只处理一次请求。从而节省传输时间。
  • 无状态。HTTP协议是无状态的,也就是说每一次HTTP请求之间都是相互独立的,没有联系的,服务端不知道客户端具体的状态。比如客户端访问一次网页之后关闭浏览器,然后再一次启动浏览器,再访问该网站,服务器是不知道客户关闭了一次浏览器的。这样设计的原因是因为Web服务器一般需要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息
  • 简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问。
  • 灵活:客户端可以通过HTTP协议传输任意类型的数据,包括但不限于文本,图片,视频等

1.3 HTTP与HTTPS的区别

HTTP大家都知道是什么东西了,那什么是HTTPS呢?HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,承载于SSL协议层之上。因此加密的详细内容就需要SSL。

区别

HTTP

HTTPS

安全性

不安全

安全

是否需要证书

不需要

需要

传输方式

明文传输

加密传输

默认端口

80

443

HTTPS和HTTP相比的主要优势就是体现在它的安全性上,它的缺点也很明显,体现在它的行能和技术方面,具体的优缺点我们不再多说,大家可以自行体会。

2.HTTP 请求

每一个HTTP请求都由三部分组成,分别是:请求行、请求报头、请求正文。

2.1 请求行

请求行一般由请求方法url路径协议版本组成,如下所示:

GET https://www.baidu.com HTTP/1.1

通过上面我们可以看到请求行分了三个部分,其中GET就是请求行中的请求方法,https://www.baidu.com 就是请求行中的url路径, HTTP/1.1就是它的协议版本。

2.2 请求报头(请求头)

请求头遵循以下格式:

名字:空格 + 值

常用的请求头的属性如下:

属性名

作用

Host

指定的请求资源的域名(主机和端口号)。HTTP请求必须包含HOST,否则系统会以400状态码返回。

User-Agent

简称UA,内容包含发出请求的用户信息,通常UA包含浏览者的信息,主要是浏览器的名称版本和所用的操作系统。这个UA头不仅仅是使用浏览器才存在,只要使用了基于HTTP协议的客户端软件都会发送,无论是手机端还是PDA等,这个UA头是辨别客户端所用设备的重要依据。

Accept

告诉服务器可以接受的文件格式。

Cookie

告诉浏览器Cookie信息

Cache-Control

指定请求和响应遵循的缓存机制。

Referer

页面跳转处,表明请求来自于哪个URL,用户是从该哪个页面访问到当前页面的。

Content-Length

内容长度。

Content-Range

响应的资源范围。可以在每次请求中标记请求的资源范围,在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,实现断点续传。

Accept-Encoding

指定所能够接受的编码方式

Accept-Language

指浏览器可以接受的语言种类 en、en-us指英语 zh、zh-cn指中文。

Connection

客户端与服务器链接类型,keep-alive:保持链接,close:关闭链接。

当然这些知识列举出了平时常用的一些请求头属性,有些网站也会使用自定义的属性,会使用诸如su,x-index等各种非常用属性之外的属性,非常容易鉴别。

2.3 请求正文

请求正文通常只有使用POST方式进行请求的时候才会有请求正文,如果使用GET请求的话,是不会有请求正文的,具体情况将会在后面的GET与POST请求处细说。

2.4 HTTP请求方法

HTTP协议中定义的请求方法有以下几种:

序号

方法

描述

1

GET

请求指定的页面信息,并返回实体主体。

2

HEAD

类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

3

POST

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

4

PUT

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

5

DELETE

请求服务器删除指定的页面。

6

CONNECT

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

7

OPTIONS

允许客户端查看服务器的性能。

8

TRACE

回显服务器收到的请求,主要用于测试或诊断。

虽然HTTP请求中定义的方法有这么多种,但是我们平常使用的基本只有GETPOST两种方法,而且大部分网站都是禁用掉了除GETPOST外其他的方法。

因为其他几种方法通过GET或者POST都能实现,而且对于网站来说更加的安全和可控。

  • GET 其实简单来说,GET方法一般用来负责获取数据,或者将一些简短的数据放到URL参数中传递到服务器。比POST更加高效和方便。
  • POST 由于GET方法最多在url中携带1024字节数据,且将数据放到URL中传递太不安全,数据量大时URL也会变得冗长。所以传递数据量大或者安全性要求高的数据的时候,最好使用POST方法来传递数据。

3.HTTP响应

每一个HTTP请求也都由三部分组成和请求行类似,分别是:响应行、响应报头、响应正文。

3.1 响应行

状态行由HTTP协议版本号, 状态码, 状态消息三部分组成。如下所示:

HTTP/1.1 200 OK

上面我们看到了响应行的内容,其中HTTP/1.1是协议版本号,200是状态码,OK是状态消息。

3.2响应正文

响应头格式和请求头格式相同,遵循以下格式:

名字:空格 + 值

常用的响应头属性如下:

属性名

作用

Allow

服务器支持哪些请求方法(如GET、POST等)

Date

表示消息发送的时间,时间的描述格式为格林威治时间

Set-Cookie

用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie

Expires

可以理解为过期时间,当到期之后浏览器会从服务器重新获取,放弃本地缓存文档

Content-Type

WEB服务器告诉客户端自己响应的对象的类型和字符集

Content-Encoding

文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间

Content-Length

指明实体正文的长度,以字节方式存储的十进制数字来表示

Location

用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档

Refresh

表示浏览器应该在多少时间之后刷新文档,以秒计

3.3 响应正文

服务器返回的数据。

3.4 状态码

当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码,以表明这一次请求的状态。下面是一些常见的状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:

分类

分类描述

1**

信息,服务器收到请求,需要请求者继续执行操作

2**

成功,操作被成功接收并处理

3**

重定向,需要进一步的操作以完成请求

4**

客户端错误,请求包含语法错误或无法完成请求

5**

服务器错误,服务器在处理请求的过程中发生了错误

以下是详细的状态码列表:

状态码

状态码英文名称

中文描述

100

Continue

继续。客户端应继续其请求

101

Switching Protocols

切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议

200

OK

请求成功。一般用于GET与POST请求

201

Created

已创建。成功请求并创建了新的资源

202

Accepted

已接受。已经接受请求,但未处理完成

203

Non-Authoritative Information

非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本

204

No Content

无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档

205

Reset Content

重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域

206

Partial Content

部分内容。服务器成功处理了部分GET请求

300

Multiple Choices

多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择

301

Moved Permanently

永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替

302

Found

临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI

303

See Other

查看其它地址。与301类似。使用GET和POST请求查看

304

Not Modified

未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源

305

Use Proxy

使用代理。所请求的资源必须通过代理访问

306

Unused

已经被废弃的HTTP状态码

307

Temporary Redirect

临时重定向。与302类似。使用GET请求重定向

400

Bad Request

客户端请求的语法错误,服务器无法理解

401

Unauthorized

请求要求用户的身份认证

402

Payment Required

保留,将来使用

403

Forbidden

服务器理解请求客户端的请求,但是拒绝执行此请求

404

Not Found

服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面

405

Method Not Allowed

客户端请求中的方法被禁止

406

Not Acceptable

服务器无法根据客户端请求的内容特性完成请求

407

Proxy Authentication Required

请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权

408

Request Time-out

服务器等待客户端发送的请求时间过长,超时

409

Conflict

服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突

410

Gone

客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置

411

Length Required

服务器无法处理客户端发送的不带Content-Length的请求信息

412

Precondition Failed

客户端请求信息的先决条件错误

413

Request Entity Too Large

由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息

414

Request-URI Too Large

请求的URI过长(URI通常为网址),服务器无法处理

415

Unsupported Media Type

服务器无法处理请求附带的媒体格式

416

Requested range not satisfiable

客户端请求的范围无效

417

Expectation Failed

服务器无法满足Expect的请求头信息

500

Internal Server Error

服务器内部错误,无法完成请求

501

Not Implemented

服务器不支持请求的功能,无法完成请求

502

Bad Gateway

充当网关或代理的服务器,从远端服务器接收到了一个无效的请求

503

Service Unavailable

由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中

504

Gateway Time-out

充当网关或代理的服务器,未及时从远端服务器获取请求

505

HTTP Version not supported

服务器不支持请求的HTTP协议的版本,无法完成处理

4. URI、URL、URN

4.1 URI、URL、URN的定义

什么是URI?什么是URL?什么又是URN?三个概念中我们接触的最多的就是URL,那URN和URI又是什么东西呢?怎么以前没听过呢?我们来看他们三个的定义:

URI:Uniform Resource Identifier,即统一资源标志符,用来唯一的标识一个资源。

URL:Uniform Resource Locator,统一资源定位符。即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

URN:Uniform Resource Name,统一资源命名。即通过名字来表示资源的。

下面我们重点说一下URL的格式,再来说一下URI、URL、URN的区别:

4.2 URL的格式:

一个完整的URL包含协议名称,主机名称(IP或者域名)、端口号(没写端口号默认 为80端口)、路径、查询字符串和锚这6个部分。比如:

http//www.quanshuwang.com:80/modules/article/search.php?searchkey=abcd&searchtype=1&page=2#top

http是它的协议名称。 www.quanshuwang.com就是它的域名。 /modules/article/search.php是它的路径。 :80是它的端口号,80是http的默认端口号,一般情况下会隐藏的。 searchtype=1&page=2是它的查询字符串。 #top是它的锚点,用来定位的,比如说回到顶部。

4.3 URI,URL,URN之间的关系:

上图中我们可以看到,URL和URN是URI的子集,URI是统一资源标志符,而URL除了有标识的功能之外,还有定位的功能,可以用来描述资源的具体位置,还指明了获取资源所采用的协议。

URN也是URL的一种表现形式,它和URL的区别就是与资源的位置无关,正式由于位置的无关性,被某个URN标识的资源在位置发生变化时,其URI可以保持不变。但是我们在平时的使用中几乎没有用URN的,更多的用的是URL。所以URL和URN都是URI的一种扩展,一种表现形式,URL和URN肯定是一个URI,但是URI不一定是URN或URL。

Cookie有时也用其复数形式 Cookies,英文是饼干的意思。指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookie其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。服务器在接收到Cookie以后,会验证Cookie的信息,以此来辨别用户的身份,当然如果有需求,服务器还可以根据需要对Cookie的内容进行修改。

5.1 Cookie的作用

Cookie其实是HTTP请求头的扩展部分,由于HTTP协议是无状态的协议,所以为了在网页上实现登陆之类的需求,所以扩展了Cookie这样的功能。

每一次HTTP请求在数据交换完毕之后就会关闭连接,所以下一次HTTP请求就无法让服务端得知你和上一次请求的关系。而使用了Cookie之后,你在第一次登陆之类的请求成功之后,服务器会在Response的头信息中给你返回Cookie信息,你下一次访问的时候带上这个Cookie信息,则服务器就能识别你为上一次成功登陆的用户。

5.2 Cookie的内容

  • Cookie一般保存的格式为json格式,由一些属性组成。
  • name:Cookie的名称
  • value:Cookie的值
  • domain:可以使用此Cookie的域名
  • path:可以使用此Cookie的页面路径
  • expires/Max-Age:此Cookie的超时时间
  • secure:设置是否只能通过https来传递此条Cookie

5.3 domain属性

域名一般来说分为顶级域名,二级域名,三级域名等等。

例如baidu.com是一个顶级域名,而www.baidu.com和map.baidu.com就是二级域名,依次类推。

而在我们的Cookie来说,都有一个domain属性,这个属性限制了访问哪些域名时可以使用这一条Cookie。因为每个网站基本上都会分发Cookie,所以domain属性就可以让我们在访问新浪时不会带上百度分发给我们的Cookie

而在同一系的域名中,顶级域名是无法使用其二级域名的Cookie的,也就是说访问baidu.com的时候是不会带上map.baidu.com分发的Cookie的,二级域名之间的Cookie也不可以共享。但访问二级域名时是可以使用顶级域名的Cookie的。

5.4 path属性

path属性为可以访问此cookie的页面路径。比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。

5.5 expires/Max-Age属性

字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。

6. Session

Session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。这个词在各个领域都有在使用。

而我们web领域,一般使用的是其本义,一个浏览器窗口从打开到关闭这个期间

Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发起的所有请求都可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID并且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。

Session与Cookie相反,Session是存储在服务器上的数据,只由客户端传上来的SessionId来进行判定,所以相对于Cookie,Session的安全性更高。

一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。

以上就是HTTP有关的所有内容了,我是Connor,一个从无到有的技术小白,如果觉得我说的有什么不对的地方,欢迎指出!我们下期再见。

本文分享自微信公众号 - magiccodes(xl----0)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菲宇

Django默认权限机制及使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

12330
来自专栏Python绿色通道

实战篇 | 用Python来找你喜欢的妹子(二)

我之前写了一个抓取妹子资料的文章,主要是使用selenium来模拟网页操作,然后使用动态加载,再用xpath来提取网页的资料,但这种方式效率不高。用Python...

9940
来自专栏Alone88

【2019-10-05 更新】Typecho 主题:AL_lolimeow - 基于Wordpress 主题 lolimeow

作者:Alone88 Email:im#alone88.cn (#换成@) Wordpress form 猫可喵

9320
来自专栏python前行者

python中的urlencode与urldecode

原文链接:https://www.cnblogs.com/caicaihong/p/5687522.html

8030
来自专栏Alone88

PHP 解析JSON 并获取对应的值

本文由 Alone88 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为...

9230
来自专栏Lemon黄

Laravel Ignition 功能全解析

来源地址:https://freek.dev/1441-ignition-a-new-error-page-for-laravel

8440
来自专栏码客

富文本AttributedString的总结

AttributedString可以分为NSAttributedString和NSMutableAttributedString两种。 在使用中通过将Attri...

8320
来自专栏PHP专享栏

PHP链接mongodb的方式

MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本...

9030
来自专栏Lemon黄

(续)很久很久以前学的,16个HTML笔记

超链接分为外部链接、内部链接、文本链接、图片链接、下载链接、空链接、电子邮件链接等。

8530
来自专栏码客

CentOS服务器部署(YUM)

2) 下载新的CentOS-Base.repo 到/etc/yum.repos.d/

15830

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励