《图解HTTP》阅读笔记(上)

406 阅读9分钟

《图解HTTP》是一本关于http协议方面的内容详实易懂的书籍,全书共十一章。本系列文章按章节对本书做一个学习记录,分上下两个部分。上篇主要讲解http相关的内容,包括历史、http方法、协议格式、报文结构、首部字段、状态码等相关内容,下篇主要是Web安全相关的内容。

第1章 了解web及网络基础

HTTP(HyperText Transfer Protocol)是一种超文本传输协议。传输协议我们好理解,那何为超文本?多文档之间相互关联,就形成了超文本。HTTP就是作为web文档传输协议存在的,出现的主要目的是为了解决文本传输的难题。

#网络基础TCP/IP

TCP/IP是HTTP内部的一个子集,通常使用的网络是在TCP/IP协议的基础上运作的。 TCP/IP协议族非常重要的一点就是分层,也就是经典的五层模型:应用层、传输层、网络层、数据链路层和物理层。 通过一个流程就可以大致搞明白各个层的作用: 首先,作为发送端的客户端在应用层(HTTP协议)发出一个想看某个web页面的http请求。接着,为了传输方便,在传输层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。接收端的服务器,在链路层接收到数据,按顺序往上层发送,一直到应用层。 发送端在层与层之间传输数据的时候,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部去掉。

#三次握手

TCP位于传输层,提供字节流服务,所谓字节流服务,就是为了传输方便,将大块数据分割成以报文字段为单位的数据包进行管理。 为了准确无误的将数据送达目的地,TCP协议采用了三次握手(three-way handshaking)策略。握手过程中,使用了TCP的标志:SYN(synchronize)和ACK(acknowledgement)。 发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以表示传达确认信息。最后,发送端再回传一个带有ACK标志的数据包,代表握手结束。

#URI和URL

URI(Uniform Resource Identifier)指统一资源标识符,其实就是用字符串标识某一互联网资源。它是由某个具体的协议方案所表示的,协议方案有:http,ftp,mailto,telnet,file等。 URL(Uniform Resource Locator)表示资源的地点(互联网上所处的位置),是URI的子集。

第2章 简单的HTTP协议

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。 请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。 响应报文由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体构成。 HTTP是一种不保存状态,即无状态的协议。也就是说HTTP不会对之前的请求或者响应的状态进行记录和管理。因此才引入Cookie技术解决无状态的问题。

#持久连接

HTTP的初始版本中,每进行一次HTTP通信,就要断开一次TCP连接。下一次HTTP通信,需要重新进行三次握手建立TCP连接,通信开销极大。 因此,HTTP1.1提出了持久连接的方法,只要客户端或者服务器端任意一端没有明确提出断开连接,则保持TCP连接状态。 而且,持久连接使得多数请求可以并行发送,而不需要等到上一个请求响应之后,才能发送下一个请求。

第3章 HTPP报文内的HTTP信息

#HTTP报文

用于HTTP协议交互的信息被称为HTTP报文,HTTP报文本身是由多行数据构成的字符串文本,大致可分为报文首部和报文主体两块。 HTTP的报文主体用于传输请求,或者响应的实体主体。通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容发送变化,才导致它和报文主体产生差异。

#编码

HTTP在传输数据的时候,可以按照数据原样直接传输,也可以在传输过程中通过编码提升传输效率。 内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。 常用的内容编码有: gzip,compress,deflate,identity。

第4章 返回结果的HTTP状态码

状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果。我们需要了解一些常见的状态码。 200 OK:表示从客户端发来的请求在服务器被正常处理了 301:永久性重定向。表示请求的资源已被分配到了新的URI,以后应使用资源现在所在的URI 302:临时性重定向。资源已被分配到了新的URI,希望本次能使用新的URI访问。 304:Not Modified,服务器资源未改变,可直接使用客户端未过期的缓存。 404:表示服务器上无法找到请求的资源。 500:该状态码表示服务器在执行请求时发生了错误。

第5章 与HTTP协作的web服务器

一台HTTP服务器利用虚拟主机,可以搭建多个web站点。

#代理

代理是具有转发功能的应用程序,它接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。 使用代理服务器的理由有:1.利用缓存技术减少网络带宽;2.组织内部针对特定网站的访问控制;3.获取访问日志,等。 代理转发服务器的响应时,缓存代理会预先将资源的副本保存在代理服务器上,当代理再次接收到对相同资源的请求时,就可以不从源服务器获取资源而直接返回之前缓存的资源。

#网关

网关能够使通信线路上的服务器提供非http协议服务。利用网关可以提高通信的安全性。

#隧道

隧道的目的是确保客户端能与服务器进行安全的通信,可以使用SSL等加密手段进行通信。

第6章 HTTP首部

HTTP协议的请求和响应报文中必须包含HTTP首部。
在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
在响应中,HTTP报文由HTTP版本、状态码、HTTP首部字段3部分构成。

#HTTP首部字段

在众多报文字段中,HTTP首部字段包含的信息最多,HTTP首部字段是由首部字段名和字段值构成的,中间用冒号分隔,多个值用逗号隔开:
首部字段名: 字段值1,字段值2,字段值3
HTTP首部字段根据实际用途被分为4种类型:
1.通用首部字段
通用首部字段是指请求报文和响应报文都会使用的首部。
Cache-Control: no-chache // 强制向源服务器再次认证
Cache-Control: no-store // 不缓存请求或响应的任何内容
Cache-Control: max-age = [秒] // 响应的最大Age值
Connection: close // 断开连接
Connection: Keep-Alive // 持久连接
Date: Tue,03 Jul 2018 // 创建HTTP报文的时间和日期
2.请求首部字段
Accept: text/html // 可以通知服务器用户代理能够处理的媒体类型及媒体类型的优先级
Accept-Charset:unicode-1-1 // 通知服务器用户代理支持的字符集以及字符集的优先级
Accept-Encoding: gzip, deflate // 通知服务器用户代理支持的内容编码
Accept-Language: zh-cn,zh // 用户代理能够处理的自然语言集
Host: www.baidu.com // 请求资源所处的互联网主机名和端口号,唯一必要的请求首部字段
If-Match: '123abc' // 服务器会对比If-Match的字段值和资源的ETag(实体标记)值,两者一致时才会执行请求
If-Modified-Since: // 该字段指定的日期后,服务器资源发生了更新,服务器会接受请求,如果请求的资源都没有更新过,则返回状态码304 Not Modified
User-Agent: // 将创建请求的浏览器和用户代理名称等信息传给服务器
3.响应首部字段
Accept-Ranges:bytes/none // 告知客户端服务器是否能处理范围请求
Age: 600 // 告知客户端源服务器在多久前创建了响应
ETag: 'abc-123' // 服务器会为每份资源分配对应的ETag值,当资源更新时,ETag值也会更新。ETag有强ETag和弱ETag之分,强ETag不论实体发生多么细微的改变都会改变其值;弱ETag只用于提示资源是否相同,只有资源发生了根本改变才会更改ETag值
Location: // Location可以将响应接收方引导至某个与请求URI位置不同的资源,几乎所有浏览器接收到包含Location的响应后,都会强制性尝试访问重定向的资源
4.实体首部字段
Allow: GET,HEAD // 通知客户端能够支持的所有HTTP方法
Content-Encoding: gzip // 告知客户端服务器对实体主体的编码方式(压缩)
Content-Language: zh-CN // 告知客户端实体主体使用的自然语言
Content-Length: 15000 // 表示实体主体部分的大小(单位是字节)
Expires: Date() // 告知客户端资源实效的日期,优先级小于max-age
Last-Modified: Date() // 指明资源最终修改的时间

#为Cookie服务的首部字段

响应首部字段Set-Cookie
Set-Cookie: name=jack // 赋予cookie名称和值
Set-Cookie: expires=DATE // cookie的有效期
Set-Cookie: domain=域名 // 指定domain后可以在主域名与二级域名之间共享cookie
Set-Cookie: Secure // 仅在HTTPS安全通信时才发送cookie
Set-Cookie: HttpOnly // 限制JavaScript脚本访问cookie