互联网科技基础原理

图解HTTP后的一些总结

2018-11-09  本文已影响2人  Aaron96

HTTP 图解笔记

一 .简单了解

1.1HTTP背景

1.1.1 HTTP的诞生

1989 年 3 月,互联网还只属于少数人。在这一互联网的黎明期, HTTP 诞生了。

CERN(欧洲核子研究组织)的蒂姆 • 伯纳斯 - 李(Tim BernersLee) 博士提出了一种能让远隔两地的研究者们共享知识的设想。
最初设想的基本理念是:借助多文档之间相互关联形成的超文本 (HyperText),连成可相互参阅的 WWW(World Wide Web,万维 网)。
现在已提出了 3 项 WWW 构建技术,分别是:把 SGML(Standard Generalized Markup Language,标准通用标记语言)作为页面的文本标 记语言的 HTML(HyperText Markup Language,超文本标记语言); 作为文档传递协议的 HTTP ;指定文档所在地址的 URL(Uniform Resource Locator,统一资源定位符)。

1.1.2 HTTP的版本信息

1.2 网络的基础TCP/IP

  要想要了解HTTP,首先需要了解TCP/IP协议族。通常我们使用的网络是在TCP/IP协议族的基础上运作的,而HTTP只是其内部子集。

1.2.1 何为协议

  计算机与网络设备要相互通信,双方就必须基于相同的方法。比如, 如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通 信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之 间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为 协议(protocol)。
TCP/IP是互联网相关的各类协议族的总称

1.2.1 TCP/IP的分成管理

TCP/IP协议族按层次分别分为以下4层:应用层,传输层,网络层和数据链路层。将各个层次分开后,当某个地方需要修改时,不需要整体都替换掉,只需要把变动的层次替换即可。
各层次功能作用如下:

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该 层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层 时会把对应的首部消去。
这种把数据信息包装起来的做法称为封装(encapsulate)。

1.3 HTTP密切相关的协议:IP、TCP和DNS

1.3.1 负责传输的IP协议

  IP(Internet Protocol)网际协议位于网络层,几乎所有使用网络的系统都会使用到IP协议。在TCP/IP协议族中IP就指的是网际协议。需要注意的是:IP协议与IP地址并非同一种东西
  IP协议的作用是把各种数据包传输给对方,然而,需要保证确实传送到对方那里,这需要满足各类条件。在这其中,最重要的两个条件莫过于IP地址与MAC地址(Media Access Control Address)。IP地址指明了节点被分配到的地址,MAC地址则是网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但是MAC地址基本上不会更改。传输过程如下:

IP 间的通信依赖 MAC 地址。在网络上,通信的双方在同一局域网 (LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转 才能连接到对方。而在进行中转时,会利用下一站中转设备的 MAC 地址来搜索下一个中转目标。这时,会采用 ARP 协议(Address Resolution Protocol)。ARP 是一种用以解析地址的协议,根据通信方 的 IP 地址就可以反查出对应的 MAC 地址。

1.3.2 确保可靠性的TCP协议

  I按层次划分,TCP属于传输层,提供可靠的字节流服务。

发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后, 回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发 送端再回传一个带 ACK 标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发 送相同的数据包
当然,除了三次握的协议,TCP协议同时还有其他的各种手段来保证通信的可靠性。

1.3.2 负责域名解析的DNS服务

  DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。一张图了解DNS解析:



再知道以上协议后,总结一下:

1.4 URL与URI

表示指定的 URI,要使用涵盖全部必要信息的绝对 URI、绝对 URL 以 及相对 URL。相对 URL,是指从浏览器中基本 URI 处指定的 URL, 形如 /image/logo.gif。
让我们先来了解一下绝对 URI 的格式。


在上面图片中,登录信息(认证)意思为:指定用户名和密码作为服务器端获取资源时必要的登录信息。所以此项为可选项。

二.简单的HTTP协议

在使用HTTP协议时,必有一端为客户端一端为服务器端,请求必定由客户端发出,服务器端进行回复相应。

2.1 客户端与服务器端之间的通信

2.1.1 客户端请求

首先展示一个基本的请求示例:

    GET /index.htm HTTP/1.1
    Host:hackr.jp

分析一波:

首行GET表示请求访问服务器的类型,统称为方法(method),随后的/index.html指明了请求访问的资源对象,也叫作请求URL(request=URL)。最后的HTTP/1.1 即为使用的HTTP版本

再来看一个POST请求的示例:

    POST /form/entry  HTTP/1.1
    Host:hackr.jp
    Connection:keep-alive
    Content-Type:application/x-www-form-urlencoded
    Content_Length:16
    name=ueno&age=37

分析一波:

前一行同如上分析,中间四行为请你去的首部字段(以后会讲到),最后一行为post请求的内容实体。

2.1.1 服务器端返回

先看一个例子:

    HTTP/1.1 200 OK
    Date Tue,10 Jul 2018 06:50:15 GMT
    Content-Length:362
    Content-Type: text/html
    
    <html>
    //.......

解释:

在起始行开头的 HTTP/1.1 表示服务器对应的 HTTP 版本。
紧挨着的 200 OK 表示请求的处理结果的状态码(status code)和原因 短语(reason-phrase)。下一行显示了创建响应的日期时间,是首部 字段(header field)内的一个属性。
接着以一空行分隔,之后的内容称为资源实体的主体(entity body)。

2.2 HTTP是不保存状态的协议

HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自 身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个 级别,协议对于发送过的请求或响应都不做持久化处理。
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于 是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管 理状态了。有关 Cookie 的详细内容稍后讲解。

2.3 告知服务器意图的HTTP方法

在以往的版本中,还存在着LINK和UNLINK两种方法,分别作用于建立和资源之间的联系与断开连接关系,但是在HTTP/1.1中被废弃,不再支持,所以不讨论。

2.4 持久连接与管线化

在传统的HTTP协议中,每进行一次HTTP通信就要断开一次TCP连接,当一个页面有大量请求时,每一次请求都会造成无谓的TCP连接的建立与断开,增加了通信的开销。
为了解决这个问题,在HTTP/1.1和一部分的HTTP/1.0想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。其特点为,只要任意一端没有明确提出断开连接,则保持TCP连接状态。


当解决持久连接问题后,人们发现,以前发送请求后需要等待并收到相应才能发送下一个请求,但当持久连接出现后,使得管线化成为了可能,不用等待响应即可发送下一个请求。


三.HTTP报文内的HTTP信息

用户HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。

3.1 编码提升传输速率

3.1.1 报文主体和实体主体的差异

在提及编码之前,需要先理解报文主题和实体主题之间的差距

HTTP 报文的主体用于传输请求或响应的实体主体。
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体 主体的内容发生变化,才导致它和报文主体产生差异。 报文和实体这两个术语在之后会经常出现,请事先理解两者的差异。

3.1.2 压缩传输的内容编码

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码有以下几种:

  1. gzip (GNU zip)
  2. conpress (UNIX 系统的标准亚索)
  3. deflate (zlib)
  4. identity(不进行编码)

3.1.3 分割发送的分块传输编码

  在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器是无法显示页面的。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)
  分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六 进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标 记。

3.2 发送多种数据的多部分对象集合

HTTP 协议中也采纳了多部分对象集合,发送的一份报文主 体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
多部分对象集合包含的对象如下。

    Content-Type: multipart/form-data; boundary=AaB03x 
    --AaB03x 
    Content-Disposition: form-data; name="field1"
    Joe Blow 
    --AaB03x 
    Content-Disposition: form-data; name="pics"; filename="file1.txt" Content-Type: text/plain
    ...(file1.txt的数据)... 
    --AaB03x--
    HTTP/1.1 206 Partial Content 
    Date: Fri, 13 Jul 2012 02:45:26 GMT 
    Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT 
    Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
    
    --THIS_STRING_SEPARATES
    Content-Type: application/pdf 
    Content-Range: bytes 500-999/8000
    ...(范围指定的数据)... 
    --THIS_STRING_SEPARATES 
    Content-Type: application/pdf 
    Content-Range: bytes 7000-7999/8000

    ...(范围指定的数据)... 
    --THIS_STRING_SEPARATES--

在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上 Content-type。有关这个首部字段,我们稍后讲解。
使用 boundary 字符串来划分多部分对象集合指明的各类实体。在 boundary 字符串指定的各个实体的起始行之前插入“--”标记(例如:-AaB03x、--THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“--”标记(例如:--AaB03x--、-THIS_STRING_SEPARATES--)作为结束。

3.2 获取部分内容的范围请求

在原来,下载一样文件的过程中,如果出现网络错误导致下载失败,往往需要重头开始。为了解决这个问题,需要一种可恢复的机制。所谓恢复值得能从之前下载中断处恢复下载。如图:


执行范围请求时,会用到首部字段Range来指定资源的byte范围。byte范围的指定形式如下:

    Range:byte=5001-10000
    Range:byte=5001-
    Range:byte=-3000,5000~7000

四.返回结果的HTTP状态码

状态码的类别:

状态码 类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 所需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出现错误

4.1 2XX成功

200 OK

表示从客户端发来的请求在发服务器端被正常处理了。

204 NO Content

该状态码代表服务器接受的请求已成功处理,但在返回的响应报文中不含实体的主体部分,另外也不允许返回任何实体的主体。

206 Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

4.2 3XX 重定向

3XX响应结果表明浏览器需要自行某些特殊的处理以正确处理请求。

301 Moved Permanently

永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。

302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望 用户(本次)能使用新的 URI 访问。

303 See Other

该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。

当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次 发送。
301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使 用时大家都会这么做。

304 Not Modified

该状态码表示客户端发送附带条件的请求时,服务器端允许请求访 问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应 的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关 系。

附带条件的请求是指采用 GET 方法的请求报文中包含 If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。

307 Temporary Redirect

临时重定向。该状态码与 302 Found 有着相同的含义。尽管 302 标准禁止 POST 变换成 GET,但实际使用时大家并不遵守。
307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理响 应时的行为,每种浏览器有可能出现不同的情况。

4.3 4XX 客户端错误

4XX 的响应结果表明客户端是发生错误的原因所在。

400 Bad Request

该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求 的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态 码。

401 Unauthorized

该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用户认证失败。
返回含有 401 的响应必须包含一个适用于被请求资源的 WWWAuthenticate 首部用以质询(challenge)用户信息。当浏览器初次接收 到 401 响应,会弹出认证用的对话窗口。

403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要 给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。

404 Not Found

该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

4.4 5XX 服务器错误

5XX 的响应结果表明服务器本身发生错误。

500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。

503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法 处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端。

五. 与HTTP协作的Web服务器

代理

代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务 器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务 器。
在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会 经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加 Via 首部字段以标记出经过的主机信息。


使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽 的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要 目的,等等。
代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一 种是是否会修改报文。

网关


png)

网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提 供非 HTTP 协议服务。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信 线路上加密以确保连接的安全。比如,网关可以连接数据库,使用 SQL 语句查询数据。另外,在 Web 购物网站上进行信用卡结算时, 网关可以和信用卡结算系统联动。

隧道

隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等 加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的 通信。
隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之 后的服务器。隧道会在通信双方断开连接时结束。


六. HTTP首部

HTTP 首部字段根据实际用途被分为以下 4 种类型:

6.1 首部字段一览

通用首部字段

请求首部字段

响应首部字段

实体首部字段

七. HTTPS

传统HTTP的缺点

HTTP+加密+认证+完整性保护=HTTPS

需要注意的是,HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。可以说HTTPS是身披SSL外壳的HTTP。通常HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信。
当使用了SSL后,HTTP就拥有了HTTPS的加密,证书和完整性保护这些功能。

加密技术

SSL 采用一种 叫做公开密钥加密(Public-key cryptography)的加密处理方式。近代的加密方法中加密算法是公开的,而密钥却是保密的。通过这种 方式得以保持加密方法的安全性。
加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说, 任何人只要持有密钥就能解密了。加密和解密同用一个密钥的方式称为共享密钥加密(Common key crypto system),也被叫做对称密钥加密。如果密钥被攻击者获得,那加密也 就失去了意义。所以如何传递密钥则很重要。

解决传递密钥的问题

证明公开密钥正确性的证书

遗憾的是,公开密钥加密方式还是存在一些问题的。那就是无法证明 公开密钥本身就是货真价实的公开密钥。为了解决上述问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。

上一篇 下一篇

猜你喜欢

热点阅读