第一章:了解web及网络基础
1.1 使用HTTP协议方问web
访问web时,有一个客户端请求文件资源、服务端响应请求发送文件资源的过程,这个过程使用到的就是HTTP协议。
1.2 HTTP的诞生
HTTP最开始被设想出来是为了用来共享文档。
为了实现共享文档的设想,定义了:文档标记语言HTML、文档传输的协议HTTP、表示文档资源位置的URL,还诞生了web浏览器、web服务器。
之后,还出现了Apache(现在它是一种web服务器标准)。
目前主流用的HTTP协议版本是1.1,版本2.0尚未普及。
1.3 网络基础TCP/IP
TCP/IP是互联网相关的各类协议族的总称。
这一大堆协议族可分为4层,从上到下分别是,应用层、网络层、传输层、链路层,分层之后,各层只需要管好自己负责的任务,不需要关心整个传输过程。
HTTP协议属于应用层。FTP协议和DNS服务也属于应用层。
TCP协议和UDP协议属于传输层。
IP协议属于网络层。
链路层负责跟硬件打交道。
1.4 与HTTP关系密切的协议:IP、TCP、DNS
简单介绍下几个跟HTTP特别有关的协议:
IP负责找到确切的目的地,根据IP地址,还有与IP地址对应的,几乎不会改变的MAC地址,来找到确切的通信对象。
TCP负责会把应用层要传输的数据切割成一个个数据包,并采用3次握手策略来确认对方是否真的接收到了数据。
DNS服务,负责把主机名或者域名对应成IP地址。
1.5 URI和URL
URI是资源定位标识符,表示通过某协议访问资源的时候,资源的定位标识。
URL是表示资源在互联网上所处的位置。所以URL是URI的子集。
(还是没大看懂这个定义,先搁置)
书中HTTP相关内容会按RFC标准来介绍,但现实中,也有些web服务器和客户端就没完全按RFC标准来实现,所以可能会有些实际情况跟RFC上说的不一样。
第二章
本章简单介绍一下HTTP协议1.1版本的内容。
2.1 HTTP协议用于客户端和服务端之间的通信
应用HTTP协议时,必定分为客户端和服务端,两台计算机的角色可以呼唤,但对于一条通信线路来说,必定一端是服务端另一端是客户端。
2.2 通过请求和响应的交换达成通信
HTTP协议规定,通信只能从客户端开始建立,由客户端先发请求。
请求报文的构成:请求方法、请求URI、协议版本、首部字段(可选)、内容实体
响应报文的构成:协议版本、响应状态码和其原因短语(如200 OK、404 NOT FOUND这种)、首部字段(可选)、内容实体
2.3 HTTP是不保存状态的协议
HTTP协议不对请求和响应之间的通信状态进行保存,这是为了更快第处理大量事务、确保协议的可伸缩性,特意把HTTP协议设计成如此简单的。
但是这样不能满足稍微复杂一点的场景需求,所以引入了Cookie技术,有了Cookie,就能实现状态的保存。
2.4 请求URI定位资源
HTTP协议用URI来定位互联网上的资源,在请求报文里就有指定URI。报文里填写的URI可以是完整的URI,也可以是相对HOST的相对URI。此外,如果客户端想对服务端本身发起请求,而不是想访问资源,可以把URI填写成一个*号。
2.5 HTTP方法
GET:用来访问资源。指定的资源经服务器端解析后返回响应内容。
POST:用于传输实体主体,客户端一般用POST方法向服务端传输实体主体,虽然GET也可以传输,但是POST更专门用来做这个事。得到的响应是服务端接收了传输数据之后的处理结果。
PUT:用于客户端向服务端上传文件。一般的web网站不使用这个方法,因为存在安全问题。
HEAD:获得报文首部,用于确认URI的有效性及资源更新的日期时间
DELETE:用于删除文件,与PUT方法一样存在安全问题,一般网站不用。
OPTIONS:用来查询指定URI支持哪些方法。
TRACE:让web服务端将之前的请求通信返回给客户端,用来追踪一条请求从客户端到目标服务器(可能经历多次中转)经历的改变。但是这个方法容易遭到攻击所以也很少用。
CONNECT:要求与代理服务器通信时建立隧道,主要是用SSL和TLS协议把通信内容加密后经网络隧道传输。
2.6 持久连接节省通信量
HTTP最早的版本是每进行一次通信,都要断开一次TCP连接,如果一个客户端需要访问很多资源,比如说访问一个web页面里的多个图片资源,就要多次建立TCP连接、多次断开。
为了节省开销,HTTP1.1版本提出了持久连接,就是HTTP keep-alive,只要任意一端没有提出断开,就保持TCP连接状态。
在持久连接的基础上,请求可以以管线化方式发送,也就是不必等待上一个请求结束再发下一个请求,而是同时发送多个请求。
2.7 使用Cookie进行状态管理
服务端的响应报文内,首部字段可以增加Set-Cookie,向客户端存储信息。之后客户端会在请求报文里带上Cookie。
第三章 HTTP报文内的HTTP信息
3.1 HTTP报文
HTTP报文是由多行数据构成的字符串文本。报文可以分成报文首部和报文主体,其中报文主体可以没有。
3.2 报文结构
请求报文的首部:请求行(请求的方法、URI、HTTP协议版本号)、请求首部字段、通用首部字段、实体首部字段、其它
响应报文的首部:状态行(响应结果的状态码、原因短语、HTTP协议版本号)、响应首部字段、通用首部字段、实体首部字段、其它
3.3 编码提升传输速率
HTTP在传输数据时,可以通过编码提升传输速率
报文主体和实体主体的区别:报文主体是HTTP中的基本单位,由8位组字节流组成,通过HTTP通信传输。实体主体是传输的有效载荷,如果它不经过编码,就跟报文主体相等同,如果传输中经过了编码,实体主体就跟报文主体有区别。
HTTP协议中有一种被称作内容编码的功能,内容编码指定实体被编码的方式,然后就能把实体压缩,客户端接收到实体,然后对它进行解码。
常用的内容编码有gzip、compress、identity(不进行编码)等
为了大容量数据可以逐块加载,可以使用分块传输编码,把实体主体分块传输。
3.4 发送多种数据的多部分对象集合
HTTP采用了MIME标准,允许一份报文主体内可包含多种类型实体
当字段Content-Type为multipart/form-data时,或为multipart/byteranges时,报文主体内就可包含多类型实体。
3.5 获取部分内容的范围请求
在带宽不够的情况下,下载一个大文件需要较长时间,如果下载中网络中断,下次又要从头开始,为了接近这个问题,HTTP允许范围请求,即允许请求一个资源的第x字节到第y字节内容。
执行范围请求时,请求报文的首部会有Range字段,如:Range: bytes=5001-10000
表示请求该资源的第5001字节到第10000字节。
针对范围请求,服务端会返回状态码206,返回响应的内容。如果服务端不能响应范围请求,则会返回状态码200并把整个文件都返回去。
3.6 内容协商
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最合适的资源,当请求报文首部包含对语言、字符集、编码方式等要求时(如Accept、Accept-Charset、Accept-Language、Content-Language这些字段),就是在与服务端进行内容协商。
内容协商有3种形式:服务器驱动协商、客户端驱动协商、透明协商(前两种方式结合)