http协议续集(二)

网络协议

Posted by Cc1over on August 10, 2018

HTTP续集(二)

前言

补充上一篇笔记的一些常见概念

  • 报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。 报文包含了将要发送的完整的数据信息,其长短很不一致。
  • 实体(entity)作为请求或响应的有效载荷数据(补充项)被传输其内容由实体首部和实体主体组成。

MIME

  • 用于发送多种数据的多部分数据集合,它允许处理文本,图片,视频等多个不同类型的数据。例如,图片等二进制数据以ASCII码字符串编码的方法指明,而在MIME扩展中会使用一种称为多部分集合(Multipart)的方法来容纳不同类型的数据。
  • 浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;因此服务器设置正确以将正确的MIME类型附加到响应对象的头部是非常重要的。
语法特点:
type/subtype

MIME的组成结构非常简单;由类型与子类型两个字符串中间用’/’分隔而组成。并不允许空格存在。type 表示可以被分为复数子类的独立类型。subtype 表示细分后的每个类型。 独立类型

text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/octet-stream

对于text文件类型若没有特定的subtype,就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,即使用 application/octet-stream。

  • text表明文件是普通文本,理论上是可读的语言,典型示例ext/plain, text/html, text/css, text/javascript
  • image表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型,典型示例image/gif, image/png, image/jpeg, image/bmp, image/webp
  • audio表明是某种音频文件,典型示例audio/midiaudio/mpeg, audio/webm, audio/ogg, audio/wav
  • video表明是某种视频文件,典型示例video/webm, video/ogg
  • application表明是某种二进制数据,典型示例application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf,application/json

通信数据转发程序:代理、网关、隧道

HTTP通信时,除客户端和服务器之外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。它们可以配合服务器工作。
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的相应在转发给客户端

代理
  • 是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人“的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的相应并转发给客户端。
  • 代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不会改变请求的URI,会直接发送给前方持有资源的目标服务器。
  • 持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端。 每次通过代理服务器转发请求或响应时,会追加写入Via首部信息
  • 在HTTP通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加Via首部字段以标记处经过的主机信息。
  • 使用代理服务器的理由有:利用缓存技术减少网络宽带的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的等。
  • 代理有多种使用的方式,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文。
缓存代理

代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上。当代理在再次接收到相对资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。

透明代理

转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。反之,对报文内容进行加工的代理被称为非透明代理。

网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的服务器的源服务器一样对请求进行处理。有时客户端可能不会察觉,自己的通信目标是一个网关。

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

隧道时在相隔甚远的客户端和服务器两者之间进行中转,比保持双方通信连接的应用程序。

  • 隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。
    ps:关于SSL:SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。 TLS与SSL在传输层对网络连接进行加密。
  • 隧道的目的是确保客户端能与服务器进行安全的通信。
  • 隧道本身不回去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
  • 通过隧道传输,可以和远距离的服务器安全通信。隧道本身是透明的,客户端不用在意隧道的存在。

保存资源的缓存

  • 指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可以减少对源服务器的访问,因此也就节省了通信流量和通信时间。
  • 缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话说,当代理转发从服务器返回的响应时,代理服务器会保存一份资源的副本。
  • 缓存服务器转发响应时,复制资源后,保存在缓存服务器上,而请求的资源如果已经被缓存则直接由缓存服务器返回给客户端
  • 缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了。

HTTP首部

上一篇也介绍到HTTP首部,这里就做一些小补充

请求报文

一段完整的请求报文如下:

GET /his?wd=&from=pc_web&rf=3&hisdata=&json=1&p=3&sid=20740_20742_1424_18280_20417_17001_15840_11910_20744_20705&csor=0&cb=jQuery110206488567241711853_1469936513370&_=1469936513371 HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
X-Requested-With: XMLHttpRequest
Referer: https://www.baidu.com/
Cookie: BAIDUID=DB24D5F4AB36694CF00C4877ADA56562:FG=1; BIDUPSID=DB24D5F4AB36694CF00C4877ADA56562; PSTM=1469936050; BDRCVFR[gltLrB7qNCt]=mk3SLVN4HKm; BD_CK_SAM=1; H_PS_PSSID=20740_20742_1424_18280_20417_17001_15840_11910_20744_20705; BD_UPN=133252; H_PS_645EC=96a0XJobAseSCdbn9%2FviULLD7KreCHN4V4HzQtcGacKF8tGu13Nzd6j9PoB2SPPVj1d5; BD_HOME=0; __bsi=11860814506529643127_00_0_I_R_25_0303_C02F_N_I_I_0
Connection: keep-alive
响应报文

一段完整的请求报文如下:

HTTP/1.1 200 OK
Server: bfe/1.0.8.14
Date: Sun, 31 Jul 2016 03:41:53 GMT
Content-Type: baiduApp/json; v6.27.2.14; charset=UTF-8
Content-Length: 95
Connection: keep-alive
Cache-Control: private
Expires: Sun, 31 Jul 2016 04:41:53 GMT
Set-Cookie: __bsi=12018325985460509248_00_0_I_R_4_0303_C02F_N_I_I_0; expires=Sun, 31-Jul-16 03:41:58 GMT; domain=www.baidu.com; path=/

结合上面的HTTP报文结构图我们可以知道,两段代码的第一行分别对应请求行和响应行,下面则为首部字段。
通过首部字段的名字我们也可以知道,首部字段起着传递额外信息的重要作用,下面我们来简单补充一下首部字段:

确保Web安全的HTTPS

通过上面的分析,我们了解到HTTP具有相当优秀和方便的一面,然而,HTTP并非只有好的一面,事物皆具两面性,主要存在以下几点不足:

  • 使用明文(不加密),内容可能会被窃听
  • 证通信方的身份,因此有可能遭遇伪装
  • 证明报文的完整性,所以有可能已遭篡改
  • 任何人都可以发起请求
    在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的IP地址和端口号没有被Web服务器设置限制访问的前提下)。 HTTP+加密+认证+完整性保护=HTTPS HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TSL协议代替而已,通常,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS其实就是身披SSL协议这层外壳的HTTP。 当采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。而且SSL协议是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。 在讲解SSL之前我们需要首先了解一下加密方法,加密分为对称加密非对称加密。HTTPS协议则是采用的两者混合的实现方式,为什么要结合两种的实现方式呢?这是因为它们都各自存在自己的优缺点。对于对称加密来说,密钥的传输交换是不安全的,但是效率比较高,而对于非对称加密,是不用担心传输的密钥安全性的问题的,因为我们传递的是公开密钥,任何人都可以获得,但是缺点是效率比较低。对于公钥私钥、数字签名,这个哥们已经总结的相当好了,可以参考一下这篇文章