《图解HTTP》读后总结


6月份开始的一个比赛需要网络方面的知识,但是限于专业和自己的懒惰,自己一直对计算机网络的知识处于一个一知半解的程度,正好掏出买了半年但一直没看的书,从头到尾梳理一遍。顺便下次组会展示的时候科普一下网络的知识。

1.了解Web和网络技术基础

为了了解HTTP,我们有必要事先理解一下TCP/IP协议族。

1.1 网络基础TCP/IP

通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的,而HTTP是它内部的一个集。

计算机和网络设备之间要互相通信,双方就必须基于相同的方法,比如如何探测通信目标,由哪一边先发起通信,使用哪种语言进行通信,都需要事先制定。不同的硬件,操作系统之间的通信,所有的这一切都需要一种规则,我们就讲这些规则称之为协议

将所有与互联网相关联的协议集合起来,总称为TCP/IP

1.1.1 TCP/IP的分层管理

分层的好处:相当于是模块化管理,方便改进和修改

应用层

应用层决定了向用户提供应用服务时通信的活动

顾名思义,实际上就是应用的层面,属于抽象等级最高的一阶。比如FTPDNSSMTP,HTTP等常见的服务。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输

说起来很抽象,实际上就是TCP和UDP,就是制定了在传输数据时,每个计算机应该使用什么样的协议

网络层

网络层处理在网络上流动的数据包。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。

链路层

用来处理网络的硬件部分

这个就相对easy了,可以简单理解为计算机网络在物理的层面。

此外,我个人还对网络层传输层之间的区别不是很清楚,但是看了下面一个例子之后,瞬间明白了

说白了,网络层是负责不同计算机之间的信息传递,而传输层则是细到了进程级别

1.1.2 TCP/IP通信传输流

利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信

发送端在层与层之间传输数据时,都会加上一个本层所属的首部信息。反之,接收端在层与层之间传输数据时,就会消去

1.2 与HTTP关系密切的协议

1.2.1 IP协议

注意!这里的IP指协议,我们平时说的IP是IP地址。

此处IP全称为网络协议,几乎所有使用网络的系统都会用到IP协议。其作用就是把各种数据发给对方。此时,如果想要保证确保数据包能到对方那里,需要满足各种条件,其中最重要的两个是IP地址MAC地址。

IP地址

IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。目前还有些ip代理软件,但大部分都收费。

MAC地址

MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。 [1]
MAC地址是网卡决定的,是固定的。

举一个例子,我们可以把计算机之间的信息传输理解为快递的流程,买方想通过物流将商品交到顾客的手上,这个时候,Ip地址可以理解为顾客的地址,Mac地址可以理解为顾客的身份证号(或者可以理解为任何可以唯一表示顾客的特征,比如外貌+姓名)

为什么在传输过程中我们需要ip和mac两种地址?

1.2.2 TCP协议

tcp处于传输层中,提供可靠的字节流服务。其中可靠是指,能够将数据准确可靠地传给对方,所以相应地,与tcp对应的是udp,它的特点就是不管对方是否能接收到数据,都一股脑地都把数据传过去再说。字节流服务是指,为了方便传输而将大块数据分割成以报文段为单位的数据包进行管理。

tcp的三次握手

tcp协议为什么能够准确无误地将数据传送到目标处?就在于它采用了三次握手的策略

开始之前,首先声明,TCP的两种标志SYN(同步)和ACK(理解)

  1. 发送端发送一个标记syn(记为j)的数据包给对方
  2. 接收端接到以后,再反向发一个syn(j+1)和ack(记为k)标志的数据包给对方
  3. 发送端收到以后,再向接收端发一个ACK(k+1)的数据包给接收端。至此完成3次握手

若是在握手过程中莫名中断,TCP协议会再次以相同的顺序发送相同的数据包

1.2.3 DNS服务

这个相对来说是个老朋友了,它和HTTP一样都是出于四层结构中的应用层,主要功能是提供域名到IP地址之间的转化服务

一般来说,我们在web中想要获取某项资源,都是以域名的形式来访问,这主要是因为相对于IP地址,用字母配合数字的表达形式来指定计算机名更加符合人类的记忆习惯

比如我们想要访问百度,我们在浏览器中输入http://www.baidu.com,这个请求实际上首先是前往了DNS服务器,解析成了对应的IP地址,然后再进入正常的网络通信流程

DNS污染和DNS劫持

DNS污染指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。范例,访问Youtube、Facebook之类网站等出现的状况。

DNS劫持就是指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。

1.3各种协议与HTTP协议的关系

本章最重要的一张图

1.4 URL和URI

1.4.1 两者的区别

uri(统一资源标识符),url(统一资源定位符)。url更为我们所熟知,其正是使用web浏览器来访问页面时需要输入的网页地址。

后者是前者的子集,前者的特点是可以唯一表示一种资源,但其表现形式不局限于后面哪一种,有的时候用前者表示的资源可能在某一命名空间中,但其不代表网络地址

urn:issn:1535-3611

1.4.2 url的结构

2. 简单的HTTP协议

2.1 HTTP协议用于客户端与服务器之间的通信

请求访问文本或者图像等资源的一端称之为客户端

提供资源相应的一端称之为服务器端

2.2 HTTP是不保存状态的协议

HTTP是一种无状态协议,也就是说HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理

这样做有好处即能够快速处理大量事物,确保协议的可伸缩性。但是坏处就是无法保存登录状态(这个用cookie实现了)

2.3 HTTP方法

  1. GET
  2. POST
    (知道上述两者即可,剩下的几乎用不到,需要用到的时候再查)

2.4 持久连接

2.4.1 持久连接的提出

HTTP协议的初始版本中,每进行一次通信就需要断开一次TCP连接

这样做的后果就是,小容量的文本传输倒也没什么,但是随着HTTP的普及,文档中包含大量图片的情况多了起来,这个时候每次请求都会造成无谓的TCP断开和重连,增加通信量的开销

为了解决上述问题,持久连接的方法被踢了出来,它的特点是

只要任意一段没有明确提出断开连接,则保持TCP连接状态

这么做的好处是减少了TCP链接的重复建立和断开的开销,减轻了服务器端的负载。

2.4.2 管线化

持久连接使得多数请求能够以管线化的方式发送成为可能,跟多线程类似,我们不需要一个接一个地等待响应就可以直接发送下一个请求,又一次提高了http通信的效率

2.5 使用cookie的状态管理

http本身是无记忆的,这个时候在处理一些需要登录验证的页面就无法应对,此时我们引入了cookie技术。cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。

服务器端会发送一个set-cookie的首部字段信息,通知客户端保存cookie,等下次客户端再向服务器端发送请求时,其会自动在请求报文中加入cookie值。

这时服务器发现cookie之后,会去检查到底是哪一个客户端发来的请求,然后对比服务器上的记录,最后得到该客户端的登录状态信息。

3. HTTP报文内的HTTP信息

3.1 HTTP报文的结构

emm实际这个部分如果写过爬虫的话应该会很熟悉了

3.2 编码提升传输速率

HTTP在传输数据时可以直接发送原数据,但是也可以在传输过程中通过编码来提升传输速率,但是同时编码的操作在本地完成,需要消耗一定程度的CPU

3.2.1 报文和实体的区别

我个人的感觉是,实体就是原始数据,包括实体首部和实体主体,报文是实体编码之后,在信息传输途中的形式

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

在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。HTTP中存在一种称为传输编码的机制,专门应用于分块传输。

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


我们在平时肯定遇到过这样的情况:使用浏览器下载某项文件,中途中断了,此时再次下载从头开始显然非常可惜,一般情况下如果时间没有过的太久,浏览器会自动帮我们提供从中断处开始下载的功能。

要实现该功能需要指定下载的范围,我们称之为范围请求,我们只需要在head里加入如下

范围的制定方式如下

3.4内容协商

当浏览器的默认语言为中文或者英文时,访问相同url的web网页则会显示对应的英文版或者中文版,这样的机制我们称之为内容协商

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源,其会以语言,字符集,编码方式等为基准来判断响应的资源。同样的我们可以通过修改一些报文的首部来作为请求协商的手段

内容协商分为3类

  1. 服务器驱动协商(即由服务器来决定,但并不一定是最佳选择)
  2. 客户端驱动协商(即由客户端来决定,比如切换成pc版或者移动端)
  3. 透明协商(双方共同协商)

4. 返回结果的HTTP状态码

http服务器端返回的状态码的作用就是,通过它的描述,拥护可以知道服务器端对自己的请求处理的状态

2xx

这个系列的状态码都表示请求被正常处理了

200 OK

表示客户端发来的请求被正常处理了,这种情况一般是最“好”的结果

204 No Content

表示服务器已成功处理请求,但是没有任何实体返回,页面不更新。一般用于客户端单方向向服务器发送信息

206 Partical Content

表示客户端进行了范围请求,而服务器成功执行了这个请求

3xx重定向

这个系列表示浏览器需要执行某些特殊的处理以正常处理请求

301 Moved Permantly

永久性重定向,表示请求的资源已被分配了新的url,以后使用该资源时应该使用现在给的url(以报文首部的location字段里给出来了)

302 Not Found

临时性重定向,希望用户本次能够使用新的url访问

303 See Other

基本功能和302一致。但是明确向用户表示需要用GET方法获得资源

当301,302,303系列状态码发回时,几乎所有的浏览器都会把post改成GET,并且删除报文内的主体,之后请求会自动再次发送。当然这么做是有违标准的,但大家都会这么做

304 Not Modified

表示客户端发送了附带条件的请求,服务器端找到了资源但是并未符合相应的条件

307 Temporary Redirect

临时重定向,与302功能相似

4xx 客户端错误

该系列错误表示客户端是错误发生所在

400 Bad Request

表示请求报文中存在语法错误。当错误发生时,需要修改内容并再次发送请求。

401 Unauthorized

表示需要经过验证,若之前已经验证过了,则表示验证失败

403 Forbidden

表示请求资源的访问被拒接了,服务器可以不给出理由,如果有理由,则可以在实体的主体部分中看到

404 Not Found

服务器上没有请求的资源

5xx服务器错误

表示错误出在服务器上

500 Internet Server Error

表示服务器在执行请求时发生了错误,也有可能时bug或者临时的故障

503 Service Unavilable

表示服务器暂时超负载或者停机维护,无法处理请求

5.与HTTP协作的Web服务器

5.1 用单台虚拟主机实现多个域名

HTPP/1.1允许一台HTTP服务器搭建多个Web站点。比如提供Web托管服务的供应商,可以用一台服务器为多位用户服务

由于DNS的设置,当浏览器中输入不同于域名的时候,最终访问到服务器的可以是相同的ip

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

代理

本质上是一种类似于中转站的方式,接受有客户端发送的请求并转发给服务器端,反之亦然。同时,每次经过一级代理的时候,就会追加Via首部

使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的

缓存代理

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

透明代理

看代理服务器在转发请求或者响应时会不会对报文做加工,如果没有加工则是透明代理,反之为非透明代理

网关

网关的作用机制和代理相似,但是目的不一样

网关的功能是使通信线路上的服务提供非HTTP协议服务。利用网关能提高通信的安全性,因为可以在客户端与网关之间的线路上加密以确保连接的安全。比如网关可以连接数据库等

隧道

隧道不会解析HTTP请求,客户端可以不用在意它的存在,其作用是建立起一条安全的通信线路

5.3 保存资源的缓存

缓存是指代理服务器或者客户端本地磁盘内保存的资源副本。利用缓存能够减少对源服务器的访问,因此就节省了通信流量和通信时间。

6 HTTP首部

HTTP首部字段传递重要信息

6.1 通用首部字段

通用首部字段是指请求报文和响应报文都会采用的首部

cache-control

控制缓存的工作机理,比如是否采用缓存,是否只针对特定用户才使用缓存等,缓存期限等

connection

作用1:控制不再转发给代理的首部字段(即里面是不再转发的首部字段名)

作用2:管理持久连接(指定connection为close,则断开持久连接)

Date

表明HTTP报文创建的日期和时间

Trailer

作用是告知报文主体记录了哪些字段

via

追踪客户端和服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会现在首部字段via中附加该服务器的信息,然后再进行转发

6.2 请求首部字段

accept

告知服务器,用户代理能够处理的媒体类型以及媒体类型的相对优先级

accept-charset

accept-encoding

accept-language

authorization

告知服务器,用户代理的证书(认证信息)

except

告诉服务器,期待出现的某种特定行为(状态码)

host

因为虚拟主机运行在同一个IP上,因此使用host来区分

if-match

称之为条件请求,它会告知服务器匹配资源所用的实体标记(ETag)

if-modified-since

条件请求,它希望从服务器那里获取指定日期之后更新的文件

if-none-match

与if-match正好相反

if-range

if-unmodified-since

max-forwards

指定最多再妆发多少次,当次数为0,则不再转发而是直接给出响应

referer

告知服务器请求的原始资源的url

user-agent

表示浏览器的种类

6.3 响应首部字段

accept-ranges

etags

location

提供重定向的地址(浏览器一般都会尝试对这个地址的访问)

retry-after

6.4 实体首部字段

allow

即允许使用的http方法

content-encoding

conten-type

7. 确保web安全的HTTPS

7.1 http的缺点

7.1.1主要缺点

  • 通信使用明文,内容可能被窃听
  • 不验证通信双方的身份,因此有可能遭遇伪装
  • 无法验证明文的完整性,所以有可能已遭篡改

7.1.2 加密手段

通信的加密

http中没有对通信进行加密的机制,但是我们可以通过和SSL(安全套接层)组合使用,加密http的通信内容

与ssl组合的http称为https

内容的加密

即客户端对http报文进行加密处理再发送请求,但是这样保密性不如前者,仍然有泄密的风险

7.1.3 不验证通信方的身份就可能遭遇伪装

  • 无法验证服务器的真伪
  • 无法验证客户端的真伪
  • 无法确定对方是否具有访问权限
  • 无法判定请求来自何方
  • 即使无意义的请求也会赵丹泉水,无法阻止海量请求下的Dos(拒绝服务攻击)

验证对手的证书

ssl不仅提供加密处理,而且还提供了一种被称为证书的手段,可用于确定通信方。
证书由值得信任的第三方机构颁发,用于证明服务器和客户端是实际存在的,另外伪造证书的技术难度是很大的

7.1.4 无法证明报文完整性,可能已遭篡改

接收到的内容可能有误

由于http协议无法验证报文的完整性,因此没法确认内容有误或者遭篡改(比如MITM中间人攻击)

如何防止篡改

最常用的方法是MD5和SHA-1等散列值校验的方法,以及用数字签名

可惜的是,用这些方法也依然无法保证安全性,因为其本身遭篡改的话,用户还是没法查觉,我们还是必须要用到https

7.2 http+加密+认证+完整性保护 = https

https并非是应用层的一种新协议,只是http通信接口部分用ssl和tls协议代替。通常情况下,http直接与tcp通信,当使用ssl时,则变成先和ssl通信,再有ssl和tcp通信

7.3 https的一些弊病

https也存在一些问题,也就是它的处理速度会变慢。

慢分为两个层面,一个是通信慢,另一种是占用cpu,导致处理速度慢

和使用http相比,网络负载可能会变慢2到100倍

针对速度变慢这个特点,并没有根本性的解决方法,我们会采用ssl加速器(专门针对服务器)这种硬件来改善

所以一般来说,网站里只需要对包含个人信息等敏感数据时采用https加密通信

特别是那些访问量较多的web网站在进行加密处理时,它们所承担的负载不容小觑,并非所有的内容都加密,仅在需要隐藏信息的内容时才进行加密,以节约资源

除此之外,想要节约购买证书的开销也是原因之一

8.确认访问用户身份的验证

8.1 BASIC认证

BASIC认证虽然是采用了Base64编码方式,但这不是加密处理,不需要任何附加信息就可以解码,换而言之,就等于是明文发送密码和账户,如果被人窃听,被盗的几率很高

8.2 DIGEST认证

由于发送给对方的只是由质询码产生的计算结果,所以比起BASIC,其泄露的可能性降低了很多

8.3 SSL客户端认证

一般的机制下,只要账户和密码正确,就可以认证是本人的行为,但如果用户的ID和密码被盗,就有很大的可能被冒充,利用ssl客户端则可以避免该情况的发生

一般来说,ssl客户端认证是证书+密码双重机制来保证安全

8.4 基于表单的认证

由于使用上的便利性以及安全性问题,BASIC和DIGEST认证几乎不怎么使用。另外SSL客户端认证虽然有较高的安全等级,但因为维持费用的问题,还尚未普及。目前web尚多半为各自实现的基于表单的认证方式

9. 基于HTTP的功能追加协议

9.1 消除HTTP瓶颈的SPDY

9.1.1 HTTP的瓶颈

  • 一条连接上只可发送一个请求
  • 请求只能从客户端开始,客户端不可以接受除响应之外的指令
  • 请求/响应首部未经过压缩就发送,首部信息越多延迟越大
  • 发送冗长的首部,每次互相发送相同的首部造成的浪费越大
  • 可任意选择数据压缩格式,非强制压缩放送

9.1.2 SPDY的设计与功能

它并没有完全改写HTTP协议,只是通过新加会话层的形式运作

  • 多路复用流。通过单一的tcp连接,可以无限制地处理多个HTTP请求
  • 赋予请求优先级
  • 压缩http首部
  • 推送功能。支持服务器主动向客户端推送数据的功能
  • 服务器提示功能

9.2 使用浏览器进行全双工通信的WebSocket

9.2.1 功能

  • 推送功能
  • 减少通信量
  • 由于是建立在http基础上的协议,因此连接的发起方仍然是客户端,而一旦建立起WebSocket通信连接,双方都可以直接向对方发送报文

10. Web的攻击技术