本文共 9167 字,大约阅读时间需要 30 分钟。
转自:http://www.akathink.com/2016/07/28/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82HTTP%E5%8D%8F%E8%AE%AE/
在做网络编程(无论传统的Web开发,还是当前比较流行的的移动开发)的时候,我们用到最多的网络传输协议,可能就是HTTP协议了。作为开发者的我们可能更多的也只是去关注哪个第三方类库传输效率更高,哪个库使用最为方便,或者是哪个类库更为易于维护,但是,作为想要长期在该专业道路上行走的我们,仅仅学会使用这些类库的招式显然是不够的,我们还要了解其精髓,去分析源码,看看到底是如何实现的,那么问题来了,如果我们不懂HTTP协议的基础及核心内容,我们又该如何去分析那些源代码呢?无论哪个类库,最终的实现机制都是建立在对HTTP协议熟练掌握的基础上的。那么,让我们一起去彻底征服HTTP协议吧。
在了解之前,我先提几个问题,方便下面分析的时候,能够更好的去理解HTTP协议。
为了更好的理解HTTP协议,我们先简单的了解一下TCP/IP协议族。通常我们所使用的网络都是在TCP/IP协议族的基础上运作的,HTTP也不例外。
客户端与服务器端进行相互通信,双方必须遵循相同的规则,比如:
而这一切都需要一种特定的规则来约束,我们称该规则为协议。
TCP/IP协议族最重要的一个特性就是分层。TCP/IP协议族按层次分别分为以下四层:应用层、传输层、网络层和数据链路层(OSI参考模型分为七层)。
按层次分,IP位于网络层;
IP协议的作用是把各种数据包传送给对方,而要确保传送到对方那里,则需要满足各类条件,其中两个重要的条件是IP地址和MAC地址; IP间的通信依赖MAC地址,采用ARP协议凭借MAC地址进行通信。
按层次分,TCP位于传输层,提供可靠的字节流服务
所谓字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。 一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据是否送达到对方。
DNS同HTTP协议一样位于应用层,提供域名到IP地址之间的解析服务。
HTTP在发送请求时,如果请求的地址写的是域名,则先访问DNS服务器获取目标服务器的IP地址,然后生成HTTP请求报文,发送给TCP层,按照TCP/IP通信传输流传输给目标服务器。
综上:URI就是由某个协议方案表示的资源的定位标识符。
为了解决上述TCP连接的问题,HTTP想出了持久连接(HTTP keep-alive)的方法。持久连接的特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
管线化 持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需要等待并收到响应后,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求,这样就能够同时并行发送多个请求,而不需要一个接一个地等待响应了。HTTP是无状态协议,不对之前发送的请求和响应的状态进行管理。不可否认无状态协议当然也有它自己的优点。由于不保存状态,自然可减少服务器的CPU及内存资源的消耗。保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
用于HTTP协议交互的信息被称为HTTP报文,客户端请求的报文称之为请求报文,服务端响应的报文称之为响应报文。HTTP报文大致可以分为报文首部和报文主体两部分。二者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。下面来看一下请求报文和响应报文的结构图:
在实现断点续传的功能的时候,就需要使用范围请求这个字段了。eg.Range: byte = 5001 - 10000
一台Web服务器可搭建多个独立域名的Web网站,也可作为通信路径上的中转服务器提升传输效率。如果我们在一台服务器上托管了两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名,因此必须在Host首部内完整指定主机名或域名的URI。
HTTP通信时,除客户端和服务器以外,还有一些用于通信数据转发的 应用程序和服务器,例如代理、网关和隧道,它们可以配合服务器工作。这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收服务器返回的响应并转发给客户端。
代理: 是一种有转发功能的应用程序
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接转发给前方持有资源的目标服务器。 使用代理服务器的理由:利用缓存技术减少网络带宽的流量。 代理有多种使用方法,按两种基准分类。一类是 是否使用缓存 ,另一种是 是否会修改报文 。 缓存代理:代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上,下次请求相同的资源时,则将之前缓存的资源作为响应返回。 透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理,否则称为非透明代理。网关: 是转发其他服务器通信数据的服务器
利用网关可以由HTTP请求转化为其他协议通信。 网关的工作机制和代理十分相似,而网关能使通信线路上的服务器提供非HTTP协议服务。我们首先来看一下请求报文和响应报文到底长什么模样,下面的示例代码是通过Firefox插件Firebug来抓去的百度页面首部信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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报文结构图我们可以知道,两段代码的第一行分别对应请求行和响应行,下面则为首部字段。
通过首部字段的名字我们也可以知道,首部字段起着传递额外信息的重要作用,下面我们来简单了解一下HTTP首部字段:通过上面的分析,我们了解到HTTP具有相当优秀和方便的一面,然而,HTTP并非只有好的一面,事物皆具两面性,主要存在以下几点不足:
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协议则是采用的两者混合的实现方式,为什么要结合两种的实现方式呢?这是因为它们都各自存在自己的优缺点。对于对称加密来说,密钥的传输交换是不安全的,但是效率比较高,而对于非对称加密,是不用担心传输的密钥安全性的问题的,因为我们传递的是公开密钥,任何人都可以获得,但是缺点是效率比较低。对于公钥私钥、数字签名,这个哥们已经总结的相当好了,可以参考一下这篇。
何为认证?简单来说就是证明你是你自己!核对的信息通常有密码、动态令牌、数字证书、生物认证、IC卡等信息。
HTTP/1.1使用的认证方式如下:待续…
下面将会整体做个总结,完整的说明HTTP的工作机制。本文是在阅读《图解HTTP》一书的基础上并同时参考一些优秀文章之后进行总结的,不仅整体认识了HTTP,也方便下次复习的时候,能够用更短的时间去理解这些虽然基础但是却很重要的知识。
转载地址:http://uwhji.baihongyu.com/